6

堆的 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课程并走自己的路吗?或者我错过了关于堆应该如何操作的一些东西?或者也许我应该查看一个特定的堆变体?

多谢!

4

2 回答 2

8

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

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


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

于 2012-11-29T17:59:24.653 回答
4

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

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

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

于 2012-10-14T22:18:25.583 回答