问题:如何判断一个字符集是否采用前缀码

【重要】前缀码:任何一个字符的编码都不是同一个字符集中另一个字符的编码的前缀

对于给出的一个字符集,请判断这个字符集是否是前缀码;

Input Specification:

输入包含若干行测试数据。每组数据的第一行给出正整数N 为该字符集的字符个数 和MAXbit 为该编码最多位数 随后给出N行 每行为该字符集每个字符的二进制编码

Output Specification:

如果该字符集是前缀码,输出"Yes" 否则输出"No"

Sample Input 1:

5 3
00
01
10
110
111

Sample Output 1:

Yes

Sample Input 2:

8 4
00
010
0110
0111
10
11
1110
111
  • 思路:根据给出的字符集来栽树,每个字符的每位二进制为一个结点,最后一个二进制为叶结点,作一个标记Sign,如果另一个字符的编码经过有标志的结点,则说明不是前缀码;

  • 如果将权重值赋给标记,配合strlen 还可以求出权路径长度(WPL)= Sign*strlen(Bit)

/* 结构和函数设计 */

#include <stdio.h>
#include <stdlib.h>                    typedef struct _Node Tree; //个人习惯指针带* struct _Node{int Sign; //将每个字符编码的最后一个结点 Sign=1 标记为叶结点,如果有其他编码经过 则不是前缀码  Tree* Left;Tree* Right; //二进制0 为有左树  1 为有右树
};Tree* MakeTree( int N,int MAXbit,int* P );Tree* NewNode( );Tree* Insert(Tree* Temp,char bit,int* P );void FreeTree( Tree* BT );

/* 程序主框架 */

int main()
{//根据IsPrefixCode的值判断是否为前缀码;int N,MAXbit,IsPrefixCode = 1; scanf("%d %d",&N,&MAXbit);//根据N行 最多MAXbit位 的二进制 来栽树;并带出IsPrefixCode的值;Tree* BT = MakeTree( N,MAXbit,&IsPrefixCode ); if(IsPrefixCode){printf("Yes\n");}else{printf("No\n");}FreeTree( BT );return 0;
}
  • 栽树函数  P是 变量 IsPrefixCode 的地址

Tree* MakeTree( int N,int MAXbit,int* P )
{Tree* BT = NewNode( );char Bit[MAXbit+1];  //数组表示字符串 记得多一位放'\0'哦Tree* Temp;while(N--){scanf("%s",Bit);Temp = BT;for(int i=0;Bit[i] != '\0';i++){Temp = Insert( Temp,Bit[i],P );}/*这里也可以求字符串长度 strlen(Bit)来作循环for(i=0;i<strlen(Bit);i++)同时将权重赋给标记,就可以求出带权路径长度(WPL)= Sign*strlen(Bit)*/if(Temp->Left || Temp->Right){ //一个字符编码建树完成后 如果最后不是叶结点 则不是前缀码*P = 0;}else{Temp->Sign = 1; //也可以将权重值赋给叶结点 Temp->Sign = Weight,方便后面求带权路径长度(WPL)}}return BT;
}
  • 核心  插入函数 —— 插入的过程中 如果有经过Sign == 1 的结点,或者插入最后一位时,已经有结点了,则说明不是前缀码。函数返回的是最后的位置 以方便下一个结点插入

Tree* Insert(Tree* Temp,char bit,int* P )
{if(bit == '0'){if(Temp->Left){Temp = Temp->Left;}else{Temp->Left = NewNode( );Temp = Temp->Left;}}else{if(Temp->Right){Temp = Temp->Right;}else{Temp->Right = NewNode( );Temp = Temp->Right;}}if(Temp->Sign){  //插入的过程中经过有标记的结点,则不是前缀码*P = 0;}return Temp;
}
  • 新建结点函数

Tree* NewNode( )
{Tree* newNode = (Tree*)malloc(sizeof(Tree));newNode->Left = newNode->Right = NULL;newNode->Sign = 0;return newNode;
}
  • 最后别忘了 有malloc 就有free

void FreeTree( Tree* BT )
{if(BT->Left){FreeTree( BT->Left );}if(BT->Right){FreeTree( BT->Right );}free(BT);
}

MOOC 课后讨论5.2 判别是否是前缀码的算法相关推荐

  1. ## 科研伦理与学术规范课后讨论

    科研伦理与学术规范课后讨论 一.如何理解学风与科研诚信?如何理解优良学风与科研诚信之间的关系? 答: 1.学风建设的重点是"涵养",其核心是专业主义.科研机构的良好学风并非天然就存 ...

  2. 使用Python爬取中国Mooc网讨论区内所有评论

    最近受朋友委托,写了一个爬取中国Mooc往讨论区所有评论的程序 ,他需要这些数据写论文. 如下: 他需要爬取这些板块里所有的评论. 俗话说的好 六月七月爬虫热 因为这段时间许多的大学生都毕业了 特此写 ...

  3. 线性判别准则和线性分类算法

    一.线性判别-LDA         线性分类:指存在一个线性方程可以把待分类数据分开,或者说用一个超平面能将正负样本区分开,表达式为y=wx,这里先说一下超平面,对于二维的情况,可以理解为一条直线, ...

  4. 大家一起讨论一下朋友网的人脉关系算法是怎么实现的

    大家一起讨论一下啊!最短路径? 1.一度人脉:双方直接是好友 2.二度人脉:双方有一个以上共同的好友,这时朋友网可以计算出你们有几个共同的好友并且呈现数字给你.你们的关系是: 你->朋友-> ...

  5. 带赖子的麻将胡牌算法Java_有人讨论下麻将胡牌,出牌算法吗,求思路

    前段时间学会了打麻将,觉得老祖宗的智慧真的博大精深,很好玩,食胡的时候真兴奋啊,于是空余时间就想自己写个麻将游戏出来,模仿欢乐麻将那种,数学差,想了两个礼拜才想出一个胡牌算法,前段时间学会了打麻将. ...

  6. 【课程学习】(中国大学MOOC)武汉理工大学高级人工智能原理与技术课后习题笔记(1-5章)

    关于 拾年之璐 微信公众号:知行校园汇,点击查看,欢迎关注 其他平台(点击蓝字可访问): GitHub | Gitee | 哔哩哔哩 | 语雀 | 简书 | 微信小程序 | 知行达摩院 本文专栏:研究 ...

  7. 【课程学习】(中国大学MOOC)武汉理工大学高级人工智能原理与技术课后习题笔记(6-9章)

    关于 拾年之璐 微信公众号:知行校园汇,点击查看,欢迎关注 其他平台(点击蓝字可访问): GitHub | Gitee | 哔哩哔哩 | 语雀 | 简书 | 微信小程序 | 知行达摩院 本文专栏:研究 ...

  8. 大型开放式网络课程MOOC的一点体会

    2012年,美国的顶尖大学陆续设立网络学习平台,在网上提供免费课程,Coursera.Udacity.edX三大课程提供商的兴起,给更多学生提供了系统学习的可能.这就是大型开放式网络课程,即MOOC( ...

  9. java求根号函数_一般实系数四次方程的一种求根公式与根的判别法则及其推导...

    仿照<方程式论>( 伯恩赛德班登 著),我们设四次方程的一般形式为: 方程两边同除以 ,然后作代换: 我们有: 令: 那么有: 我们假设 ,然后求解方程 . 设: 代入方程 并整理,我们有 ...

  10. 数据结构-第一讲 基本概念-学习笔记(MOOC 浙江大学 陈越 何钦铭)

    目录 第一讲 基本概念 1.1 什么是数据结构 1.1.1 关于数据组织 - 例:图书摆放 1.1.2 关于空间使用 - 例:PrintN函数实现 1.1.3 关于算法效率 - 例:计算多项式值 计算 ...

最新文章

  1. 用 Flask 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五
  2. Android IOC模块,利用了Java反射和Java注解
  3. 【bzoj4372】烁烁的游戏 动态点分治+线段树
  4. linux命令菜鸟ping,Linux ping命令
  5. php实时股票,php基于curl实现的股票信息查询类实例
  6. 设置devenv命令的启动版本
  7. DCOM EXCE权限配置问题
  8. Pytorch:RuntimeError: DataLoader worker (pid 27) is killed by signal: Killed. Details are lost due
  9. 【BZOJ1095】【ZJOI2007】捉迷藏 [动态点分治]
  10. 中国地图和地方特点介绍
  11. 利用python在excel中画图
  12. MATLAB2018B下用Faster-RCNN做目标检测的训练和测试步骤
  13. Android Audio 架构分析
  14. 今年还打算考一个 专利代理人 以后的方向 软件专利代理人
  15. didi.github.io 域名无法打开解决办法
  16. Android版:验证手机号码的正则表达式
  17. 混合动力汽车SIMULINK整车模型,并联P2构型,基于规则的控制策略,模型运行及仿真无误
  18. 小谷围岛Landsat 8 OLI(陆地成像仪) 融合遥感影像彩色组合解译标志对比
  19. A. Stones---水题
  20. Android开发:去除标题栏的方法

热门文章

  1. Spring核心模块及功能汇总
  2. 米思齐(Mixly)初体验—触摸式开关
  3. 斯坦福机器学习教程学习笔记之1
  4. postman安装后闪退
  5. bitvise terminal 中文乱码
  6. android 4.4.2截屏方法,Android截屏截图的几种方法总结
  7. termux android api,Termux API
  8. 【robo3t-1.2.1】 windos安装
  9. SSD目标检测(Single Shot MultiBox Detector)(一)
  10. 2009年度优科豪马轮胎全国经销商会议在三亚召开