【问题标题】:Factors that facilitate to compare two algorithms of the same time complexity有助于比较具有相同时间复杂度的两种算法的因素
【发布时间】:2013-04-22 21:55:10
【问题描述】:
我必须完成关于数字算法分析的研究。我需要一些关于这个话题的专家想法。
我知道具有相同时间复杂度的两种算法会受到复杂度方程中的常数(例如 alpha)的影响。具有较大 alpha 值的算法被认为比具有较小 alpha 的算法更差。
复杂性的一个示例方程是
F(n)=A(n^2+2n)
如果两种算法具有相同的时间复杂度,还有哪些其他因素可以控制它们之间的比较?任何建议都将受到欢迎。
【问题讨论】:
标签:
algorithm
complexity-theory
【解决方案1】:
内存是另一个需要考虑的因素,例如 Mergesort 通常以相同的时间复杂度运行(尽管常数因子较低)但空间是 Heapsort 的两倍(我说“通常”是因为就地 Mergesort 通常是 O (n^2))。计算最多为 N 的素数的基本算法要求您存储最多为 N 的所有素数,而 Sieve of Eratosthenes 更省时,但需要您存储所有数字(不是所有素数)到 N。Radix Sort 在 O(n) 中运行(与在 O(n*log(n)) 中运行的 Heapsort/Mergesort/Quicksort 不同),但几乎没有人使用 Radix Sort,因为它需要更多的内存并且性能很差缓存性能。另请注意,递归算法通常比等效的迭代算法需要更多空间(以堆栈的形式)。
平均时间复杂度是另一个因素 - 冒泡排序和快速排序在相同的最坏情况时间复杂度 (O(n^2)) 下运行,但冒泡排序的平均时间复杂度为 n^2,而快速排序的平均时间复杂度为 n*log(n )。平衡二叉树中的插入和查找的最差平均时间为 n*log(n),而哈希表中的插入和查找通常最差时间为 O(n),平均时间恒定。
有时算法将具有相同的时间复杂度,但会使用成本较低的操作。例如,矩阵乘法的标准算法是 O(n^3);另一种算法(我忘记了它的名字)以相同的时间复杂度运行,但它使用更少的乘法和更多的加法(加法比乘法便宜)。 (在这种情况下,常数因素会受到影响,所以它仍然是苹果对苹果的比较,但要注意算法比较是苹果对橙子。)
另一个考虑因素是并行化。基本矩阵乘法算法的运行时间复杂度与block matrix multiplication algorith 相同,但后者在并行运行时比前者效率更高。并行算法的一个子集还具有“无锁”的特性,这意味着它们无需使用信号量或监视器或其他锁定结构即可实现同步;无锁算法的一个子集是“无等待的”,这意味着所有线程都可以保证取得进展。
缓存性能是另一个考虑因素 - 基本和块矩阵乘法算法使用大致相同的内存量,但块算法具有更好的缓存行为(更少的缓存未命中)
稳定性是许多数值算法中的一个因素。在求解常微分方程时,四阶 Runge-Kutta 方法的收敛速度比隐式 Euler 方法快得多,但隐式 Euler 方法总是会收敛到解,而 Runge-Kutta 方法可能会表现出不稳定性(例如收敛到 Infinity 或 NAN) .
许多算法要求所有数据都驻留在主存中;相反,外部算法只要求在任何给定时间将一部分数据驻留在主存储器中。例如,经典的 Mergesort 算法要求所有被排序的元素都驻留在内存中,而 Polyphase Mergesort 只要求元素的一个子集驻留在内存中,而其余元素驻留在硬盘驱动器上或通过网络。