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)。