第一天 数据结构与算法概念

88 阅读1分钟

什么是算法

算法: 使用一段程序解决实际问题的方法

怎么评估算法的性能

时间复杂度分析方法

  • 不依赖具体的执行环境
  • 不用具体的测试数据
  • 在算法实现前,我们在脑海就可以评估算法的性能

什么是评估一个算法的性能 : 本质上就是评估这个算法代码执行的时间

什么是时间复杂度分析

大O复杂度表示法

T(n)=O(f(n))T(n) = O(f(n))
f(n)f(n) 中省略系数 低阶 和常量

  • T(n)T(n) 就是表示算法程序段执行的时间
  • n 表示的是算法输入数据规模的大小
  • f(n)f(n) 表示程序段所有语句执行的次数综合
  • 大 O 表示程序段执行时间T(n)T(n)f(n)f(n)函数的关系

常量阶时间复杂度

只要你的程序段执行的时间和输入数据规模n没有关系的话,即使需要执行成千上万行的代码,那么你的程序时间复杂度仍然是 O(1)

对数阶时间复杂度

O(log2n)=O(log3n)=...=O(logmn)所以对数阶时间复杂度:O(logn)O(log_2n) = O(log_3n)=...=O(log_mn) 所以对数阶时间复杂度:O(logn)

时间复杂度分析法则

加法法则

T(n)=max(T1(n),T2(n))T(n) = max(T_1(n),T_2(n))

T(n)=O(m)+O(n)=O(m+n)T(n) = O(m)+O(n) = O(m+n)

乘法法则

T(n)=T1(n)T2(n)=O(f(n)g(n) T(n) = T_1(n) * T_2(n) = O(f(n)*g(n)

eg: 给你一个整数类型数组,判断这个数组是否存在某个整数

int [] arr = {7,3,3,4,5,9,5};
int target = 4;
for(int i = 0; i < arr.length; i++){
    ....
}

常用的时间复杂度

  1. 常数阶 O(1)O(1)
  2. 对数阶 O(logn)O(logn)
  3. 线性阶 O(n)O(n)
  4. 线性对数阶 O(nlogn)O(nlogn)
  5. 平方阶 O(n2)O(n^2)
  6. 立方阶 O(n3)O(n^3)
  7. .....
  8. k次方阶 O(nk)O(n^k)
  9. 指数阶 O(2n)O(2^n)
  10. 阶乘阶 O(n!)O(n!)

O(1)<O(logn)<O(n)<O(n2)<O(2n)<O(n!)O(1)<O(logn)<O(n)<O(n^2)<O(2^n)<O(n!)