静态查找中哨兵的作用

FirstMrWu 2011-07-23 07:58:42
数据结构第9章中顺序查找ADT如下:
int Search_Seq(SSTable,KeyType key)
{
ST.elem[0].key = key; //哨兵
for(i=ST.length; !EQ(ST.elem[i].key,key);--i) //从后往前找
return i;
}
书中说到,查找之前先对ST.elem[0]的关键字赋值key,目的在于免去查找过程中每一步都要检测整个表是否查找完毕。
这句话如何理解?每一次查找的时候不还得挨着找一遍吗?
不太理解这句话。烦请高手指导。
...全文
630 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
justlovetao 2011-07-26
  • 打赏
  • 举报
回复
就是那个作用撒。。。。
FirstMrWu 2011-07-26
  • 打赏
  • 举报
回复
你这样理解的话我好像能和4楼说的那个多加一个判断:i>0 能联系到一块了。我觉的也就是这个作用。
再等等,晚上结帖。哈哈。
justlovetao 2011-07-26
  • 打赏
  • 举报
回复
"检测整个表是否查找完毕",这样一句话对吧。你用哨兵的时候,你要检查吗?不要检查吧,因为返回0就表示表查找完毕。
但是你不用哨兵呢?你必须每一步判断是否表检查完毕,如果不检查,数组越界怎么办?

不知道我的思想对不对。。。。。
FirstMrWu 2011-07-26
  • 打赏
  • 举报
回复
哥,你断章取义了。
原话是这样的:目的在于免去查找过程中每一步都要检测整个表是否查找完毕。
我不明白的是什么情况下可以免去检测整个表?
FirstMrWu 2011-07-26
  • 打赏
  • 举报
回复
OK.
果断结帖了。
给4#。
qq675927952 2011-07-25
  • 打赏
  • 举报
回复
当要查找的元素目标数组里没有的话,一样要查找整个数组,只是有了哨兵 就可以 不用每次查找 都要判断是否在数组的末尾,
如有哨兵则

int Search_Seq(SSTable,KeyType key)
{
ST.elem[0].key = key; //哨兵
for(i=ST.length; !EQ(ST.elem[i].key,key);--i) //从后往前找
return i;
}


没有哨兵则

int Search_Seq(SSTable,KeyType key)
{
// ST.elem[0].key = key; //哨兵
for(i=ST.length; !EQ(ST.elem[i].key,key)&&i>0;--i) //从后往前找
return i;
return 0;
}

从以 上代码可以看出 没有哨兵,每次都 多了 一个 i>0的判断。。
justlovetao 2011-07-25
  • 打赏
  • 举报
回复
呵呵 我和你的理解不一样。“每一步都要检测整个表是否查找完毕”,当你设置哨兵的时候,返回0的时候你就知道找不到,但是你并没有用代码检测整个表是否完毕,而是用一个简单的哨兵就做到了。

FirstMrWu 2011-07-25
  • 打赏
  • 举报
回复
回1楼:
那如果不加这个的话,当都找不到的时候,也返回一个值(代表没找到)也就行了啊,比如说-1,干吗还得设置个这呢。不管有没有这个哨兵,还是得把目标数组里的每一个元素都过一次啊。
书上是这样说的:目的在于免去查找过程中每一步都要检测整个表是否查找完毕。
这句话不理解啊。这句的意思是当要查找的元素目标数组里没有的话,就不会查找整个表了?
不理解。麻烦解释一下。不胜感激中。
justlovetao 2011-07-25
  • 打赏
  • 举报
回复
哥。。不要查找。。叫它自己出来认?
“数据结构第9章中顺序查找”。自己都是这么说的。只能优化。优化。在优化。。哪有不干活有收获的?
这和现实是一样的
FirstMrWu 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 justlovetao 的回复:]

呵呵 我和你的理解不一样。“每一步都要检测整个表是否查找完毕”,当你设置哨兵的时候,返回0的时候你就知道找不到,但是你并没有用代码检测整个表是否完毕,而是用一个简单的哨兵就做到了。
[/Quote]

从两段代码上的确可以看出来有哨兵的好处,但这句话还是不理解:
只是有了哨兵 就可以 不用每次查找
我觉的有没有哨兵,每次查找的时候还得挨着查找一遍啊。
可否举例说明不用查找的情况?谢谢。
孤独小剑 2011-07-25
  • 打赏
  • 举报
回复
4楼正解……
justlovetao 2011-07-23
  • 打赏
  • 举报
回复
你想想:当目标在数组里面的时候,返回的是他的下标,也就是非0值,当都找不到的时候,但是由于有这句话ST.elem[0].key = key,所以查找到头的时候也找到了,只是这是人为的,返回0。所以,根据返回值可以确定。

33,007

社区成员

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

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