PHP SplHeap真的是一个堆吗


Is a PHP SplHeap really a Heap?

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

当我读到这篇文章时,http://en.wikipedia.org/wiki/Heap_%28data_structure%29,我认为子节点有一个特定的父节点,而父节点有特定的子节点。

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

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

在我的应用程序中,当用户选择"节点156"时,我需要知道它的孩子是谁,这样我就可以给他们每人一次访问。(我可以将他们的身份设为"节点1561"、"节点1562"等,所以关系很明显)。

PHP堆实现是否不完整?我是不是应该忘记Spl课程,走自己的路?还是我遗漏了堆应该如何操作的一些内容?或者也许我应该考虑一个特定的堆变体?

非常感谢!

此堆实现的API不允许数组访问,这正是您在本例中所需要的。堆通常用于实现其他结构,这些结构允许您轻松地从顶部移除项目。

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


在这种情况下,我认为您需要BinaryTree。如果树上有一个位置,你可以往下走,那就是孩子们,因为他们是直接联系在一起的。我有一个BinarySearchTree,它将保持树的有序,您可以调用getRoot来获取BinaryTree的副本。还有一个AvlTree,它将保持树的平衡,以进行最佳搜索。

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

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

因此php的堆实现在这些方面肯定不是不完整的。您只需要一个不同的数据结构。