信息论课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
成绩:2016-2017学年第1学期《信息论》课程设计
学院名称:
班级学号:
学生姓名:
教师姓名:
2016年 12 月
一、判定唯一可译码
1. 任务说明
输入:任意的一个码(即已知码字个数及每个具体的码字) 输出:判决结果(是/不是)
输入文件:in1.txt ,含至少2组码,每组的结尾为”$”符 输出文件:out1.txt ,对每组码的判断结果
说明:为了简化设计,可以假定码字为0,1串
2. 实现原理
判断方法:将码C 中所有码字可能的尾随后缀组成一个集合F ,当且仅当集合F 中没有 包含任一码字,则可判断此码C 为唯一可译变长码。
构成集合F :首先观察码C 中最短的码字是否是其他码字的前缀。若是,将其所有可能 的尾随后缀排列出。就是将其他码字序列中截去与其最短码字相同的前缀 部分,将余下的序列为尾随后缀。而这些尾随后缀又可能是某些码字的前 缀,或者最短码字又仍是这些尾随后缀的前缀,再将由这些尾随后缀产生 的新的尾随后缀列出。然后再观察这些新的尾随后缀是否是某些码字的前 缀,或观察有否其他码字是这些新的尾随后缀的前缀,再将产生的尾随后 缀列出,依次下去,直至没有一个尾随后缀是码字的前缀或没有新的尾随 后缀产生为止。这样,首先获得的是由最短码字能引起的所有尾随后缀。 接着,按照上述步骤将次短的码字、......所有码字可能产生的尾随后缀前部 列出。由此得到由码C 的所有可能的尾随后缀组成的集合F 。 参考算法伪代码:
For all ,i j W W C ∈ do
if i W 是j W 的前缀 then
将相应的后缀作为一个尾随后缀放入集合0F 中 End if End for Loop
For all i W C ∈ do
For all j n W F ∈ do
if i W 是j W 的前缀 then
将相应的后缀作为一个尾随后缀放入集合1n F +中 Else if j W 是i W 的前缀 then
将相应的后缀作为一个尾随后缀放入集合1n F +中
End if End for End for i i F F ←
If ,i i W F W C ∃∈∈ then
Return false
Else if F 中未出现新的元素then
Return true
End if
//能走到这里,说明F中有新的元素出现,需继续
End loop
3. 实现源码
#include
#include
#include
#include
using namespace std;
#pragma warning(disable:4996)
char c[100][50]; //保存码字
char f[300][50]; //保存尾随后缀
int N, sum = 0; //N为码字的个数,sum为尾随后缀个数
int flag; //判断是否唯一可译标志位
//检测尾随后缀
void patterson(char c[], char d[])
{
int i, j, k;
for (i = 0;; i++)
{
If (c[i] == '\0'&&d[i] == '\0')//两字符串一样长,跳出
break;
if (c[i] == '\0') //d比c长,将d的尾随后缀放入f中
{
for (j = i; d[j] != '\0'; j++)
f[sum][j - i] = d[j];
f[sum][j - i] = '\0';
for (k = 0; k { if (strcmp(f[sum], f[k]) == 0) /*查看当前生成的尾随后缀在f集合中 是否存在*/ { sum--; break; } } sum++; break; } if (d[i] == '\0') //c比d长,将c的尾随后缀放入f中 { for (j = i; c[j] != '\0'; j++) f[sum][j - i] = c[j]; f[sum][j - i] = '\0'; for (k = 0; k { if (strcmp(f[sum], f[k]) == 0) /*查看当前生成的尾随后缀在f集合中 是否存在*/ { sum--; break; } } sum++; break; } if (c[i] != d[i])//字符不一样了也退出(前缀不同) break; } } void main(){ int k = 0, N = 0, m = 0, a[50], z = 0; a[m] = N; m++; fstream file1; file1.open("out1.txt"); //码字读取 FILE *file; file = fopen("in1.txt", "r+"); int num = fgetc(file) - 48; for (int n = 0; n < num; n++){ int i = 0, j; if (fgetc(file) == ' ') N += (fgetc(file) - 48); else N += (fgetc(file) - 48); a[m] = N; m++; fgetc(file); for (k; k < N; k++){ for (int q = 0;; q++){ char temp = fgetc(file); c[k][q] = temp; if (temp == ' ' || temp == '$'){ c[k][q] = '\0'; break; } }