大顶堆、小顶堆是一种很常用的数据结构,例如常见的堆排序和topk算法,在很多应用场景中,我们经常会关注算法时间复杂度和空间复杂度,众所周知构建堆的时间复杂度是o(n),那么为什么是o(n)?本文主要跟大家讨论下这个问题。
堆是一颗完全二叉树,假设有n个节点,树高
证明方法如下:
- 假设根节点的高度为0,叶子节点高度为h,那么每层包含的元素个数为2^x,x从0到h。
- 构建堆的过程是自下而上,对于每层非叶子节点需要调整的次数为h-x,因此很明显根节点需要调整(h-0)次,第一层节点需要调整(h-1)次,最下层非叶子节点需要调整1次。
- 因此可知,构造树高为h的二叉堆精确时间复杂度为:
s = 12^(h-1) + 22(h-2)+……+h*20
可以看出以上公式是等差数列和等比数列乘积之和,可以通过错位相减求:
2s = 2^h + 22(h-1)+3*2(h-2)+……+h2^1
因此可得:
s = 2s -s = 2^h + 2^(h-1) + 2^(h-2) +…… + 2^1 - h
最终可以通过等比数列公式进行计算得到s = 2*2^h - 2 -h
将代入的s = 2n - 2 - log2(n),近似的时间复杂度就是O(n)。
————————————————
版权声明:本文为CSDN博主「Marvolous」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hupenghui1224/article/details/57427045