查看: 2310|回复: 4

[通用发布] 【演算法】Ruby 裡的 Heap

[复制链接]
梦石
0
星屑
50
在线时间
193 小时
注册时间
2013-3-24
回帖
427
发表于 2013-12-19 22:22:07 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
最近想寫個尋路演算法的時候,查了一下,找不到RGSS裡面有Priority queue(heap)....

沒有Heap怎麼弄A*阿...

所以就很無聊的把C++裡面STL的Priority queue包成個DLL檔,這樣就有Heap可以用了
p.s.這是最大堆

用法:

[pre lang="ruby" line="1"]
$Heap_is_empty = Win32API.new('heap.dll', 'is_empty', 'v', 'i') #檢查是否為空
$Heap_clear = Win32API.new('heap.dll', 'clear', 'v', 'v') #清空
$Heap_push = Win32API.new('heap.dll', 'push', 'ii', 'v') #放入,第一個為優先度,第二個為儲存之數值
$Heap_top = Win32API.new('heap.dll', 'top', 'v', 'i') #取頂部,回傳第二個數值
$Heap_pop = Win32API.new('heap.dll', 'pop', 'v', 'v') #推出

$Heap_clear.call()
$Heap_push.call(1,2)
$Heap_push.call(3,4)
$Heap_push.call(-1,9)
if $Heap_is_empty.call() == 0
  p $Heap_top.call()  #4
  $Heap_pop.call()
  p $Heap_top.call()  #2
  $Heap_pop.call()
  p $Heap_top.call()  #9
  $Heap_pop.call()
end
[/pre]

話說我存xy座標是把一個int拿來當兩個short用(座標不會超過30K嘛

heap.rar

208.59 KB, 下载次数: 66

Heap

老黄鸡

梦石
4
星屑
45694
在线时间
7948 小时
注册时间
2009-7-6
回帖
13337

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2013-12-19 23:27:27 | 显示全部楼层
本帖最后由 fux2 于 2013-12-19 23:43 编辑

数组就可以替代heap吧,你用push(<<)和pop以及shift和unshift就行。
你要在RM里写A*用table配合数组我想不到有什么比ruby更好写的了。
要是有强迫症一定要用heap你可以用hash更无脑。
如果还是写不出来那么很遗憾朋友我只能说你要么对ruby理解不深要么对A*理解不够。

PS:补充一下,楼主是不是不知道ruby的数组可以装任意类型……而且不用是单一类型。数组里面套数组也是被允许的。

点评

STL的堆求最小值的时间复杂度比数组遍历低  发表于 2013-12-22 01:20
RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

梦石
0
星屑
266
在线时间
2355 小时
注册时间
2009-3-13
回帖
2257

贵宾

发表于 2013-12-19 23:58:53 | 显示全部楼层
怎么写DLL呢,可以给个比较简单源码看看吗?不知楼主用的什么编译器,我用的是VS2010
回复

使用道具 举报

头像被屏蔽
梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
回帖
1577

开拓者

发表于 2013-12-20 00:22:21 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

梦石
0
星屑
50
在线时间
466 小时
注册时间
2013-2-8
回帖
420
发表于 2013-12-21 00:16:54 来自手机 | 显示全部楼层
不错,虽然数组也差不多....
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部