唯一可译码判决准则

版权声明:转载请注明出处 https://blog.csdn.net/u013290075/article/details/51707437
  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. 运行结果
    这里写图片描述
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页