【问题标题】:Is a PHP SplHeap really a Heap?PHP SplHeap 真的是堆吗?
【发布时间】:2012-08-05 10:22:01
【问题描述】:

堆的 PHP 实现真的是一个完整的实现吗?

当我阅读这篇文章 http://en.wikipedia.org/wiki/Heap_%28data_structure%29 时,我了解到子节点具有特定的父节点,并且父节点具有特定的子节点。

然而,当我查看 PHP 文档中的示例 http://au.php.net/manual/en/class.splheap.php 时,似乎子节点都共享相同的“级别”,但具体的父/子信息并不重要。

例如,PHP 示例中排名第 10 的三个节点中的每一个的父节点是哪个节点?

在我的应用程序中,当用户选择“节点 156”时,我需要知道它的孩子是谁,以便我可以访问他们每个人。 (我可以将他们的身份设为“节点 1561”、“节点 1562”等,因此关系很明显)。

PHP Heap 实现是否不完整?我应该忘记Spl课程并走自己的路吗?或者我错过了关于堆应该如何操作的一些东西?或者我应该查看一个特定的堆变体?

谢谢大家!

【问题讨论】:

  • 我在 Google 上找到了this open source project。实际上这不是您要查找的内容,但您可以尝试使用此脚本进行测试以自行获取结果。

标签: php spl


【解决方案1】:

此堆实现的 API 不允许数组访问,这是您在这种情况下所需要的。堆通常用于实现其他允许您轻松从顶部移除项目的结构。

您可以创建一个包装迭代器来寻找您需要的位置。我怀疑这将是一个性能不佳的解决方案,而不是一个很好的解决方案。


在这种情况下,我认为您需要BinaryTree。给定树上的一个点,您可以向下走,因为它们是直接相连的。我确实有一个BinarySearchTree 可以让树保持有序,您可以致电getRoot 获取BinaryTree 的副本。还有一个AvlTree 将保持树平衡以获得最佳搜索。

【讨论】:

    【解决方案2】:

    堆通常用于回答围绕“集合中的最大/最小元素是什么”的问题。

    虽然堆可以巧合地有效地回答“谁是最大/最小节点的子节点”,但当您需要访问任意节点来回答您的问题时,堆并不是一个很好的数据结构(一个不是最大节点的节点)。如果需要表示和维护特定的父子关系,它也不是要使用的数据结构,因为子节点可以并且确实在不同的父节点之间交换。

    所以基于这些理由,php 的堆实现绝对不是不完整的。您只需要一个不同的数据结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-11
      • 2013-02-01
      • 2013-06-11
      • 2014-08-02
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 2013-05-25
      相关资源
      最近更新 更多