精华内容
下载资源
问答
  • 一种快速判断非唯一可译码的方法.pdf
    2021-04-24 19:20:37

    一种快速判断非唯一可译码的方法

    一种快速判断非唯一可译码的方法

    邢楠, 朱虹, 梁秀梅, 侯浩录

    (西安理工大学 自动化与信息工程学院, 西安 710048)

    : 本文介绍了一种 速判断非唯一可译码的方法, 该方法针对现存判别唯一可译码的

    方法( 即: 根据异前缀码来进行判断的方法以及 A. A. Sardinas和 G. W. patterson判断法)所存

    在的不确定性大运算量等问题, 提出一种方法对非唯一可译码作出准确判断该方法具有判

    别简单, 运算量小等特点, 可以广泛应用于非唯一可译码的判断该方法对于通信信息论方

    面的研究具有一定的意义

    : 唯一可译码; 克劳夫特不等式; 异前缀码; A. A. Sardinas和 G. W. Patterson判断法

    : TN911 : A : 100383 9( 008) 0 00 903

    A FastApproach to D iscrmi inate TheNon- unique Decodable Code

    X ING N an, ZHU Hong, LIANG X iumei, HOU Haolu

    (X i an University of Technology, The Faculty of Au tom ation and Inform ation Engineering, X i an, 710048, China)

    A bstract: This paper proposes a fast approach to discrmi inate the non - unique decodable code.

    D iffering from tw o existingm ethods about this academ ic issue, namely the approach basing on unu

    sual prefix code and theA. A. Sardinas and G. W. Patterson d iscrmi ination algorithm, the approach

    in this paper discrmi inates the non- un ique decodable code exactly. It solves some of the problem s

    of the prior tw omethods, such as uncertainty andmass calcu lationw ork. Th ismethod requ ires small

    amount of calcu lation and is easy to be employed, and therefore it is w idely app licable to the d is

    crmi ination of non- un ique decodable code. Th is paper to some extend provides contribution to the

    research on commun ications and inform ation theory.

    K ey words: un ique decodable code; kraft inequality; unusual prefix cond ition code; A. A. Sard inas

    and G. W. Patterson discrmi ination algorithm

    1 引 言 , K raft

    , : D

    ,

    C = {C , C , , C } , C ( i =

    更多相关内容
  • 唯一可译码的辨别 C语言实现,因为用的动态分配,所以编码的长度基本可以无限长
  • matlab 判断唯一可译码

    2015-04-09 23:15:22
    本网站资源中的判断唯一可译码的matlab代码有一定错误,最近学习唯一可译码。上传该m文件,未进一步优化。但是可用的。matlab是R2011a版
  • 唯一可译码python实现

    2018-04-26 12:39:55
    惟一可译码的判断使用python实现,使用的是信息论与编码的判断算法,Fi,Fi+1前后缀判断算法实现
  • 唯一可译码

    2011-11-23 21:16:33
    编一个程序 来确定唯一可译码!! 输入 0 10 1100 1110 1011 1101 判断之
  • #include #include #include #include using ...#defineISSAME 0#defineISPREFIX 1#defineNOTPREFIX 2#define ISUDC0 //唯一可译码#define ISRTC 1 //即时码#define NOTUDC2 //非唯一可译码typedef vector pCharVe...

    #include

    #include

    #include

    #include

    using namespace std;

    #define ISSAME 0

    #define ISPREFIX 1

    #define NOTPREFIX 2

    #define ISUDC 0 //唯一可译码

    #define ISRTC 1 //即时码

    #define NOTUDC 2 //非唯一可译码

    typedef vector pCharVector;

    /**************************************************************************/

    /* 判断chPrefix是否为chWord的前缀.*/

    /**************************************************************************/

    int IsPrefix(const char* chPrefix,const char* chWord);

    /**************************************************************************/

    /* 往后缀码集合中插入不重复的键,*/

    /*************************************************************************/

    bool PushBackUniqueValue(pCharVector& pCode,char* pValue);

    /**************************************************************************/

    /* 判断码字序列的类型,非回溯法*/

    /**************************************************************************/

    int IsUDC(const pCharVector& pCode);

    /**************************************************************************/

    /* 回溯计算,如果不是唯一可译码则可以得到一串有歧义的码字序列(即有多种译法的

    /* 序列),该序列用参数中的pInvalidSeqBuf返回,调用者需记得释放内存

    /* 该方法的缺点是没有检测码字序列中是否有重复码字*/

    /**************************************************************************/

    int IsUDC_Backtrace(const pCharVector& pCode,char** pInvalidSeqBuf);

    //#define TEST_BY_FILE

    int main()

    {

    #ifdef TEST_BY_FILE

    freopen("in","r",stdin);

    #endif

    pCharVector VCode;

    int nCodeNum;

    int i;

    char chContinue;

    do

    {

    cout<

    cin>>nCodeNum;

    cout<

    for (i = 0; i < nCodeNum; i++)

    {

    //将输入读取到缓冲区

    string strBuffer;

    cin>>strBuffer;

    //copy字符到动态数组中已进行比较

    char* pTemp = new char[strBuffer.size() + 1];

    memcpy(pTemp,strBuffer.c_str(),sizeof(char) * (strBuffer.size() + 1));

    VCode.push_back(pTemp);

    }

    char * pRetn = NULL;

    int nRetn = IsUDC_Backtrace(VCode,&pRetn);

    if (NOTUDC != nRetn)

    {

    cout<

    }

    else

    {

    cout<

    cout<

    }

    if (ISRTC == nRetn)

    {

    cout<

    }

    else

    {

    cout<

    }

    //清除内存

    delete[] pRetn;

    for (i = 0; i < VCode.size(); i++)

    {

    delete[] VCode.at(i);

    }

    VCode.clear();

    cout<

    cin>>chContinue;

    } while(toupper(chContinue) == 'Y');

    #ifdef TEST_BY_FILE

    fclose(stdin);

    #endif

    return 0;

    }

    int IsPrefix(const char* chPrefix,const char* chWord)

    {

    assert(chPrefix != NULL && chWord != NULL);

    int nLenPrefix,nLenWord;

    nLenPrefix = strlen(chPrefix);

    nLenWord = strlen(chWord);

    //前缀长度大于整个词的长度,返回false

    if (nLenPrefix > nLenWord)

    {

    return NOTPREFIX;

    }

    int nRetn = memcmp(chPrefix,chWord,sizeof(char) * strlen(chPrefix));

    if(0 == nRetn && nLenPrefix == nLenWord) return ISSAME;

    if(0 == nRetn) return ISPREFIX;

    return NOTPREFIX;

    }

    bool PushBackUniqueValue(pCharVector& pCode,char* pValue)

    {

    assert(pValue != NULL);

    for (int i = 0; i < pCode.size(); i++)

    {

    if (0 == strcmp(pValue,pCode[i])) //有重复,直接返回

    return false;

    }

    pCode.push_back(pValue);

    return true;

    }

    int IsUDC(const pCharVector& pCode)

    {

    assert(pCode.size() != 0);

    //用于存放后缀码

    pCharVector CodePostfix;

    //第一轮比较,码字内部比较,得到第一个后缀码集合

    char *iter1,*iter2;

    int i,j;

    for (i = 0; i < pCode.size(); i++)

    {

    iter1 = pCode.at(i);

    for (j = 0; j < pCode.size(); j++)

    {

    //不比较自身

    if(i == j) continue;

    iter2 = pCode.at(j);

    int nRetn = IsPrefix(iter1,iter2);

    if(ISSAME == nRetn) return NOTUDC;

    if (ISPREFIX == nRetn)

    {

    //将iter2的后缀填入CodePostfix

    PushBackUniqueValue(CodePostfix,iter2+strlen(iter1));

    }

    }

    }

    if(CodePostfix.size() == 0) return ISRTC;

    //第二轮比较,比较后缀码集合中是否含有码字集合中的元素

    //有则返回NOTUDC,如果后缀码集合中没有再出现新元素了表明该码字是

    //UDC

    //指向当前集合在整个后缀码集合中的位置,也即是

    //前面所有后缀码的个数

    int nPointer = CodePostfix.size();

    //指向当前集合的大小

    int nNewAssembleSize = nPointer;

    do

    {

    nPointer = CodePostfix.size();

    for (i = 0; i < pCode.size(); i++)

    {

    iter1 = pCode.at(i);

    for (j = nPointer - nNewAssembleSize; j < nPointer; j++)

    {

    iter2 = CodePostfix.at(j);

    int nRetn = IsPrefix(iter1,iter2);

    if (nRetn == ISSAME)

    {

    cout<

    //两个码字相同,返回false

    return NOTUDC;

    }

    if (ISPREFIX == nRetn)

    {

    //将iter2的后缀填入CodePostfixTemp

    PushBackUniqueValue(CodePostfix,iter2+strlen(iter1));

    }

    if (ISPREFIX == IsPrefix(iter2,iter1))

    {

    //将iter1的后缀填入CodePostfixTemp

    PushBackUniqueValue(CodePostfix,iter1+strlen(iter2));

    }

    }

    }

    nNewAssembleSize = CodePostfix.size() - nPointer;

    } while(nNewAssembleSize != 0);

    CodePostfix.clear();

    return ISUDC;

    }

    /************************************************************************/

    /* 该函数是用来对每个pPostfix和原码字序列进行比较, 如果重复了则在pRetnBuf中

    /* 返回本身.并返回1.否则如果没有得到新的后缀码的话返回0表示无重复*/

    /* Stack用来存储递归中产生的后缀码集合,这样确保每次得到的后缀码不会重复

    /* 防止进去死循环

    /************************************************************************/

    int GetBacktraceSeq(const pCharVector& pCode,char* pPostfix,pCharVector& Stack,char** pRetnBuf)

    {

    char* iter1;

    for (int i = 0; i < pCode.size(); i++)

    {

    iter1 = pCode.at(i);

    int nRetn = IsPrefix(iter1,pPostfix);

    if (nRetn == ISSAME)

    {

    //第一次进来的话由于是码字序列内部的比较,所以

    //肯定会遇到自己跟自己比较然后相等的情况,对该情况不允考虑

    if(Stack.size() == 0) continue;

    *pRetnBuf = new char[strlen(pPostfix) + 1];

    strcpy(*pRetnBuf,pPostfix);

    return 1;

    }

    if (ISPREFIX == nRetn)

    {

    //新得到的后缀码已经重复了,跳过对他的处理

    if(PushBackUniqueValue(Stack,iter1) == false) continue;

    char* pTemp = NULL;

    //递归处理下一个后缀码

    if(GetBacktraceSeq(pCode,pPostfix+strlen(iter1),Stack,&pTemp) == 0)

    {

    *pRetnBuf = NULL;

    Stack.pop_back();

    continue;

    }

    Stack.pop_back();

    //递归过程中遇到重复码字,算法应立即返回.

    //将自身和递归得到的后面的后缀码组合成一个歧义序列返回

    char* pNewTraceSeq = new char[strlen(iter1) + strlen(pTemp) + 1];

    pNewTraceSeq[0] = 0;

    strcat(pNewTraceSeq,iter1);

    strcat(pNewTraceSeq + strlen(iter1),pTemp);

    delete[] pTemp;

    *pRetnBuf = pNewTraceSeq;

    return 1;

    }

    if (ISPREFIX == IsPrefix(pPostfix,iter1))

    {

    if(PushBackUniqueValue(Stack,pPostfix) == false) continue;

    char* pTemp = NULL;

    if(GetBacktraceSeq(pCode,iter1+strlen(pPostfix),Stack,&pTemp) == 0)

    {

    *pRetnBuf = NULL;

    Stack.pop_back();

    continue;

    }

    Stack.pop_back();

    char* pNewTraceSeq = new char[strlen(pPostfix) + strlen(pTemp) + 1];

    pNewTraceSeq[0] = 0;

    strcat(pNewTraceSeq,pPostfix);

    strcat(pNewTraceSeq + strlen(pPostfix),pTemp);

    delete[] pTemp;

    *pRetnBuf = pNewTraceSeq;

    return 1;

    }

    }

    return 0;

    }

    /*************************************************************************/

    /* 用递归的方法实现唯一可译码的判决,当码字序列不是唯一可译码时,输出有歧义的

    /* 码字序列

    /************************************************************************/

    int IsUDC_Backtrace(const pCharVector& pCode, char** pInvalidSeqBuf)

    {

    assert(pCode.size() != 0);

    //用于存放后缀码

    pCharVector CodePostfix;

    //第一轮比较,码字内部比较,得到第一个后缀码集合

    char *iter1,*iter2;

    int i,j;

    pCharVector Stack;

    for (i = 0; i < pCode.size(); i++)

    {

    iter1 = pCode.at(i);

    char* pTemp = NULL;

    int nRetn = GetBacktraceSeq(pCode,iter1,Stack,&pTemp);

    if(nRetn == 1)

    {

    *pInvalidSeqBuf = pTemp;

    return NOTUDC;

    }

    }

    *pInvalidSeqBuf = NULL;

    return ISUDC;

    }

    展开全文
  • 使用C++实现信息论的唯一可译码编码方案,里面是工程文件的打包,解压后使用VS2015即可运行!
  • 吉林大学通信工程学院信息论作业-唯一可译码判断,自己写的测试程序,供大家下载。
  • 唯一可译码的判别.doc

    2021-03-16 12:10:48
    唯一可译码的判别信息论与编码技术课程设计(论文)设计(论文)题目唯一可译码的判别管理科学学院专业名称信息与计算科学学生姓名曹昌杰学生学号201307020102指导教师乐千桤设计(论文)成绩教务处 制2015 年 12 月 12 日...

    唯一可译码的判别

    信息论与编码技术课程设计(论文)设计(论文)题目唯一可译码的判别管理科学学院专业名称信息与计算科学学生姓名曹昌杰学生学号201307020102指导教师乐千桤设计(论文)成绩

    教务处 制

    2015 年 12 月 12 日

    唯一可译码的判别0为原始码字的集合再构造一系列集合1,S2,…为得到集合1,首先考察0中所有的码字若码字ωωi的前缀即ωiωjA,则将后缀1中的元素1是由所有具有这种性质的0中拿出一个元素看有没有一个码字是另一个码字的前缀这种情况如果有就将后缀放入更新的集合中直到更新的集合为空集为止一种码是唯一可译码的充要条件是1,S2,…中没有一个含有0中的码字第1章 前 言

    1.1内容及要求(或课题背景)

    对于用户输入指定的编码个数及编码,判断出输入的码为唯一可译码。

    1.2 本文研究思路及结构安排

    设计判定唯一可译码的思路如下:

    1)、考察0中所有的码字。若码字ωωi的前缀,即ωiωjA,则将后缀1中的元素构造1。

    2)、从新产生的集合中拿出一个元素,从原始集合S0中拿出一个元素找有没有一个码字是另一个码字的前缀这种情况如果有就将后缀放入更新的集合中

    3)、如此构造的S1,S2,…集合中没有一个含有0中的码字此编码即为唯一可译码否则该编码不是唯一可译码第2章 相关理论知识

    唯一可译码充要判定条件:设S0为原始码字的集合,再构造一系列集合1,2,…为得到集合1,首先考察0中所有的码字。若码字ωωi的前缀,即ωi=ωA,则将后缀1中的元素,1是由所有具有这种性质的0中拿出一个元素,看有没有一个码字是另一个码字的前缀这种情况,如果有就将后缀放入更新的集合中,直到更新的集合为空集为止,若1,2,…中没有一个含有0中的码字,则为唯一可译码。第3章 算法设计与分析

    1)、虽然编码为数字编码,但如“001”、“010”类型的编码不能使用int类型数组进行存储,因为编码为字符串类型,尝试用二维字符数组去存储它们,考虑到还有字符串长度等变量,可以使用一个Code的结构体去存储。

    2)进行判断的第一步,首先考虑S0内部若码字ωωi的前缀,即ωiωjA,则将后缀1中的元素构造1。否则,可以直接判定该编码为唯一可译码。

    3)从新产生的集合中拿出一个元素,从原始集合S0中拿出一个元素找有没有一个码字是另一个码字的前缀这种情况如果有就将后缀放入更新的集合中

    4)、比较构造的S1,S2,…集合中没有一个含有0中的码字此编码即为唯一可译码否则该编码不是唯一可译码第4章 程序实现与测试

    程序运行截图如下

    输入唯一可译码:01、10、00、11

    输入非唯一可译码:00、101、001、100、111、000

    第5章 结 论

    在定理“对任意的正整数N,如果一种编码方法的N次扩展码都是非奇异的,则该编码方法就是唯一可译码”对唯一可译码的判定显然在实际应用中很难发挥作用,因为不可能一一检查所有N次扩展码的奇异性。但可以通过构造后缀集合的方式,在结论“一种码是唯一可译码的充要条件是S1,S2,…集合中没有一个含有0中的码字1,S2,…集合参考文献

    [1] /view/c818007201f69e3143329426.html

    [2] 姜楠.王健 .北京:清华大学出版社.2010年5月.

    附录:源程序清单

    #include

    #include

    struct Code

    {

    char code[100][10];

    int len[100];

    int p; //码字或尾缀的个数

    };

    int main()

    {

    struct Code s[100],F,C;

    int N,i,j,l,t,p;

    printf("输入码字的个数: ");

    scanf("%d",&N);

    printf("输入编码:");

    for(i=0;i

    {

    scanf("%s",s[0].code[i]);

    s[0].len[i]=strlen(s[0].code[i]);

    }

    s[0].p=N;

    F.p=0;p=0;

    //循环结束条件为新的尾缀和F中的尾缀比较若没有新的尾缀出现

    while(1) //使循环一直执行下去,以break形式跳出

    {

    C.p=0;

    s[p+1].p=0;

    for(i=0;i

    {

    for(j=0;j

    {

    if(i==j&&p==0)continue;

    if(s[0].len[i]>=

    展开全文
  • 唯一可译码判别方法

    2011-11-18 14:45:33
    唯一可译码 判别的 matlab源程序 信息论作业
  • 唯一可译码的c++实现

    2021-11-23 11:08:01
    唯一可译码的c++实现
  • 信息论与编码课程中的哈夫曼编码与唯一可译码的课程设计过程代码及总结
  • #include #include void main() { char a[100][10],F[100][5]; int i,j,k,t,T,s1,s2,s3,s4,N;...n { if(strcmp(a[i],F[n])==1) printf("不是唯一可译码"); else printf("是唯一可译码"); } } } 编码得按由短到长输入

    #include

    #include

    void main()

    {

    char a[100][10],F[100][5];

    int i,j,k,t,T,s1,s2,s3,s4,N;

    int n=0,m=0;

    printf("输入你要判断的码组个数:\n");

    Scanf("%d",&N);

    printf("输入你要判断的码组:\n");

    for(i=0;i

    scanf("%s",a[i]);

    printf("输入的码是:\n");

    for(i=0;i

    {

    printf("%s\n",a[i]);

    }

    for(i=0;i

    {

    for(j=1;j

    {

    s1=strlen(a[i]);

    s2=strlen(a[j]);

    if(s1>s2)

    {

    for(k=0;k

    {

    if(a[i][k]==a[j][k])

    {

    k++;

    if(a[j][k]='\0')

    {

    for(k=strlen(a[j]);k

    {

    F[n][m++]=a[i][k];

    }

    n++;

    }

    }

    else k=strlen(a[j]);

    }

    }

    else

    { if(s1

    {

    for(k=0;k

    {

    if(a[i][k]==a[j][k])

    k++;

    if(a[i][k]='\0')

    {

    for(k=strlen(a[i]);k

    {

    F[n][m++]=a[j][k];

    }

    n++;

    }

    else k=strlen(a[i]);

    }

    }

    else continue;

    }

    }

    t=n;break;

    }

    for(i=0;i

    {

    for(n=0;n

    {

    s3=strlen(a[i]);

    s4=strlen(F[n]);

    if(s3>s4)

    {

    for(k=0;k

    {

    if(a[i][k]==F[n][k])

    {

    k++;

    if(F[n][k]='\0')

    {

    for(k=strlen(F[n]);k

    {

    F[t][m++]=a[i][k];

    }

    T++;

    }

    }

    else k=strlen(F[n]);

    }

    }

    else

    { if(s3

    {

    for(k=0;k

    {

    if(a[i][k]==F[n][k])

    k++;

    if(a[i][k]='\0')

    {

    for(k=strlen(a[i]);k

    {

    F[t][m++]=a[i][k];

    }

    t++;

    }

    else k=strlen(a[i]);

    }

    }

    else continue;

    }

    }

    T=t;break;

    }

    for(i=0;i

    {

    for(n=0;n

    {

    if(strcmp(a[i],F[n])==1)

    printf("不是唯一可译码");

    else

    printf("是唯一可译码");

    }

    }

    }

    编码得按由短到长输入

    展开全文
  • 已知:信源符号个数q,码字集合C; 输入:任意码字个数C与每个具体的码字在程序具体运行时从键盘输入; 输出:判别结果(是否唯一可译码
  • C语言实现唯一可译码

    2013-06-12 13:10:09
    C语言实现唯一可译码,思路清晰,代码简单易懂。 #include #include #define maxlen 1024 char info[maxlen][maxlen]; char s[maxlen][maxlen]; int num=0; //s字符串计数 bool info_check(int count) { int i...
  • 实验2: 唯一可译码判决准则一、实验目的1.进一步熟悉唯一可译码判决准则;2.掌握C语言字符串处理程序的设计和调试技术。二、实验要求和注意事项1.输入:任意的一个码字集合。码字个数和每个具体的码字在运行时从...
  • c++实现唯一可译码判别 信息论

    千次阅读 2019-11-09 20:41:43
    用递归算法实现 #include #include #include #include using namespace std; set <string> s;...bool cheak(string f,int ch,string c[],int n){ ... cout这不是唯一可译码"; } return 0; }
  • 唯一可译码判定代码

    2014-04-15 13:24:23
    这个唯一可译码写的不够简便,但经过测试能够满足对一串码字的唯一可译的判定这样的需求。代码很好理解。适合初学者
  • 唯一可译码的判别.pdf

    2021-10-08 02:56:26
    唯一可译码的判别.pdf
  • 针对现存判别唯一可译码的 方法(即:根据异前级码来进行判断的方法以及A.A.Sardinas 和C.W.patterson判断法)所存 在的不确定性、大运算童等问题,提出一种方法对非唯一可译码作出准确判断。该方法具有判 别简单,运算...
  • 编程实现唯一可译码的判决准则―――Sardinas-Patterson算法 随便给出一组码字,即可判断其是否可译。而且能够输出其全部的后缀集合。 代码为绝对原创,故分值设定有点高,望谅解。不过资源你绝对会满意的。
  • 唯一可译码判定 编程实现唯一可译码判定 c
  • 清晰的唯一可译码判决准则.pdf
  • 唯一可译码源码

    2011-11-21 16:56:11
    我编写的一个唯一可译码测试程序。非常好用,欢迎大家下载。
  • 唯一可译码判定源码

    2013-12-17 14:18:17
    一个图像化界面下完成对信息编码中唯一可译码的判定
  • [求助]唯一可译码判决准则问题//这个程序有什么问题?那位大哥能把他变成c语言版的唯一可译码判决准则:已知:信源符号个数,码字集合C。算法:1. 考查 中所有的码字,若 是 的前缀,则将相应的后缀作为一个尾后缀...
  • 信息论课程设计报告(唯一可译码lzw编码算数编码)1.判定唯一可译码2.LZw编码3.算数编码一 判定唯一可译码任务说明输入:任意的一个码(即已知码字个数及每个具体的码字)输出:判决结果(是/不是)输入文件:in1.txt,含...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,208
精华内容 2,883
关键字:

唯一可译码