信息论课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

}

相关文档
最新文档