高分求助

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为输入,
怎样解析出下面的字母?
...全文
426 22 打赏 收藏 转发到动态 举报
写回复
用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)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧