复杂度分析

- 为什么需要时间复杂度

  1. 利用代码跑一遍程序的局限性

    • 测试结果非常依赖测试环境
      测试环境中硬件的不同会对测试结果有很大的影响, 比如, 那同样的一段代码,分别用Intel Core i9 处理器和 i3处理器来运行,不用说, i9处理器要比i3处理器执行速度快很多.
    • 测试结果受数据规模的影响很大
      对同一个排序算法,待排序数据的有序程度不一样,排序的执行时间就会有很大的差别. 极端情况下, 如果数据已经是有序的, 那排序算法不需要执行任何操作,执行时间就会非常短.
      除此之外, 如果测试数据规模太小, 测试结果可能无法真实地反应算法的性能, 比如, 对于小规模的数据排序,插入排序可能反倒会比快速排序算法要快.
  2. 大 O 复杂度表示法

算法的执行效率,粗略的讲就是算法代码的执行的时间.

这里有一段非常简单的代码, 求1 2 3…n的累加和, 现在, 简单估算一下代码的执行时间

 int cal(int n) {
   int sum = 0;
   int i = 1;
   for (; i <= n; ++i) {
     sum = sum + i;
   }
   return sum;
 }

从CPU 角度来说, 这段代码的每一行都执行着类似的操作: 读数据-运算- 写数据. 尽管每行代码对应的 CPU 执行的个数, 执行时间都不一样, 但是, 我们这里只是粗略估计,所以可以假设每行代码执行时间都是一样的, 为 unit-time . 在这个假设的基础上,这段代码的总执行时间是多少??

第2 3 行代码分别需要 1 个unit-time 的执行时间, 第4 5 行都运行了 n 遍,所以需要 2n*unit-time 的执行时间,所以这段代码总执行时间就是 (2n+2)*unit-time

可以看出, 所有执行代码的执行时间T(n) 与每行代码执行时间次数成正比.

这样我们可以把这个规律总结成一个公式. 大 O登场
T(n)=O(f(n))
其中,T(n)表示代码执行时间; n 表示数据规模大小;
f(n)表示每行代码执行时间的总和,因为是一个公式所以用f(n)表示.
O 表示代码执行时间T(n) 与 f(n) 表达式成正比

大 O 时间复杂度算法,并不具体表示代码执行时间,而是表示代码执行时间随数据规模增长的变化趋势. 也叫 渐进时间复杂度 简称 时间复杂度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值