| 赞 | 0 |
| VIP | 0 |
| 好人卡 | 0 |
| 积分 | 1 |
| 经验 | 3145 |
| 最后登录 | 2013-10-4 |
| 在线时间 | 7 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 7 小时
- 注册时间
- 2008-7-30
- 帖子
- 33
|
刚才从技术区某帖找到了这一帖,猫哥哥总能写出一些很有趣的代码,呵呵~~~不过看了一下具体算法,感觉删除部分,存在问题....
运行一下这段:
ar = [1,2,3,4,5,6,7,8,9]
Binary_Head.new(ar)
ar = Binary_Head.del(ar,2)
p ar
ar = Binary_Head.del(ar,2)
p ar
出来的结果是:[1,4,3,8,5,6,7,9]
[1,8,3,9,5,6,7]
显然第一个结果是我们想要的,但第二个,却与我们要的最小二叉堆不符了,因为最小二叉堆其父节点总小于其子节点,而明显8会大于其子节点5...所以这不是我们要的结果....
相信这只是猫哥哥一时疏忽造成的....改了一下代码,让它每次只与子节点中较小的比较,这样问题大概就能解决了...
- #--------------------------------------------------------------------------
- # ● 删除
- #--------------------------------------------------------------------------
- def self.del(ar,pos) #从堆里删除数据
-
- if ar[pos - 1] !=nil
- ar[pos - 1] = ar[ar.size - 1]; ar.pop
-
- loop do #比较子结点
- pos_s1 = pos*2;pos_s2 = pos*2 + 1
- if ar[pos_s1-1] == nil and ar[pos_s2-1] == nil #已经无子结点
- break
- elsif ar[pos_s2-1] == nil #当右孩子为空时
- pos_min = pos_s1 #最小节点值直接赋给左孩子
- else
- #比较出较小的节点
- if ar[pos_s1-1] > ar[pos_s2-1]
- pos_min = pos_s2
- else
- pos_min = pos_s1
- end
- end
- if !fs(ar[pos-1],ar[pos_min-1])
- ar[pos-1],ar[pos_min-1] = ar[pos_min-1],ar[pos-1]
- pos = pos_min;next
- end
-
- break
- end
-
- return ar
- end
- end
复制代码 |
|