2009-08-30 75 views
2

我一直在使用Java的斐波那契堆实现约一周。这是基于CLRS书籍的实现。斐波那契堆问题

我想看看是否可以在我正在开发的一个侧项目中使用它,而不是使用Java的默认PriorityQueue。 [Java中的默认实现是基于数组的,更多的是本地的。尽管复杂程度越来越高,它仍可能超越F堆。

我的问题似乎源于去除min元素后合并部分的堆。我一直在抛出arrayindexoutofboundsexceptions。特别是在while循环中,当它合并具有相同程度的所有节点时。它超出了D()函数设置的界限。

因此,无论我的D()函数是错误的,我不认为它,或其他事情正在发生。最有可能的副作用相关。代码here。我一直试图调整这一周,现在运气好。我错过了明显的东西吗?

回答

1

您将需要检查分析,因为我不确定节点度数的上限是否应该不是最低限度。在你的D函数中,你的转换为int将截断小数部分。将此更改为四舍五入似乎可以清除索引越界错误。

虽然似乎还有一个额外的问题。我没有找到什么条件,但是儿童名单可能最终没有一个名单。由于循环遍历子列表,这会导致removeMin中的无限循环,因为它们是循环的。