1、判决结果(是/不是) 输入文件:in1.txt,含至少2组码,每组的结尾为”$”符 输出文件:out1.txt,对每组码的判断结果 说明:为了简化设计,可以假定码字为0,1串2. 实现原理 判断方法:将码C中所有码字可能的尾随后缀组成一个集合F,当且仅当集合F中没有 包含任一码字,则可判断此码C为唯一可译变长码。 构成集合F:首先观察码C中最短的码字是否是其他码字的前缀。若是,将其所有可能 的尾随后缀排列出。就是将其他码字序列中截去与其最短码字相同的前缀 部分,将余下的序列为尾随后缀。而这些尾随后缀又可能是某些码字的前 缀,或者最短码字又仍是这些尾随后缀的前缀,再将由这些尾随后缀产生 的新的尾
2、随后缀列出。然后再观察这些新的尾随后缀是否是某些码字的前 缀,或观察有否其他码字是这些新的尾随后缀的前缀,再将产生的尾随后 缀列出,依次下去,直至没有一个尾随后缀是码字的前缀或没有新的尾随 后缀产生为止。这样,首先获得的是由最短码字能引起的所有尾随后缀。 接着,按照上述步骤将次短的码字、.所有码字可能产生的尾随后缀前部 列出。由此得到由码C的所有可能的尾随后缀组成的集合F。 参考算法伪代码:For all do if 是的前缀 then将相应的后缀作为一个尾随后缀放入集合中End ifEnd forLoopFor all doElse if 是的前缀 thenEnd for If thenRe
3、turn falseElse if F 中未出现新的元素 thenReturn true/能走到这里,说明F中有新的元素出现,需继续 End loop3. 实现源码 #includefstreamstdio.hstring.h using namespace std; #pragma warning(disable:4996) char c10050; /保存码字 char f30050; /保存尾随后缀 int N, sum = 0; /N为码字的个数,sum为尾随后缀个数 int flag; /判断是否唯一可译标志位 /检测尾随后缀 void patterson(char c, char
4、d) int i, j, k; for (i = 0; i+) If (ci = 0&di = )/两字符串一样长,跳出 break; if (ci = ) /d比c长,将d的尾随后缀放入f中 for (j = i; dj != j+) fsumj - i = dj; fsumj - i = for (k = 0; ksum; k+) if (strcmp(fsum, fk) = 0) /*查看当前生成的尾随后缀在f集合中 是否存在*/ sum-; break; sum+; if (di = ) /c比d长,将c的尾随后缀放入f中 cj ! fsumj - i = cj; if (strcmp
5、(fsum, fk) = 0) /*查看当前生成的尾随后缀在f集合中 sum-; if (ci != di)/字符不一样了也退出(前缀不同) void main() int k = 0, N = 0, m = 0, a50, z = 0; am = 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) = )
6、 N += (fgetc(file) - 48); else N += (fgetc(file) - 48); am = N; fgetc(file); for (k; k N; k+) for (int q = 0; q+) char temp = fgetc(file); ckq = temp; if (temp = | temp = $) ckq = break; /生成尾随后缀 flag = 0; for (i = az; iN - 1; i+)/判断码本身是否重复 for (j = i + 1; jN; if (strcmp(ci, cj) = 0) flag = 1; if (fl
7、ag = 1)/如果码本身有重复,就可以断定它不是唯一可译码 for (int y = az; y y+) file1 cy file1 不是唯一可译码。n else for (i = az; i+) /*将原始码字生成的尾随后缀集合s1放入f 中*/ for (j = i + 1; patterson(ci, cj); for (i = 0; i+) /根据原始码与si生成si+1也放入fi int s = 0; for (j = az; j+) /*判断si+1中的字符串是否与si中一 样 ,重复的则不再添加*/ if (i = sum) s = 1; else patterson(fi, cj); if (s = 1)break; i+) /*判断尾随后缀与原始码字是否相同, 相同则不是唯一可译码*/ if (strcmp(fi, cj) = 0) flag = 1; break; if (flag = 1) for (int y = az; file1 else是唯一可译码。 file1 尾随后缀集合为: for (i = 0; i sum; fi
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1