Big(O) 机器依赖吗?

Is Big(O) machine dependent?

我真的对 Big(O) 符号感到困惑。 Big(O) 是依赖于机器还是独立于机器? (从某种意义上说,机器是我们 运行 算法所在的计算机) 在 i3 处理器和 i7 处理器中使用快速排序对 1000 个数字进行排序是否相同?为什么我们在计算时间复杂度时不考虑机器及其处理器速度?我是这方面的新手。

Big-O 衡量的是可伸缩性,而不是速度。它向您展示了它对时间和记忆的影响,例如,数据量加倍 - 执行量是加倍还是加倍?

不管你用i7还是i3,double就是double。一个线性算法不管是快还是慢,double就是double

这还有一个被很多人忽视的含义。对于低于特定限制的给定 n,诸如 O(n^3) 之类的复杂算法可能比诸如 O(n) 之类的简单算法更快。示例:

loop n times:
    loop n times:
        loop n times:
            sleep 1 second

O(n^3),因为它有 3 个嵌套循环。

loop n times:
    sleep 10 seconds

O(n),因为它只有一个循环。对于n = 10,第一个程序执行了1000秒,而第二个程序只执行了100秒。所以,O(n)很好!有人会想说。但是如果你有 n = 2,第一个复杂的程序只执行 8 秒,而第二个更简单的程序执行 20 秒!即使对于 n = 3,第一个在 27 秒内执行,第二个在 30 秒内执行。因此,虽然 n 很低,但复杂的程序可能会胜过更简单的程序。只是随着 n 的增加,复杂程序变得比简单程序慢得多(如果这有意义的话)。对于n = 1000,简单的代码已经上升到只有10000秒,但是复杂的现在是1000000000秒!

此外,这清楚地表明复杂性与处理器无关。一秒就是一秒

编辑:另外,您可能想阅读 this question,其中 Big-O 在许多非常高质量的答案中得到了解释。

Big(O) Notation 是计算算法复杂度的方法,因此计算到 运行 所需的相对时间。相同的算法,对于相同的数据,在更快的处理器上会 运行 更快,但仍然需要相同数量的操作。它被用作评估不同算法实现相同结果的相对效率的一种方式。

Big O 表示法在任何方面都不依赖于体系结构,它是一个数学 construct.It 是一种非常有限的算法复杂性度量,它只为您提供性能如何随数据大小变化的粗略上限.

Big(O) 依赖于算法。它的工作是帮助比较各种算法的相对成本,而不需要考虑机器依赖性。

通过数组进行线性搜索,如果找到,平均会查看大约 1/2 的元素。出于所有实际目的,O(N/2) 与 O(1/2 * N) 相同。对于compairson,你扔掉了系数。因此它是 O(N) 的使用。

一棵二叉树也可以容纳N个元素进行搜索。在 agerage 上,它会通过 log base 2 (N) 来查找某些东西,因此你会看到它被描述为成本 O(LN2(N))。

弹出 N 的小值,算法之间并没有太大的区别。 Pop一个大的N值,就会明显二叉树查找快很多

Big(O) 不依赖于机器。它是表示算法复杂性的数学符号。通常我们在理论上使用这些符号来比较算法性能。