大O表示法 - 更复杂意味着更快或更慢

时间:2012-10-08 09:40:35

标签: big-o

我正在学习大O符号,我有点困惑。我不认为我真的得到了算法的“复杂性”,我无法判断我是否在倒退。

是从最小到最复杂的复杂度的顺序:O(1),O(log n),O(n),O(n log n),O(n ^ 2)?还是我倒退了?

如果这是正确的顺序,我猜想复杂度为O(n ^ 2)的程序将比具有O(n log n)的程序更快地处理大量数据。然而,在测试冒泡排序(O(n ^ 2))和快速排序(O(n log n))之后,显然O(n ^ 2)排序处理WAY比O(n log n)慢。所以我很困惑......复杂性是好还是坏?一个算法是快速的(根据完成程序需要多长时间),如果它更复杂,或者复杂程序会更慢?

2 个答案:

答案 0 :(得分:4)

O表示法表示计算机将对具有算法将处理的对象的最大数量的元素执行的操作数。例如,您使用具有O(n ^ 2)的算法对具有3个元素的数组进行排序,这意味着计算机将对阵列执行最多 9个操作。

在这里,您可以看一下不同O复杂性之间的比较:

Comparison of O notation

答案 1 :(得分:2)

要回答您的第一个问题,是的,这是复杂性的正确顺序。 Big O表示法不会告诉您程序或算法运行多长时间。它仅针对具有更好复杂性或更复杂性的另一种方法来衡量其性能。为了帮助您对其进行概念化, O(1)将是单个指令, O(n)将是单个循环, O(n ^ 2) 将是一个内置嵌套循环的循环。

要回答有关 O(n ^ 2) O(n log n)更快的问题, 可能 > 不是。我说可能是因为有许多因素决定了程序的速度,你可以想象一个程序的复杂性比复杂程度更高的程序更快。换句话说,Big O表示法测量算法的复杂性,而不是构成该算法的程序。

例如,假设您有两个程序,一个在 O(n)时间运行,另一个在 O(n ^ 2)时间运行为了简单起见。

运行10个对象, O(n)时间的程序导致100毫秒。使用 O(n ^ 2)时间运行程序会导致10毫秒。这是为什么?因为它使用 O(n ^ 2)的程序所花费的时间比第一个程序更少。

但是让我们看看100个对象会发生什么。具有 O(n)时间的程序然后在1000毫秒内产生,而具有 O(n ^ 2)时间的程序也导致1000毫秒。它对于较大的对象来说变得更快,这就是为什么一般来说,优化复杂性更好。

某些算法不能降低其复杂性,例如traveling salesman problem的变体,它会询问是否存在一定长度的路径以通过他必须访问的所有城市。要获得有保证的最佳解决方案,您必须运行所有可能的方案,其中包含 O(n!)的Big O表示法,这与其获得的一样糟糕。幸运的是,有许多替代算法可以确定98%以内的解决方案,可以更快地执行。在 O(n!)时间内运行的一组已知问题称为NP problems

我希望能回答你的问题。