130. Heapify

作者: 鸭蛋蛋_8441 | 来源:发表于2019-07-01 14:33 被阅读0次

Description

Given an integer array, heapify it into a min-heap array.

For a heap array A, A[0] is the root of heap, and for each A[i], A[i * 2 + 1] is the left child of A[i] and A[i * 2 + 2] is the right child of A[i].

Clarification

What is heap?

Heap is a data structure, which usually have three methods: push, pop and top. where "push" add a new element the heap, "pop" delete the minimum/maximum element in the heap, "top" return the minimum/maximum element.

What is heapify?

Convert an unordered integer array into a heap array. If it is min-heap, for each element A[i], we will get A[i * 2 + 1] >= A[i] and A[i * 2 + 2] >= A[i].

What if there is a lot of solutions?

Return any of them.

Example

Given [3,2,1,4,5], return [1,2,3,4,5] or any legal heap array.

Challenge

O(n) time complexity

思路:

(1)自下而上:

算法思路:

对于每个元素A[i],比较A[i]和它的父亲结点的大小,如果小于父亲结点,则与父亲结点交换。

交换后再和新的父亲比较,重复上述操作,直至该点的值大于父亲。

时间复杂度分析

对于每个元素都要遍历一遍,这部分是 O(n)O(n)。

每处理一个元素时,最多需要向根部方向交换 lognlogn 次。

因此总的时间复杂度是 O(nlogn)O(nlogn)

(2)自上而下:

算法思路:

初始选择最接近叶子的一个父结点,与其两个儿子中较小的一个比较,若大于儿子,则与儿子交换。

交换后再与新的儿子比较并交换,直至没有儿子。

再选择较浅深度的父亲结点,重复上述步骤。

时间复杂度分析

这个版本的算法,乍一看也是 O(nlogn)O(nlogn), 但是我们仔细分析一下,算法从第 n/2 个数开始,倒过来进行 siftdown。也就是说,相当于从 heap 的倒数第二层开始进行 siftdown 操作,倒数第二层的节点大约有 n/4 个, 这 n/4 个数,最多 siftdown 1次就到底了,所以这一层的时间复杂度耗费是 O(n/4)O(n/4),然后倒数第三层差不多 n/8 个点,最多 siftdown 2次就到底了。所以这里的耗费是 O(n/8 * 2), 倒数第4层是 O(n/16 * 3),倒数第5层是 O(n/32 * 4) ... 因此累加所有的时间复杂度耗费为:

T(n) = O(n/4) + O(n/8 * 2) + O(n/16 * 3) ...

然后我们用 2T - T 得到:

2 * T(n) = O(n/2) + O(n/4 * 2) + O(n/8 * 3) + O(n/16 * 4) ...

T(n)    =          O(n/4)    + O(n/8 * 2) + O(n/16 * 3) ...

2 * T(n) - T(n) = O(n/2) +O (n/4) + O(n/8) + ...

                = O(n/2 + n/4 + n/8 + ... )

                = O(n)

因此得到 T(n) = 2 * T(n) - T(n) = O(n)

代码:

相关文章

  • 130. Heapify

    Description Given an integer array, heapify it into a min...

  • Heapify

    Heapify这个函数要会手写。今天不会写,丢人了 :(heapify要从用percolateDown的方法来写。...

  • [LintCode]Heapify

    Problem Given an integer array, heapify it into a min-hea...

  • 算法导论第六章-堆排序(二)

    6.2-1 直接上MAX-HEAPIFY的go语言实现: 6.2-2 :参考MAX-HEAPIFY,写出能够维护相...

  • 38. 延时调用

    130. 延时调用

  • 堆排序(大顶堆)

    主要是围绕heapify操作 建堆,从下往上对每一个父节点heapify。第一个父节点的下标是 ((n -1)-1...

  • Java使用链表实现Map(LinkedListMap)

    Map接口 实现类 测试类 测试效果Test MaxHeap completed.Without heapify:...

  • 130. Surrounded Regions

    题目130. Surrounded Regions Given a 2D board containing 'X'...

  • 130.

    今晚流氓兔推荐的歌曲是《勋章》,鹿晗。今天突然对这一首歌很有感觉,特别是听到高潮部分,很好听。 现在的我站在道路旁...

  • 算法:并查集

    LeetCode经典题目 130. 被围绕的区域[https://leetcode-cn.com/problems...

网友评论

    本文标题:130. Heapify

    本文链接:https://www.haomeiwen.com/subject/krpgcctx.html