以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 计算机考研交流 』   (http://bbs.xml.org.cn/list.asp?boardid=67)
----  关于课本堆代码的一个问题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=67&rootid=&id=54873)


--  作者:shun
--  发布时间:11/4/2007 9:16:00 PM

--  关于课本堆代码的一个问题
remove函数(121页)
//删除给定下标的元素
remove(int pos, T& mode)
{
if((pos<0)||(pos>=currentsize))
   return false;
T temp = heapArray[pos];
heapArray[pos] = heapArray[--currentsize];
SiftUp(pos);
SiftDown(pos);
node = temp;
return true;
}

问:在最小堆中,这段函数中的SiftUp(pos)是不是没起到作用呀??


--  作者:lionx
--  发布时间:11/4/2007 9:47:00 PM

--  
不是。其实这里的siftup和siftdown只有一个起到作用。但不知道是哪个,所以都用。如果堆的内容是1,100,80,150,300,210,85(按照完全二叉树的结构),那么删除150的时候,85替换150的位置,故需要siftup
--  作者:shun
--  发布时间:11/5/2007 8:48:00 AM

--  
o这样,thank u
--  作者:hanshumin
--  发布时间:11/11/2007 11:03:00 PM

--  
我感觉应该分类讨论一下。因为待删除的结点要与最后一个结点交换。当交换后,待删除的结点所在的位置的值是最后一个结点值的大小,此时它有可能比先前删除的结点小,大或者相等。如果相等,就不用作什么工作,如果小的话,只需要SIFT UP(),如果大的话,只需要SIFT DOWN().大家认为呢?

--  作者:buddha
--  发布时间:11/13/2007 12:39:00 PM

--  
没有必要吧,要讨论反而增加判断时所需要的开销.并没有对算法在时间上起到化简.
再者,其实在这里.siftup和siftdown执行其一且只能执行其一,所以说,程序本身就能起到判断的作用了。我们又何必要再去画蛇添足呢...
--  作者:fgffggfg
--  发布时间:11/13/2007 2:55:00 PM

--  
欲知详情如何,请看授课录象呵呵~
--  作者:lionx
--  发布时间:11/14/2007 11:27:00 AM

--  
可能是出于低藕合的考虑吧……
--  作者:buddha
--  发布时间:11/14/2007 12:39:00 PM

--  
呵呵,看来是想错了。
加判断后会有一种情况不执行.引入了多余的操作的同时也能减少一些操作.
mzhang的授课录象上的话好象是,可以加上判断条件,这样可以提高程序的可读性..
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms