社区
数据结构与算法
帖子详情
高分求助
upstream
2000-06-28 11:50:00
一个数组,比如int shuzu[]={1,0,0,1,0...},元素仅限于0和1,即一个二进制流。
另外,比如a={0,0,1},b={1,0,1,0},c={1,0},d={1,1,1,1,1}...一直到z。
注意,a,b,c,d,e...z的元素个数是不一致的。请问:我以上面的数组shuzu为输入,
怎样解析出下面的字母?
...全文
425
22
打赏
收藏
高分求助
一个数组,比如int shuzu[]={1,0,0,1,0...},元素仅限于0和1,即一个二进制流。 另外,比如a={0,0,1},b={1,0,1,0},c={1,0},d={1,1,1,1,1}...一直到z。 注意,a,b,c,d,e...z的元素个数是不一致的。请问:我以上面的数组shuzu为输入, 怎样解析出下面的字母?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
22 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
yoursoft
2000-07-05
打赏
举报
回复
采用二叉树编码(sanhan)是最快的办法.不过二叉树的结构稍微调整一下:
假设:a={1,0},b={1,0,1,0},c={0,0,1},d={1,0,1,0,0,1}...
先建造如下二叉树:节点的左右指针为空表示为非法字符.同时,每个节点增加一个字节成员(下图以中括号表示),保存对应的字母.如果此字节=0,表示没有字母对应,继续向下一层比较.如果!=0,取出字节,返回到[head]作下一个元素的比较.
此段程序缺省将优先考虑段的编码.(如果考虑shuzu[]必须需要正好取完,那么需要回溯,而且很可能有歧义性,除非字母的编码确定时已经考虑或按长度考虑重码部分的歧义性).
[head]
/
0 1
/ \ / 0 nul 0[a] nul
/ \ /
nul 1[c] nul 1[b]
/
0 nul
/
0 nul
/
nul 1[d]
程序:
int shuzu[]={1,0,0,1,0,1,0,.......};
struct RTree
{
RTree *pIs0;
RTree *pIs1;
char c;
RTree(void)
{
pIs0=NULL;
pIs1=NULL;
c=0;
}
}
RTree *GetTree(char **zimu)
{
RTree *head,*tempNode,*newNode;
head=new RTree;
for(int i=0;i<26}
{
tempNode=head;
for(int j=0;j<strlen(*(zimu+i));j++)
{
if(*(*(zimu+i)+j)=='0')
{
if(tempNode->pIs0==NULL)
{
newNode=new RTree;
tempNode->pIs0=newNode;
}
}
else
{
if(tempNode->pIs1==NULL)
{
newNode=new RTree;
tempNode->pIs1=newNode;
}
}
tempNode=newNode;
}
if(tempNode->c!=0)
{
ShowMessage("有重码!");
return NULL;
}
tempNode->c='a'+i;
}
return head;
}
void main()
{
//假设已经有char **zimu的数据,shuzu[]已经存在
RTree *tempNode,*head;
char **zimu;
int i;
//InitZiMu(zimu);此处获得字母对应的01序列字符.
head=GetTree(zimu);
int len=1000;//len=shuzu数组大小.
for(i=0,tempNode=head;i<len;i++)
{
if(shuzu[i]==0)
tempNode=tempNode->pIs0;
else
tempNode=tempNode->pIs1;
if(tempNode==NULL)
{
ShowMessage("有非法字符!");
return;
}
if(tempNode->c!=0)
{
printf("%c",tempNode->c);
tempNode=head;
}
}
}
upstream
2000-07-05
打赏
举报
回复
再一次谢谢大家。
Tyro:
如果shuzu输入出错,会出现不能够完全分解,应该扔掉其中的某一位。
至于具体的优先级,应该与算法无关。
茂奇软件
2000-07-05
打赏
举报
回复
key tree.
Xiao
2000-07-04
打赏
举报
回复
这种问题就是用Sanhan所说的方法,构造一个二叉树,每棵树的左支代表0,右支代表1,叶子结点为各个字母。然后根据输入流遍历二叉树(若遇到0则沿左支走,1沿右支走)。不过从你给出的数据来看,会需要一点额外处理,因为c与b的部分编码重合。
guofupei
2000-07-04
打赏
举报
回复
crazy!
every one crazy!
upstream
2000-07-04
打赏
举报
回复
各位兄弟 姐妹:
不好意思,我不是学计算机的,没学过数据结构。
Tyro
2000-07-04
打赏
举报
回复
re:upstream
shuzu是否一定能够完全分解呀?是否要考虑分解不完全的情况?
优先级到底是怎么定义的?
Tyro
2000-07-04
打赏
举报
回复
wwqbj的方法好像有问题呀!比如shuzu长度为8,a长度为3,b长度为6,c长度为5,
如果shuzu能够分解成c、a,那么就应该分解成c,a,而不应该是b呀!
upstream
2000-07-03
打赏
举报
回复
hongfei:
能示范一端代码吗?
spinner
2000-07-03
打赏
举报
回复
就是霍夫曼编码嘛,数据结构书上一般都有的
hongfei
2000-07-01
打赏
举报
回复
please use the tree of the most short path and refer to <data structure> of the tsinghua express
hongfei
2000-07-01
打赏
举报
回复
please use the most short path tree and refer to <data structure> of tsinghua express
upstream
2000-06-29
打赏
举报
回复
谢谢大家的帮助。
ta:
你理解的对。
raining:
你考虑的很充分,是有优先级。
halfdream:
我不知道摩尔斯电报码是怎么回事,你能解释一下吗,我指的是摩尔斯电报码的原理
和处理算法。
wwqbj:
你的方法我想过,但对于26个字母,switch case太罗嗦了,不知道有没有更好的算法。
sanhan:
你的方法,能否写成代码贴上来,我不是学计算机专业的,对数据结构了解不多。
wwqbj已经解释了优先级问题,所以,编码没问题。
halfdream
2000-06-29
打赏
举报
回复
判断优先级应该是不行的。
难道能不允许'bbs' 或'bbc'或‘cbuilder' 之类的组合同时出现吗?
ta
2000-06-28
打赏
举报
回复
你的解析是什么意思?
from int shuzu[] get out the a ,b ,c ... dependent on this meaning.
upstream
2000-06-28
打赏
举报
回复
我不懂VB.
Un1
2000-06-28
打赏
举报
回复
应该和VB中Instr函数的算法差不多。
sanhan
2000-06-28
打赏
举报
回复
b={1,0,1,0},c={1,0}应该算是编码有问题。
sanhan
2000-06-28
打赏
举报
回复
构造一个二叉搜索树,叶子分别为a,b,c...,z和“非法字符”
来一个位就搜索一层,直至叶子。
如果树能够构造,应该不会有歧义。
wwqbj
2000-06-28
打赏
举报
回复
1 确定一个优先规则:优先判断长码(也可以短优先)
2 逐个解析子串。示例如下
BOOL Get(char ch,int * shuzu)
{
BOOL bResult;
bResult = FALSE;
swich(ch)
{
case 'A': // 定义 A = {0,0,1}
if((shuzu[0] == 0) && ((shuzu[1] == 0) && ((shuzu[2] == 1))
bResult = TRUE;
break;
case 'B':// B = {1,0,1,0}
...
break;
....
}
return bResult;
}
void ProcessZhuzu(int * source /* 待处理的shuzu */)
{
int nLen = /shuzu 长度/
int nPtr;
nPtr = 0;
// 判断的顺序以1确定的优先规则为准 这里假设 B 的码比 A 长
while(nPtr < nLen)
{
if(Get('B',&source[nPtr])) // 判断是否是 B
{
nPtr += // B的长度
}
else
if(Get('A',&source[nPtr])) // 判断是否是 A
{
nPtr += // A的长度
}
else
...
else // 什么都不是
nPtr ++; // 必须有,否则会陷入死循环
}
}
3 如果你作过一些表达式分析计算的程序,相信上面的算法很好理解。
4 祝你成功 !
加载更多回复(2)
基于SpringBoot+Vue+Web的校园爱心捐赠互助管理系统设计与实现(源码+数据库+文档).zip
基于SpringBoot+Vue+Web的校园爱心捐赠互助管理系统设计与实现(源码+数据库+文档).zip
高分
通过项目,已获导师指导。 本项目是一套基于Springboot的校园爱心捐赠互助管理系统,主要针对计算机相关专业的正在做毕设的...
基于 SpringBoot+Vue 的的智慧养老平台+数据库(Java毕业设计,包括源码,教程).zip
毕业设计、期末大作业、课程设计、
高分
必看,下载下来,进行简单部署,就可以使用。文章地址:https://blog.csdn.net/JasonXu94/article/details/129678872 包含:项目源码、数据库脚本、软件工具、项目说明等,该...
软考高项论文50分秘籍——心法篇
讲师以52分和53分通过论文,2次
高分
通过,方法论经得起考验
基于SSM+JSP+MySQL的在线捐赠系统设计与实现(源码+数据库+文档)
基于SSM+JSP+MySQL的在线捐赠系统设计与实现(源码+数据库+文档).zip
高分
通过项目,已获导师指导。 本项目是一套基于SSM的医在线捐赠系统,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的Java学习者...
java毕业设计-基于SSM+JSP+MySQL的在线捐赠系统设计与实现(源码+数据库+文档).zip
基于SSM+JSP+MySQL的在线捐赠系统设计与实现(源码+数据库+文档).zip
高分
通过项目,已获导师指导。 本项目是一套基于SSM的医在线捐赠系统,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的Java学习者...
数据结构与算法
33,008
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章