chen-w
8/12/2017 - 9:58 PM

hash heap

hash heap

heap虽然是一个树行结构,但是可以用数组来实现。
对于任意的一个位置i,其父亲节点是(i-1)/2,其左孩子右孩子为i*2+1和i*2+2。 

push操作:O(logn)
把元素加到数组末尾(O(1)),然后做sift up(O(logn)),如果比父亲大,与父亲交换。如此重复。

pop操作:
把堆顶元素与末尾元素交换。然后把末尾元素删掉并return数值。然后对堆顶元素做sift down操作(O(logn))。 

peek操作:
直接取数组第一个元素(O(1))

remove操作:
 java remove:for循环遍历整个数组找到目标元素(O(n)),然后把目标与数组末尾元素交换,把目标删掉,然后再把被交换的前数组末尾元素进行sift(O(logn)),有可能上,有可能下。

优化的remove操作:
利用hash来做。这样的数据结构叫做hash heap。
所有的元素建立哈希表,指向堆中的位置。
现在就不需要用for循环查找了,直接用hash来查找。(O(1))
然后交换目标元素与数组末尾元素。
最后做sift up/down。O(logn)。