1.渐进界
渐进上界:Big O T(n)=O(f(n)),存在常数c>0,以及n0>=0,当n>n0时,有T(n)<=c*f(n)
渐进下界:Big Omega 与渐进上界相反
渐进紧界:Big Theta 既是渐进上界也是渐进下界
注:(1)表达式中,T(n)叫做被f(n)上界定。
(2)对于log来说底数并不重要,都可以看做一种复杂度。
2.常见的运行时间
O(n):求一序列数的最大值、合并两排好序的队列
O(nlogn):归并排序
O(n平方):穷举n个中的pair、2嵌套循环
O(n立方):三次嵌套循环(比如穷举判断一些列整数子集是否有相同元素)
O(n的k次方):穷举n个中的k个元素的子集
超越多项式时间:穷举一个n个元素集合的所有子集(2的n次方)
3.堆(优先队列)
背景:想要实现取出最小元素,以及插入一个新元素。
数组按顺序存储元素:(1)取出最小元素O(1) (2)插入一个新元素O(n)
链表用一个指针指向最小元素:(1)插入一个元素O(1) (2)取出最小元素,并将指针移向下一个最小元素O(n)
目标:想要无论是插入新元素还是取出最小元素都不用花费O(n)
堆(父节点值比子节点值更小的平衡二叉树)
实际实现:(1)链表 (2)如果知道最多有N个元素,可以用数组。数组下标是树中节点的位置,每个节点的值是实际的值。由于是平衡的二叉树,所以父节点i到子节点为2i以及2i+1、子节点i,父节点为i/2向上取整。
一般使用数组实现堆。
(1)插入元素时,按照平衡树的方法在最后添加,如果打破了平衡,对掉子节点与父节点,直到满足堆的父节点比子节点值小的性质。
(2)取出任意元素时,取出某位置的元素,用当前堆的最后一个元素填到取出元素的位置,并将最后一个元素删去。然后判断是否满足堆的父节点比子节点值小的性质。如果不满足,则对调父子节点。值得注意的是,如果父节点变为子节点,子节点有两个,通过换到值最小的那个子节点,多了一个判断的步骤。
这样(1)插入一个元素O(logn) (2)取出一个元素O(logn)