唯一可译码判决准则

Posted R-Pursue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了唯一可译码判决准则相关的知识,希望对你有一定的参考价值。

  1. 实验目的
    熟悉唯一可译码判决准则;
    掌握C语言字符串处理程序的设计和调试技术;
  2. 实验要求
    已知:信源符号个数r、码字集合C。
    输入:任意的一个码。码字个数和每个具体的码字在运行时从键盘输入
    输出:判决(是唯一可译码/不是唯一可译码)。

  3. 原理介绍

    1. 考察C 中所有的码字,若Wi是 Wj的前缀,则将对应的后缀作为一个尾随后缀码放入集合Fi+1中;
    2. 考察C和Fi俩个集合,若Wi ∈C是 Wj∈F的前缀或Wi ∈F是 Wj∈C的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中;
    3. F=∪Fi即为码C的尾随后缀集合;
    4. 若F中出现了C中的元素,算法终止,返回假(C不是唯一可译码);否则若F中没有出现新的元素,则返回真。
  4. 编码实现

    输入码字集合X0
    for 所有WiWjX0 
    if 码字Wi 是码字Wj 的前缀, 
        即将相应的后缀作为一个尾随后缀放入新集合X1 
     end if 
    end for 
    for 所有WiX0 
    for 所有WjXn1 
        if WiWj 的前缀, 
            即将相应的后缀作为一个尾随后缀放入新集合Xnelse if WjWi的前缀, 
            即将相应的后缀作为一个尾随后缀放入新集合Xnend if           
    end for     
    end for     
    构造尾随后缀集合XXi 
    if 有码字WiX0WiX,则非唯一可译码
  5. 代码
    • Main
package com.tanrong.UDC;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
/**
 * Created by tanrong.ltr on 16/6/18.
 * @Author tanrong.ltr
 *
 */
public class Main

    public static void main(String[] args)
        ArrayList<String> ccString=new ArrayList<String>();//用来存储输入的码符号

        //输入字符
        if (args.length==0)
            ccString.clear();

            Scanner input = new Scanner(System.in);
            System.out.println("请输入信源的个数");
            int count = input.nextInt();
            System.out.println("请输入编码符号");
            for(int i = 0; i< count; i++)
            
                ccString.add(input.next());
            
            System.out.println("输入的码字是\\n"+ccString);


        else 
            Collections.addAll(ccString, args);
        

        String result= UDC.compare(ccString)?"是唯一可译码":"不是唯一可译码";

        System.out.println(ccString+" "+result);
        System.exit(0);
    
- UDC
package com.tanrong.UDC;

import java.util.ArrayList;

/**
 * Created by tanrong.ltr on 16/6/18.
 *
 */
public class UDC 

    private static boolean result=true;//默认是可唯一译码

    /**
     * 比较两个字符串,若相等,即不可能是唯一可译码,使result为假。
     * 若满足前缀关系,则返回后缀。
     * 若无以上关系,返回真
     * @param str1
     * @param str2
     * @return
     */
    private static String compareString(String str1,String str2)
    
        String theResult=null;
        if(str1.equals(str2))
            result=false;
        
        if(result)
        
            if(str1.startsWith(str2))
            
                theResult=str1.substring(str2.length(),str1.length());

            
            if(str2.startsWith(str1))
            
                theResult=str2.substring(str1.length(),str2.length());
            
        
        return theResult;
    

    /**
     * 比较两个集合。若有相同的元素,则不是唯一可译码。使result为假。
     * 若其中有元素满足前缀关系。则提取后缀添加到mylist中。
     * @param a
     * @param b
     * @param endString
     */
    private static void compareList(ArrayList<String> a,ArrayList<String> b,String endString)
    
        boolean flag=false;
        String aa;
        String bb;
        cp: for(int i=0;i<a.size();i++)
        
            for(int j=0;j<b.size();j++)
            
                aa=a.get(i);
                bb=b.get(j);
                endString=compareString(aa,bb);
                if(!result)
                
                    break cp;
                
                if(endString!=null&&!b.contains(endString))
                
                    b.add(endString);
                    flag=true;
                    break cp;
                
            
        
        if(flag)
        
            compareList(a,b,endString);
        
    

    /**
     * 对一个String集是否为唯一可译码给出判决
     * @param ccString
     * @return
     */
    public static boolean compare(ArrayList<String> ccString)
        String endString=null;//用来引用要加入mylist中的后缀。
        ArrayList<String> myList=new ArrayList<>();

        //比较所给字符集中任何两个字符,将满足前后缀的字符添加到myList中
        cp: for(int m = 0; m< ccString.size(); m++)
        
            for(int j = m+1; j< ccString.size(); j++)
            
                String st1=ccString.get(m);
                String st2=ccString.get(j);
                endString= compareString(st1,st2);
                if(!result)
                
                    break cp;
                
                if(endString!=null&&!myList.contains(endString))
                
                    myList.add(endString);
                
            
        
        compareList(ccString,myList,endString);
        return result;
    


  1. 运行结果

以上是关于唯一可译码判决准则的主要内容,如果未能解决你的问题,请参考以下文章

基于matlab的BCH编译码算法原理介绍与仿真分析

labVIEW viterbi译码看不懂,求大神指教~

规则LDPC和不规则LDPC译码算法MATLAB仿真

利用Xilinx HLS实现LDPC译码器

霍夫曼编码详解

编码译码基于matlab GUI CRC+海明编码译码含Matlab源码 1847期