🚀 算法效率评估
在算法设计中,我们先后追求以下两个层面的目标。
- 找到问题解法:算法需要在规定的输入范围内,可靠地求得问题的正确解。
- 寻求最优解法:同一个问题可能存在多种解法,我们希望找到尽可能高效的算法。
也就是说,在能够解决问题的前提下,算法效率已成为衡量算法优劣的主要评价指标,它包括以下两个维度。
- 时间效率:算法运行速度的快慢。
- 空间效率:算法占用内存空间的大小。
简而言之,我们的目标是设计“既快又省”的数据结构与算法。而有效地评估算法效率至关重要,因为只有这样我们才能将各种算法进行对比,从而指导算法设计与优化过程。
效率评估方法主要分为两种:实际测试、理论估算。
🧠 理论估算
由于实际测试具有较大的局限性,我们可以考虑仅通过一些计算来评估算法的效率。这种估算方法被称为「渐近复杂度分析 asymptotic complexity analysis」,简称「复杂度分析」。
复杂度分析体现算法运行所需的时间(空间)资源与输入数据大小之间的关系。它描述了随着输入数据大小的增加,算法执行所需时间和空间的增长趋势。这个定义有些拗口,我们可以将其分为三个重点来理解。
- “时间和空间资源”分别对应「时间复杂度 time complexity」和「空间复杂度 space complexity」。
- “随着输入数据大小的增加”意味着复杂度反映了算法运行效率与输入数据体量之间的关系。
- “时间和空间的增长趋势”表示复杂度分析关注的不是运行时间或占用空间的具体值,而是时间或空间增长的“快慢”。
复杂度分析克服了实际测试方法的弊端,体现在以下两个方面。
它独立于测试环境,分析结果适用于所有运行平台。 它可以体现不同数据量下的算法效率,尤其是在大数据量下的算法性能。
复杂度分析为我们提供了一把评估算法效率的“标尺”,使我们可以衡量执行某个算法所需的时间和空间资源,对比不同算法之间的效率。
📚 时间复杂度 (Time Complexity)
时间复杂度描述的是一个算法执行所需的时间与输入数据之间的关系。它通常用来估计程序完成任务所需的时间。当我们谈论时间复杂度时,我们通常关心的是当输入数据的大小趋向于无穷时,算法的执行时间会如何变化。常见的表示方法有:O(1)、O(log n)、O(n)、O(n^2)、O(2^n) 等。
- O(1): 常数时间复杂度。无论输入数据的大小如何,算法所需的时间都是恒定的。
- O(log n): 对数时间复杂度。例如二分查找。
- O(n): 线性时间复杂度。算法所需的时间与输入数据的大小成正比。
- O(n^2): 平方时间复杂度。常见于双重循环的算法,如冒泡排序。
- O(2^n): 指数时间复杂度。常见于某些递归算法,如计算斐波那契数列的递归实现。
📦 空间复杂度 (Space Complexity)
空间复杂度描述的是一个算法所需内存空间与输入数据之间的关系。它是用来估计程序在运行过程中需要占用多少存储空间。常见的表示方法与时间复杂度类似。
- O(1): 常数空间复杂度。算法所需的内存空间不随输入数据的大小而变化。
- O(n): 线性空间复杂度。算法所需的内存空间与输入数据的大小成正比。
🍎 举例说明:
想象一个果篮,如果你每次都能立即(恒定时间内)找到一个苹果,那么你的“找苹果”算法的时间复杂度就是O(1)。如果篮子里的苹果数量增加,你需要的时间也线性增加,那么时间复杂度就是O(n)。而空间复杂度可以理解为,你需要多大的袋子来装这些苹果。
📘 例子:数组查找
想象一下你有一个数字组成的数组,你的任务是找到一个特定的数字。
1. 顺序查找 (Linear Search)
你从数组的第一个元素开始,一个接一个地查找,直到你找到了所需的数字或者遍历完整个数组。
- 时间复杂度: 你可能需要查看数组中的每一个元素,所以时间复杂度是 O(n)。
- 空间复杂度: 你不需要额外的存储空间来进行查找,因此空间复杂度是 O(1)。
2. 二分查找 (Binary Search)
假设这个数组是排序过的。你查看数组中间的数字,如果它是你正在找的数字,任务完成。如果它太大,你就在左半边的数组中查找;如果太小,你就在右半边的数组中查找,然后重复这个过程。
- 时间复杂度: 你每次都将搜索范围缩小一半,所以时间复杂度是 O(log n)。
- 空间复杂度: 同样,你不需要额外的存储空间,所以空间复杂度是 O(1)。
🎨 更加形象的比喻:
想象你在一个大图书馆里找一本书。
-
顺序查找 就像你从第一本书开始,逐一查看每本书的标题,直到你找到所需的书。这需要很长时间(O(n)),但你不需要任何工具或列表来帮助你(O(1)空间)。
-
二分查找 更像是查看图书馆中间的书,然后根据字母顺序决定是继续在左边还是右边查找。这样,你迅速缩小了搜索范围,大大减少了需要查找的时间(O(log n)),但仍然不需要额外的工具或列表(O(1)空间)。