各种编程语言中算法的运行时间

时间:2015-01-17 01:34:06

标签: algorithm runtime time-complexity theory

各种编程语言的算法运行时间有何不同?例如,假设算法的运行时间表示为Θ(n 2 ),如果它在Haskell,Java,C等中运行,它会有任何不同吗?

编辑:我的问题已得到解答,但如果你们有空闲时间,我仍然希望得到额外的意见。我的教授让我们为本季度做了我们自己的编程项目,这是我想出的一个想法,我只是想确保有足够的时间供我讨论。我对此有了第二个想法,所以如果有人想提出一个想法或修改/建立这个想法,我会非常感激。

1 个答案:

答案 0 :(得分:3)

算法的时间复杂性与其实现的具体方式密切相关。例如,如果使用Fibonacci堆,Dijkstra的算法将在时间O(m + n log n)中运行,如果使用二进制堆,则需要时间O(m log n),并且需要时间O(n 2 < / sup>)如果使用基于数组的优先级队列。

我之所以提到这一点,是因为如果你说特定的算法在时间Θ(n 2 )中运行,你会说这个算法,当用特定的方式用特定的数据结构实现时,将会在时间上运行Θ(n 2 )。如果您可以在您选择的编程语言中忠实地实现适当的数据结构和其他基本操作,则运行时将为Θ(n 2 )。基于特定语言和将Θ(n 2 )算法转换为语言的特定方式,常数因子可能会有很大差异,但C语言中的算法渐近运行没有根本原因比Java中的相同算法更快,前提是它也可以用Java表示。

尽管如此,某些编程语言可能不支持或至少有效地支持某些操作。纯函数Haskell代码忽略了各种monadic技巧,不支持变量赋值和变异,因此许多在命令式模型中运行速度非常快的算法在Haskell中无法有效运行。对纯粹的功能算法和数据结构进行了大量研究,并且有一个结果(IIRC)表明任何命令式算法都可以转换为O(log n)减速的功能算法。在某些情况下,根本没有减速(例如,在纯功能二项式堆或红/黑树中)。如果你看看Haskell然后允许状态使用monadic技巧,那么据我所知,没有减速因为底层实现可以直接将代码优化为命令式等效。

作为另一个例子,单线程编程语言可能无法实现并行算法,因此即使并行算法在时间Θ(f(n))中运行,您也可以做到最好没有线程的语言可能是ω(f(n))。不支持位操作的语言(如果存在)可能无法利用某些比特hacky技巧来削弱某些类型算法的O(log n)因素。

在实践中,您有时会在使用不同编程语言实现算法时看到速度减慢,因为这些编程语言如何实现某些结构之间存在细微差别。例如,如果您不熟悉C ++,很容易无意中通过值而不是指针或引用传递大量对象,由于复制对象的成本而增加了额外的成本。如果您还不知道std::map实现通常是一些平衡的BST,那么由于查找成本,您最终可能会引入额外的O(log n)因子。也就是说,这不是特定语言,而是与该语言中特定的实现有关。

希望这有帮助!