算法效率

求闻百科,共笔求闻

计算机科学中,算法效率是算法的一种属性,算法效率与算法使用的计算资源量的大小有关。分析算法以确定其资源使用情况,即可根据不同资源的使用情况来衡量算法的效率。算法效率可以被认为类似于某个重复或持续过程的生产力大小。

为获得最大效率,一般希望能够尽量减少资源使用量。然而,时间复杂度空间复杂度等不同的资源不能直接比较,因此通常两种算法中哪一种各有效率取决于哪种效率计量被认为是最重要的。

例如,冒泡排序Timsort都是将一个列表中的每一项从小到大排序的排序算法。冒泡排序对列表进行排序的用时与元素数量平方成正比(,参见大O符号),但只需要较少量的额外内存,该内存对于列表的长度来说是常数()。 Timsort对列表排序的用时与列表长度呈对数关系(),但空间用量与列表长度呈线性关系()。如果必须对给定应用程序的大型列表进行高速排序,则Timsort是更好的选择;但如果以内存占用最小化为重,那么冒泡排序更优。

概述

如果一个算法的资源消耗(也称为计算成本)处于或低于某个可接受的水平,则该算法被认为是有效的。粗略地说,“可接受”意味着:它将在可用计算机上的合理时间或空间内运行,“合理时间”和“空间”通常为关于输入数据大小的函数。自 1950 年代以来,计算机的可用计算能力和可用内存量都急剧增加,因此即使在 10 年前,当前可接受的水平也是不可接受的。事实上,由于摩尔定律,在现代智能手机嵌入式系统上可以接受的效率的任务对于 10 年前的工业服务器来说可能效率低到无法接受。

计算机制造商经常推出性能更高的新型号。由于修改软件成本可能相当高,在某些情况下,获得更高性能的最简单和最便宜的方法可能是购买一台性能更高的计算机,前提是它与现有计算机兼容

有很多方法可以衡量算法使用的资源,两个最常见的衡量标准是速度内存使用情况。其他措施可能包括传输速度、临时磁盘使用、长期磁盘使用、功耗、总拥有成本、对外部刺激的响应时间等。许多这些措施取决于算法输入数据的大小,即要处理的数据量。它们还可能取决于数据的排列方式,例如,某些排序算法对已经排好序或以几乎全部按相反顺序排序的数据表现不佳。

在实践中,还有其他因素会影响算法的效率,例如对算法准确性、可靠性的要求。如下文所述,算法的实现方式也会对实际效率产生重大影响,尽管这在许多方面都与优化问题有关。

理论分析

下面是应用于渐近算法时间复杂度的大 O 符号的一些示例:

符号 名称 例子
常数复杂度 从排序好的列表中找到中位数;使用固定大小的查找表;使用合适的散列函数来查找一个元素。
对数复杂度 使用二分查找或平衡搜索以及二项式堆中的所有操作在已排序数组中查找一个元素。
线性复杂度 在未排序的列表或格式错误的树(最坏的情况)或未排序的数组中查找项目;通过加法器将两个n位整数相加。
线性复杂度、对数线性或准线性 执行快速傅里叶变换堆排序快速排序(最佳和平均情况)或合并排序
平方复杂度 简单的算法计算两个n位数的乘积冒泡排序(最坏情况或naive implementation)、 Shell 排序、快速排序(最坏情况)、选择排序插入排序
指数复杂度 使用动态规划找到旅行商问题的最优(非近似)解;使用暴力搜索确定两个逻辑语句是否等效