设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
12
返回列表 发新帖
楼主: 猫哥哥
打印 上一主题 下一主题

二叉堆[更新]

 关闭 [复制链接]

Lv1.梦旅人

有事烧纸

梦石
0
星屑
154
在线时间
509 小时
注册时间
2005-10-22
帖子
6982

贵宾VX城市地图大赛冠军第1届RMTV比赛冠军第1届TG大赛冠军

11
发表于 2008-3-18 01:09:22 | 只看该作者
以下引用美兽于2008-3-17 14:58:34的发言:

一般对于想快速需求最值的环境下,都能用的上,例如棋类搜索,评估等。

在处理大数据量时效果比较明显,数据量很小时反而显的累赘,与普通的二叉树相比强调节点顺序。


数据越多越能显示出其强大
但是如果只有几十个数据,那么用二叉堆是吃力不讨好的事情
比较适合有几千个数据的大型游戏使用

二叉堆的一个特点就是,只关心第一个数据是否是最值,不关心其后的数据的排列顺序

不过数据少的时候觉得用二分法插入数组其实更有效一点
神隐中,偶尔诈尸
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

12
发表于 2008-3-18 03:52:09 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

辉瑞中国首席研究员<

梦石
0
星屑
50
在线时间
142 小时
注册时间
2008-1-18
帖子
2129
13
发表于 2008-3-18 04:02:32 | 只看该作者
多么熟悉的二叉堆,久违了,让我想起了高中时的OI生涯
来6r就是等某位仁兄的巨坑

褴褛着身行无端,囊中羞涩空心酸。
平生几无得意事,倒塔泡面宅寝室。
惟羡隔壁高帅富,雨露春风月夜声。
青丝无处觅其踪,只有硬盘苍井空。
莫云男儿空悲愁,鸿鹄岂不天际游。
坐断天下执鹿首,千百金帛万兜鍪。
夜深忽梦某年月,再见女神欲语迟。
吊丝终有逆袭日,木耳再无回粉时。
回复 支持 反对

使用道具 举报

Lv2.观梦者

天仙

梦石
0
星屑
610
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

14
发表于 2008-5-8 14:24:16 | 只看该作者
我只是想提一下
堆的英文不是head而是heap{/pz}

MS沒人指出

另外在堆當中,MS不能有相等的值吧?
也就沒有父結點等於子結點的可能性了

還是我記錯了@@
VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

Lv1.梦旅人

有事烧纸

梦石
0
星屑
154
在线时间
509 小时
注册时间
2005-10-22
帖子
6982

贵宾VX城市地图大赛冠军第1届RMTV比赛冠军第1届TG大赛冠军

15
发表于 2008-5-8 16:59:04 | 只看该作者
为啥不能有相等情况呢?
求最值并不需要保证最值得唯一性的说
神隐中,偶尔诈尸
回复 支持 反对

使用道具 举报

Lv2.观梦者

天仙

梦石
0
星屑
610
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

16
发表于 2008-5-8 17:51:31 | 只看该作者
想起了
二元搜索樹(Binary Search Tree)才是要求不能相等的
因為搜索為目的,因此每個結點之值都是獨一無二的
{/hx}
VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

Lv1.梦旅人

有事烧纸

梦石
0
星屑
154
在线时间
509 小时
注册时间
2005-10-22
帖子
6982

贵宾VX城市地图大赛冠军第1届RMTV比赛冠军第1届TG大赛冠军

17
发表于 2008-5-8 18:21:05 | 只看该作者
二叉树的子孙太多鸟{/qiang}
神隐中,偶尔诈尸
回复 支持 反对

使用道具 举报

Lv1.梦旅人

雷欧纳德的宠物

梦石
0
星屑
50
在线时间
769 小时
注册时间
2006-8-6
帖子
3778

贵宾

18
发表于 2008-5-24 08:16:53 | 只看该作者
发布完毕。
http://rpg.blue/web/htm/news1067.htm
vip+4
打酱油的- -b
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

19
发表于 2008-6-1 04:06:33 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
7 小时
注册时间
2008-7-30
帖子
33
20
发表于 2009-4-21 02:24:12 | 只看该作者
刚才从技术区某帖找到了这一帖,猫哥哥总能写出一些很有趣的代码,呵呵~~~不过看了一下具体算法,感觉删除部分,存在问题....
运行一下这段:
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...所以这不是我们要的结果....
相信这只是猫哥哥一时疏忽造成的....改了一下代码,让它每次只与子节点中较小的比较,这样问题大概就能解决了...

  1. #--------------------------------------------------------------------------
  2.   # ● 删除
  3.   #--------------------------------------------------------------------------
  4.   def self.del(ar,pos) #从堆里删除数据
  5.    
  6.     if ar[pos - 1] !=nil
  7.     ar[pos - 1] = ar[ar.size - 1]; ar.pop
  8.    
  9.     loop do #比较子结点
  10.       pos_s1 = pos*2;pos_s2 = pos*2 + 1
  11.       if ar[pos_s1-1] == nil and ar[pos_s2-1] == nil #已经无子结点
  12.         break
  13.       elsif ar[pos_s2-1] == nil  #当右孩子为空时
  14.         pos_min = pos_s1     #最小节点值直接赋给左孩子
  15.       else
  16.        #比较出较小的节点
  17.        if ar[pos_s1-1] > ar[pos_s2-1]
  18.           pos_min = pos_s2
  19.         else
  20.           pos_min = pos_s1
  21.         end
  22.       end
  23.       if !fs(ar[pos-1],ar[pos_min-1])
  24.         ar[pos-1],ar[pos_min-1] = ar[pos_min-1],ar[pos-1]
  25.         pos = pos_min;next
  26.       end
  27.      
  28.         break
  29.     end
  30.    
  31.     return ar
  32.   end
  33. end
复制代码
Freedom!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-2 16:36

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表