【玩转算法】复杂度分析

  1. 什么是大O:

  2. n表示数据规模,O(f(n))表示运行算法所需要执行的指令数,和f(n)成正比,比如:

    1. 二分查找法O(logn),所需执行指令数: a*logn
    2. 寻找数组中的最大/最小值O(n),所需执行指令数: b*n
    3. 归并排序算法O(nlogn),所需指令数: c*nlogn
    4. 选择排序法O(n2),所需指令数: d*n2
  3. 对邻接表实现的图进行遍历:时间复杂度: O(V +E ),即访问所有的顶点和所有的边。

  4. 举例:有一个字符串数组,将数组中的每一个字符串按照字母序排序;之后再将整个字符串数组按照字典序排序。整个操作的时间复杂度是多少?

    1. 错误答案:O( n*nlogn + nlogn ) = O(n2logn),错误原因:字符串的长度和数组的长度不是一个变量,
    2. 正确答案:O(n*slog(s)) + O(s*nlog(n)) = O( n*s*logs + s*n*logn)= O( n*s*(logs+logn) )
      1. 假设最长的字符串长度为s,数组中有n个字符串
      2. 对每个字符串排序: O(slogs)
      3. 将数组中的每一个字符串按照字母序排序: O(n*slog(s))
      4. 将整个字符串数组按照字典序排序: O(s*nlog(n))
  5. 数据规模的概念,如要想在1s之内解决问题:

    1. O(n2)的算法可以处理大约104级别的数据;
    2. O(n)的算法可以处理大约108级别的数据;
    3. O(nlogn)的算法可以处理大约107级别的数据;
  6. 空间复杂度:

    1. 多开一个辅助的数组:O(n);
    2. 多开一个辅助的二维数组:O(n2);
    3. 多开常数空间:O(1);
    4. 递归调用有空间代价,递归的深度就是空间复杂度;
  7. 常见的时间复杂度:

    1. 交换两数:O(1);
    2. 数列求和:O(n);
    3. 选择排序:O(n2);
    4. 二分查找:O(logn);
  8. 递归中进行一次递归调用的复杂度分析:如果递归函数中,只进行一次递归调用,递归深度为depth;在每个递归函数中,时间复杂度为T;则总体的时间复杂度为O( T * depth )。

  9. 递归中进行多次递归调用的复杂度分析:如果计算成倍扩大,复杂度是2n级别,如果使用分治法,复杂度减少到了O(n*logn)级别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值