- 为什么需要时间复杂度
-
利用代码跑一遍程序的局限性
- 测试结果非常依赖测试环境
测试环境中硬件的不同会对测试结果有很大的影响, 比如, 那同样的一段代码,分别用Intel Core i9 处理器和 i3处理器来运行,不用说, i9处理器要比i3处理器执行速度快很多. - 测试结果受数据规模的影响很大
对同一个排序算法,待排序数据的有序程度不一样,排序的执行时间就会有很大的差别. 极端情况下, 如果数据已经是有序的, 那排序算法不需要执行任何操作,执行时间就会非常短.
除此之外, 如果测试数据规模太小, 测试结果可能无法真实地反应算法的性能, 比如, 对于小规模的数据排序,插入排序可能反倒会比快速排序算法要快.
- 测试结果非常依赖测试环境
-
大 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 时间复杂度算法,并不具体表示代码执行时间,而是表示代码执行时间随数据规模增长的变化趋势. 也叫 渐进时间复杂度 简称 时间复杂度