【问题标题】:Array-backed heap structures for JavaJava 的支持数组的堆结构
【发布时间】:2013-01-09 18:28:38
【问题描述】:

我正在寻找优先级队列的堆结构,可以使用Object[] 数组而不是 Node 对象来实现。

二进制堆当然工作得很好,n 元堆也是如此。 Java 的java.util.PriorityQueue 是一个二进制堆,使用Object[] 数组作为存储。

还有很多其他堆,例如斐波那契堆,但据我所知,这些需要使用节点来实现。从我的基准测试来看,我的印象是管理所有这些节点对象所付出的开销可能会消耗掉所有获得的收益。我发现很难实现一个可以与简单的数组支持的二进制堆兼容的堆。

所以我目前正在寻找高级堆/优先级队列结构,它们也没有使用Node 对象的开销。因为我希望它在现实中更快,而不仅仅是在复杂性理论中更好……而且在现实中发生了更多事情:例如 CPU 有 L1、L2 和 L3 缓存等,它们确实会影响性能。

我的问题也集中在 Java 上,因为我在这里对内存管理几乎没有影响,并且没有像 C 中那样的structs。很多堆在由于内存管理开销和垃圾收集成本,用 C 实现在 Java 中变得昂贵。

【问题讨论】:

    标签: performance algorithm data-structures heap priority-queue


    【解决方案1】:

    可以通过这种方式实现几种不常见的堆结构。例如,the Leonardo Heap used in Dijkstra's smoothsort algorithm 通常实现为一个增加了两个机器字的数组。与二叉堆一样,数组表示是特定树结构(或者更确切地说是森林,因为它是树的集合)的数组表示。

    poplar heap structure 是作为理论上效率稍低但实际上效率更高的堆结构引入的,具有相同的基本思想 - 数据表示为具有一些额外小的状态信息的数组,并且是森林结构的压缩表示.

    更规范的基于数组的堆是d-ary heap,它是二叉堆的自然概括,具有 d 个子代而不是两个。

    作为一个非常愚蠢的例子,排序数组可以用作优先级队列,尽管它非常低效。

    希望这会有所帮助!

    【讨论】:

    • 谢谢,我会看看杨树和莱昂纳多堆。我已经玩过 n 元堆,例如 4 元堆在大多数情况下似乎要快一些。
    • 你能指出这些的任何实现吗?似乎每个人都只使用二进制堆。由于 C++ 具有强大的优化分配器,Boost 还带有一个斐波那契堆。但是对于 poplar 和 leonardo heap,我都找不到任何真正的实现;更不用说基准测试了。
    猜你喜欢
    • 2011-07-07
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多