算法学习01:时间复杂度
认识时间复杂度
算法复杂度分析
一个有序数组A,另一个无序数组B,请打印B中的所有不在A中的数,A数
组长度为N,B数组长度为M.
- 算法流程1:对于数组B中的每一个数,都在A中通过遍历的方式找一下
- 算法流程2:对于数组B中的每一个数,都在A中通过二分的方式找一下
- 算法流程3:先把数组B排序,然后用类似外排的方式打印所有不在A中出现
的数
算法流程1:时间复杂度为O(M*N)
算法流程2:时间复杂度为O(M*logN)
算法流程3:对B排序的时间复杂度为O(M*logM),外部排序打印的时间复杂度为O(N+M),因为MN的相对大小未知,其时间复杂度为O(M*logM),O(N+M)
算法一的时间复杂度明显高于算法二,那么算法二与算法三的时间复杂度哪个更优呢?要根据MN的相对大小进行讨论,若N较大,则算法二更好;若M较大,则算法三更好.
对数器的概念和使用
- 有一个你想要测的方法a,
- 实现一个绝对正确但是复杂度不好的方法b,
- 实现一个随机样本产生器
- 实现比对的方法
- 把方法a和方法b比对很多次来验证方法a是否正确。
- 如果有一个样本使得比对出错,打印样本分析是哪个方法出
错 - 当样本数量很多时比对测试依然正确,可以确定方法a已经
正确。
复杂度分析:
插入排序的时间复杂度和数据状况有关:
- 最好情况(原数组有序,每个数都不需要交换): O(N)
- 最坏情况(原数组逆序,每个数都要交换到底): O(N2)
- 平均情况: O(N2)
插入排序的额外空间复杂度O(1)
递归的时间复杂度分析
递归的本质就是压栈,任何递归行为都可以改成非递归
- 递归行为时间复杂度通式–master公式: T(N) = a*T(N/b) + O(Nd)
- log(b,a)>d --> 复杂度为O(Nlog(b,a))
- log(b,a)=d --> 复杂度为O(Nd * logN)
- log(b,a)<d --> 复杂度为O(Nd)