唯一可译码的判决算法实验(UDC)

使用A. A. Sardinas 和G. W. Patterson 设计的判断法进行判断,具体流程(见流程图Fig. 1)如下:

1. 输入原始数据,并用ArrayList()类存储起来;

2. 在使用规则之前,先判断是否奇异,如果奇异,将没有进行后续判断的必要,如果非奇异,进入第3步;否则结束程序,输出结果(奇异);

3. 第一次寻找,调用自己设定的seek(array),在初始数据中找到符合条件的尾随后缀,然后进入第4步;

4. 通过第一次寻找,可以得到一个arr数组,如果该数组为空,那么就没有必要再进行下去,已经证明找不到更多的尾随后缀了,直接进入第6步;否则进入第5步;

5. 通过第一次的寻找,已经得到基本的arr,但是arr是用于判断的,所以首先克隆arr到arrclone中,并且将arr清空,调用seek(array,arrclone),再将arrclone的字符串和原始数据进行对比,再次得到arr,如果arr为空,进入第6步,否则循环第5步;

6. 得到了S,若S为空,则证明不存在尾随后缀,则为即时码,输出结果;若不为空,将原始数据array和S进行对比,若有相同的字符串,则不是唯一可译码,反之,是唯一可译码。

Fig. 1算法流程图

代码运行结果如下:

(1)

结果一致;

(2)

由文献[2]提供的办法,我们知道,1,0可以组成10,所以不是唯一可译码;

(3)

与预期结果一致;

(4)

与预期结果一致;

(5)

与预期结果一致。

参考代码如下。

import java.util.*;public class udcjudge {public static ArrayList<String> array = new ArrayList<String>();// 用于存放原始数据public static ArrayList<String> arr = new ArrayList<String>();// 用于存放本次产生的尾随后缀public static ArrayList<String> arrclone = new ArrayList<String>();// 用于存放数据,克隆arr数组public static ArrayList<String> S = new ArrayList<String>();// 用于存放尾随后缀(dangling// suffix)public static boolean flag = false;// 判断S和array是否有同样的字符,从而得出是否唯一可译public static boolean flag2 = false;// 判断是否奇异// 用于第一次寻找public void seek(ArrayList<String> a) {int length = a.size();for (int i = 0; i < length; i++)for (int j = 0; j < length; j++)if (a.get(i).length() < a.get(j).length()) {if (a.get(i).equals(a.get(j).substring(0, a.get(i).length()))) {String str1 = a.get(j).substring(a.get(i).length());boolean flag1 = true;for (int k = 0; k < S.size(); k++) {if (S.get(k).equals(str1)) {flag1 = false;break;}}if (flag1 == true && str1.equals("") == false) {S.add(str1);arr.add(str1);}}}}// 指的是第一次以后的寻找public void seek(ArrayList<String> a, ArrayList<String> ar) {arr.clear();// 首先清空上次残留,若本次之后还是空,则找到所有的后缀,可跳出循环int length = a.size();int length1 = ar.size();// 判断,这是重要部分for (int i = 0; i < length; i++)for (int j = 0; j < length1; j++) {if (a.get(i).length() < ar.get(j).length()) {if (a.get(i).equals(ar.get(j).substring(0, a.get(i).length()))) {String str1 = ar.get(j).substring(a.get(i).length());boolean flag1 = true;for (int k = 0; k < S.size(); k++) {if (S.get(k).equals(str1)) {flag1 = false;break;}}// 符合条件,可以添加进入S和arrif (flag1 == true && str1.equals("") == false) {S.add(str1);arr.add(str1);}}} else// 和if语句一样,a.get(i)和ar.get(j)具有同样的地位{if (ar.get(j).equals(a.get(i).substring(0, ar.get(j).length()))) {String str1 = a.get(i).substring(ar.get(j).length());boolean flag1 = true;for (int k = 0; k < S.size(); k++) {if (S.get(k).equals(str1)) {flag1 = false;break;}}if (flag1 == true && str1.equals("") == false) {S.add(str1);arr.add(str1);}}}}}public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.print("请输入C(X)序列中字符串的个数:");int N = input.nextInt(); // N 代表该有限序列中信源码的个数String[] str = new String[N];// str[] 依次用于存放信源码System.out.print("请依次输入C(X)序列中的各个字符串:");for (int i = 0; i < N; i++) {str[i] = input.next();array.add(str[i]);}udcjudge udc = new udcjudge();for (int i = 0; i < array.size() - 1; i++)for (int j = i + 1; j < array.size(); j++) {if (array.get(i).equals(array.get(j))) {flag2 = true;break;}}if (flag2)System.out.println("该有限序列C(X)是奇异的。");else {udc.seek(array);// 第一次寻找while (arr.isEmpty() == false) {arrclone = (ArrayList<String>) arr.clone();// 克隆数据,后面有clearudc.seek(array, arrclone);}if (S.isEmpty())// 判断为空,所以可以输出为即时码,后续不用比较System.out.print("尾随后缀(dangling suffix)为空,所以C(X)是即时码。");else// 非空且非奇异,所以判断是否唯一可译{System.out.print("输出尾随后缀(dangling suffix)的集合:");Iterator it1 = S.iterator();while (it1.hasNext())// 迭代器输出输出所有尾随后缀的集合System.out.print(it1.next() + "   ");System.out.println();for (int i = 0; i < S.size(); i++)for (int j = 0; j < array.size(); j++)if (S.get(i).equals(array.get(j))) {flag = true;// 搜索到相同的,即可跳出break;}if (flag)System.out.println("该有限序列C(X)不是唯一可译码。");elseSystem.out.println("该有限序列C(X)是唯一可译码。");}}}
}

[信息论]唯一可译码的判决算法实现(UDC)相关推荐

  1. 基于阈值的全零块判决算法

    全零TU所占总TU数的比例会随着QP增加而增加.然而,在TU尺寸大的情况下,如32x32,即使QP非常大,G-AZB所占TU总数的比例也很小.这也就是说,对于32x32的TU块,没有RDOQ,最后的量 ...

  2. 唯一可译码的判定方法matlab,用c++编写程序判定唯一可译码?

    #include #include #include #include using namespace std; #define ISSAME 0 #define ISPREFIX 1 #define ...

  3. 经典算法详解--CART分类决策树、回归树和模型树

    Classification And Regression Tree(CART)是一种很重要的机器学习算法,既可以用于创建分类树(Classification Tree),也可以用于创建回归树(Reg ...

  4. 机器学习十大算法之-CART分类决策树、回归树和模型树

    转载(http://blog.163.com/zhoulili1987619@126/blog/static/35308201201542731455261/) Classification And ...

  5. 社团发现算法-BGLL算法(附代码实现)

    一.社团发现算法 人们发现许多实际网络均具有社团结构, 即整个网络由若干个社团组成,社团之间的连接相对稀疏.社团内部的连接相对稠密.社团发现则是利用图拓扑结构中所蕴藏的信息从复杂网络 中解析出其模块化 ...

  6. 信息技术领域,我们如何进行算法创新?

    一直以来,我都想写一篇信息技术领域该如何进行算法创新的文章.算法是芯片.操作系统乃至整个信息系统的基础,我国是信息技术应用大国,算法的研究在我国却及其薄弱.时至今日,我国还在被国外技术封锁.核心技术卡 ...

  7. 用matlab仿真导航信号,北斗卫星导航信号串行捕获算法MATLAB仿真报告(附MATLAB程序)[互联网+]...

    <北斗卫星导航信号串行捕获算法MATLAB仿真报告(附MATLAB程序)[互联网+]>由会员分享,可在线阅读,更多相关<北斗卫星导航信号串行捕获算法MATLAB仿真报告(附MATLA ...

  8. 用matlab仿真导航信号,北斗卫星导航信号串行捕获算法MATLAB仿真报告(附MATLAB程序)...

    <北斗卫星导航信号串行捕获算法MATLAB仿真报告(附MATLAB程序)>由会员分享,可在线阅读,更多相关<北斗卫星导航信号串行捕获算法MATLAB仿真报告(附MATLAB程序)(9 ...

  9. 卫星测控matlab程序,北斗卫星导航信号串行捕获算法MATLAB仿真报告(附MATLAB程序).docx...

    PAGE 4 北斗卫星导航信号串行捕获算法MATLAB仿真报告 原理 卫星导航信号的串行捕获算法如图1所示. 图1 卫星导航信号的串行捕获算法 接收机始终在本地不停地产生对应某特定卫星的本地伪码,并且 ...

最新文章

  1. poj2438(哈密顿回路)
  2. linux bash输入输出重定向
  3. 最终成为了热门的语言——python
  4. cocos2d-x CCScrollView和CCTableView的使用(转载)
  5. c# 再次尝试 连接失败_和平精英ios充值失败该怎么办
  6. 光栅衍射主极大个数_大学物理——光的干涉和衍射(二)
  7. 免费天气预报短信服务
  8. 在MAC中配置Tomcat+Nginx代理
  9. Oracle的to_char()函数使用
  10. HTML section 标签
  11. 从零开始的前端异次元生活
  12. win10相机计算机无法使用,win10系统相机怎么用 win10系统相机无法使用怎么解决...
  13. C语言编程入门——综合练习(一)
  14. 关于html表格结构标签thead,tfoot,tbody使用出现不兼容性
  15. XDOJ 133-一元稀疏多项式计算器
  16. 开始炼狱般的折腾:一种奇怪的Gitee自动构建实现脚本
  17. 5年经验Java程序员面试20天,拿下数个offer,总结出的经验感想!
  18. 2021CCPC河南省赛赛后总结(终于拿金了呜呜呜)
  19. 限量级预告!劳动合同电子化,这样做最合法
  20. 你离拍出好的雪景作品,还有多远? @教摄影

热门文章

  1. 四、分支结构(头歌实践平台)
  2. xp破解syn扫描tcp连接数和多用户终端服务限制
  3. 国开电大 传感器与测试技术 形考任务
  4. 酷比魔方i7手写版linux网卡驱动,酷比魔方i7手写板安装Ubuntu 16.04
  5. C#隐藏标题栏任务栏图标
  6. screenfetch
  7. Android开发-手机适配之values目录
  8. baum welch java_Baum-Welch的实施示例
  9. OBS推流直播软件安装教程
  10. 将分钟数换算成天数和年数