我发现了很多MinMax Heap实现,它们将数据存储在一个数组中。它实际上很容易实现,这就是我寻找不同的东西的方式。我想创建一个MinMax Heap,只使用Heap的元素,指向左子和右子的指针(以及afcourse一个要比较的键)。所以Heap只有指向根对象的指针(最低级别),而根对象有一个指向他的孩子的指针(最高级别),依此类推。我知道如何插入一个新对象(通过使用int的二进制表示根据堆大小找到正确的路径),但我不知道如何实现其余的(向上(向下)元素,找到父或祖父母)
寻求帮助
答案 0 :(得分:2)
使用堆有序二进制树的优先级队列可以使用三重链表结构而不是数组来实现。每个节点需要三个链接:两个用于遍历,一个用于遍历。
答案 1 :(得分:1)
heapq module source code显示实施上下推送的步骤。要从数组实现切换到指针实现,请将arr[2*n+1]
计算替换为node.left
,将arr[2*n+2]
替换为node.right
。对于arr[(n-1)>>1]
之类的父引用,每个节点都需要一个指向其父节点node.parent
的指针。
或者,您可以采用功能样式,使这一切都非常容易实现。我发现treaps implemented in Lisp的代码是如何做到这一点的灵感。
答案 2 :(得分:0)
作为长期任务的一部分,我已经解决了这个问题。您可以找到它here
我在Java和C ++中有多种实现,使用带和不带数组的MinHeap。请参阅我的Java实现以获取解决方案。是的,在没有数组的情况下实现堆非常有可能。您只需要记住在哪里插入下一个节点,以及如何进行堆化和反向堆化。
Edit1:我还试图查找没有数组的最小堆的任何现有解决方案,但找不到任何解决方案。因此,我将其发布在这里,以便对希望了解此方法的任何人有所帮助。
答案 3 :(得分:0)
是的,您可以在不依赖数组的情况下实现它。 我个人依靠二进制计数器。 这是我在c中的实现(https://github.com/mohamedadnane8/HeapsUsingPointers)。 请注意,这仍然是使用log(n)的非常快速的实现。
1 => binary "1"
2=> "10" 3=> "11"
4=> "100" 5= "101" 6="110" 7="111"
在此程序中,我尝试使用数字序列进行插入和删除,因为您可以在树上看到,您可以轻松地将树表示为二进制数字字符串。 二进制字符串中的第一个“ 1”将开始。 之后,由0和1组成的序列确定去往“ 1”的位置,这意味着向左移动,而“ 0”向右移动。
此外,请注意,此实现依赖于很小的字符或整数数组,这些数组使二进制数的计算速度更快,但是您可以依靠bin()函数将ur计数器转换为二进制数(我实现了该数组只是练习一点我的解决问题的能力)。 抱歉,如果我不能很好地解释它,我的沟通技巧会有些不足。
答案 4 :(得分:-2)
没有数组很难实现二进制堆。因为你应该在插入传递时保留所有父节点,然后进行操作上下推送。像那个[parent_1, parent_2 ... parant_k] and then if parent_(k+1) < parant_k pushUp
并重新安排他们的右孩子和左孩子