8##### 时间复杂度
时间常数的操作O(1)
时间复杂度的定义
时间复杂度的分析
eg1.有序数组a,无序数组b,查找b中当前不属于a的所有数(num(a):N,num(b):M)。
- 每个b数,都遍历a一下
显然,时间复杂度O(M*N) - 每个b数,都二分查找a一下
二分查找过程,相当于2的阶乘直到样本量,故而时间常数操作的数量是log N,时间复杂度为O(M*log N) - b先排序,再对a数外排。
排序的时间复杂度为O(Mlog M),外排过程中O(N+M),总体时间复杂度O(Mlog M)+O(N+M)
- 算法优劣分析
方式1的时间复杂度无疑是最差的,对2和3来说优劣性取决于样本量,当b数组很大的时候,显然2方式更优2。当a数组很大的时候,b数组排序的代价相对小,方式3更优。
eg2. 等差数列形式的时间复杂度
比如冒泡排序,选择排序。每确定一个数,需要对剩余的右边的数进行遍历。因此,时间复杂度为
1+2+3+…+n的形式,用等差数列的前n项和公式和时间复杂度的定义规则,数据规模决定时间复杂项为n的二次方,因此,时间复杂度为O(N^2).
递归的时间复杂度
master公式: T [n] = aT[n/b] + T (N^d)
其中 a >= 1 and b > 1 是常量,表示的意义是n表示问题的规模,a表示生成的子问题数,b表示每次递归是原来的1/b之一个规模,f(n)表示分解和合并所要花费的时间之和。
解法:
①当d<logb a时,时间复杂度为O(n^(logb a))
②当d=logb a时,时间复杂度为O((n^d)*logn)
③当d>logb a时,时间复杂度为O(n^d)
如归并排序,每次递归对左右两部分进行递归,每个递归的样本量为二分之一,每次递归操作的时间复杂度o(n),时间复杂度n*log n.