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

49c1c3150d0537f8f0447daee947f0d4.png

慕前端131612

#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_FILEint main(){#ifdef TEST_BY_FILEfreopen("in","r",stdin);#endifpCharVector VCode;int nCodeNum;int i;char chContinue;do{cout<>nCodeNum;cout<>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<>chContinue;} while(toupper(chContinue) == 'Y');#ifdef TEST_BY_FILEfclose(stdin);#endifreturn 0;}int IsPrefix(const char* chPrefix,const char* chWord){assert(chPrefix != NULL && chWord != NULL);int nLenPrefix,nLenWord;nLenPrefix = strlen(chPrefix);nLenWord = strlen(chWord);//前缀长度大于整个词的长度,返回falseif (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的后缀填入CodePostfixPushBackUniqueValue(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<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值