算法学习01: 时间复杂度

算法学习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较大,则算法三更好.

对数器的概念和使用

  1. 有一个你想要测的方法a,
  2. 实现一个绝对正确但是复杂度不好的方法b,
  3. 实现一个随机样本产生器
  4. 实现比对的方法
  5. 把方法a和方法b比对很多次来验证方法a是否正确。
  6. 如果有一个样本使得比对出错,打印样本分析是哪个方法出
  7. 当样本数量很多时比对测试依然正确,可以确定方法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) 复杂度为O(Nd)

你可能感兴趣的:(#,算法)