有助于比较相同时间复杂度的两种算法的因素

时间:2013-04-21 15:53:54

标签: algorithm complexity-theory

我必须完成一项关于数字算法分析的研究。我需要一些关于这个主题的专家意见。 据我所知,具有相同时间复杂度的两种算法受复杂方程中常数(例如α)的影响。具有较大α值的算法被认为对具有较小α的算法较差。 复杂性的示例等式将是 F(N)= A(N ^ 2 + 2N)

如果它们具有相同的时间复杂度,还有哪些其他因素可以控制两种算法之间的比较?任何建议都是最受欢迎的。

1 个答案:

答案 0 :(得分:2)

内存是另一个需要考虑的因素,例如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,因为它需要更多内存和缓存性能差。另请注意,递归算法通常需要比等效迭代算法更多的空间(以堆栈的形式)。

平均时间复杂度是另一个因素--Bubblesort和Quicksort以相同的最坏情况时间复杂度(O(n ^ 2))运行,但Bubblesort的平均时间复杂度为n ^ 2,而Quicksort的平均时间复杂度为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只要求元素的子集驻留在内存中,而其余元素驻留在硬盘驱动器上或网络上。