算法含义
算法 Algorithm是在有限时间内解决特定问题的一组指令或操作步骤。算法具有以下特性:
- 问题是明确的,包含清晰的输入和输出定义。
- 具有可行性,能够在有限步骤、时间和内存空间下完成。
- 各步骤都有确定的含义,相同的输入和运行条件下,输出始终相同。
算法好坏衡量标准
算法的好坏衡量标准可以根据具体的应用领域和需求而有所不同。然而,以下是一些常见的衡量标准,用于评估算法的性能和效果:
- 正确性:算法是否能够产生正确的结果?在测试数据集上的准确率是多少?对于分类任务,可以使用准确率、精确率、召回率、F1值等指标来评估算法的分类能力。对于回归任务,可以使用均方误差、平均绝对误差等指标来评估算法的预测准确性。
- 效率:算法的执行时间和资源消耗是多少?算法是否能够在合理的时间内处理大规模数据集或复杂的计算任务?效率评估可以包括算法的时间复杂度和空间复杂度分析。
- 可扩展性:算法是否能够适应不同规模和复杂度的问题?在输入规模增加时,算法的性能是否能够保持良好的表现?可扩展性评估可以考虑算法的扩展性能力和处理大规模数据的能力。
- 健壮性:算法对于异常情况和噪声的容错能力如何?算法是否能够处理缺失数据、异常值或噪声干扰?健壮性评估可以通过对算法进行鲁棒性测试来评估。
- 解释性:算法是否能够提供可解释的结果和推理过程?在某些领域,如医疗和金融,解释性是非常重要的,因为用户需要理解算法的决策过程和结果产生的原因。
- 创新性:算法是否引入了新的思想、技术或方法,对于给定的问题提供了新颖的解决方案?创新性评估可以考虑算法的独特性和在相关领域的前沿性。
算法评估维度
- 找到问题解法。算法需要在规定的输入范围内,可靠地求得问题的正确解。
- 寻求最优解法。同一个问题可能存在多种解法,我们希望找到尽可能高效的算法。
因此,在能够解决问题的前提下,算法效率成为主要的评价维度,主要包括:
- 时间效率,即算法运行速度的快慢。
- 空间效率,即算法占用内存空间的大小。
效率评估方法
实际测试
难以排除测试环境的干扰因素
展开完整测试非常耗费资源
理论估算
「复杂度分析 Complexity Analysis」或「渐近复杂度分析 Asymptotic Complexity Analysis」
复杂度分析评估的是算法运行效率随着输入数据量增多时的增长趋势。这个定义有些拗口,我们可以将其分为三个重点来理解:
- “算法运行效率”可分为“运行时间”和“占用空间”,因此我们可以将复杂度分为「时间复杂度 Time Complexity」和「空间复杂度 Space Complexity」。
- “随着输入数据量增多时”表示复杂度与输入数据量有关,反映了算法运行效率与输入数据量之间的关系。
- “增长趋势”表示复杂度分析关注的是算法时间与空间的增长趋势,而非具体的运行时间或占用空间。
复杂度分析克服了实际测试方法的弊端。首先,它独立于测试环境,因此分析结果适用于所有运行平台。其次,它可以体现不同数据量下的算法效率,尤其是在大数据量下的算法性能。
时间复杂度
主要是:统计算法运行时间,统计时间增长趋势,函数渐近上界
推算方法
根据定义,确定 f(n) 之后,我们便可得到时间复杂度 o(f(n)) 。那么如何确定渐近上界 f(n) 呢?总体分为两步:首先统计操作数量,然后判断渐近上界。
第一步:统计操作数量
针对代码,逐行从上到下计算即可。然而,由于上述 c⋅f(n) 中的常数项c 可以取任意大小,因此操作数量 t(n) 中的各种系数、常数项都可以被忽略。根据此原则,可以总结出以下计数简化技巧:
- 忽略与 n 无关的操作。因为它们都是 f(n)中的常数项,对时间复杂度不产生影响。
- 省略所有系数。例如,循环 2n 次、5n+1 次等,都可以简化记为 n 次,因为 n 前面的系数对时间复杂度没有影响。
- 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别套用上述
1.
和2.
技巧。
以下示例展示了使用上述技巧前、后的统计结果。
最终,两者都能推出相同的时间复杂度结果,即 o(n2) 。
第二步:判断渐近上界¶
时间复杂度由多项式t(n) 中最高阶的项来决定。这是因为在 n 趋于无穷大时,最高阶的项将发挥主导作用,其他项的影响都可以被忽略。
以下表格展示了一些例子,其中一些夸张的值是为了强调“系数无法撼动阶数”这一结论。当 n 趋于无穷大时,这些常数变得无足轻重。
时间复杂度常见类型
设输入数据大小为 n ,常见的时间复杂度类型包括(按照从低到高的顺序排列):
对数阶
与指数阶相反,对数阶反映了“每轮缩减到一半的情况”。
对数阶常出现于「二分查找」和「分治算法」中,体现了“一分为多”和“化繁为简”的算法思想。
空间复杂度
算法相关空间
算法运行过程中使用的内存空间主要包括以下几种:
推算方法
空间复杂度的推算方法与时间复杂度大致相同,只是将统计对象从“计算操作数量”转为“使用空间大小”。与时间复杂度不同的是,我们通常只关注「最差空间复杂度」,这是因为内存空间是一项硬性要求,我们必须确保在所有输入数据下都有足够的内存空间预留。
最差空间复杂度中的“最差”有两层含义:
- 以最差输入数据为准
- 以算法运行过程中的峰值内存为准
常见类型
参考
1.1.2. 算法是什么