文章目录
1.动态数组
概念:可以动态扩容 在数组的长度满了之后可扩容至两倍大小
时间复杂度: O(N)
三种分析方法:
aggregate method
amortized method
physicist method
2.优先队列(堆的应用)
-
堆的性质: 父节点总比子节点的值要大
可以按照一定的顺序取出数字 -
有两种基本操作 这两种基本操作可体现出二叉堆的优势
extractmax(x)
insert(x)
-
数的高度定义有两种:
edge 和 节点高度
- 完整二叉树(二叉堆)的定义:
最后一个等级(level)从左到右不能缺失
二叉完整树的最大高度,等比数列,总和等
最大高度: O ( l o g ( N ) ) O(log(N)) O(log(N))
假设root节点为LeveL1 则 第l个level共有 2 l − 1 个 节 点 2^{l-1}个节点 2l−1个节点
节点数共有 2 l − 1 2^l-1 2l−1个
- 应用
找第K大元素、排序
基本操作 sift_down sift_Up等函数的Python代码实现
课程内容介绍了二叉堆的基本操作(insert,extrcatmax,siftup,siftdown,remove,buildheap)等
所有操作的时间复杂度都为 O ( N l o g ( N ) ) O(Nlog(N)) O(Nlog(N))
##二元堆的基本操作
class binary_heap():
def __init__(self,array):
self.array = array
self.size = len(array)
def siftup(self,i):
#偽代碼
# while i > 1 and H[Parent(i )] < H[i ]:
# swap H[Parent(i )] and H[i ]
# i ← Parent(i )
while (i > 0) and self.array[self.parent(i)] < self.array[i]:
self.array[self.parent(i)],self.array[i] = self.array[i],self.array[self.parent(i)]
i = self.parent(i)
def siftdown (self,i):
#偽代碼
# maxIndex ← i
# ℓ ← LeftChild(i )
# if ℓ ≤ size and H[ℓ] > H[maxIndex]:
# maxIndex ← ℓ
# r ← RightChild(i )
# if r ≤ size and H[r ] > H[maxIndex]: