真的对时间复杂性感到困惑



我知道如何为每个算法计算bigO,以及它的工作原理。例如,在链表中找到一个特定的数字将是O(N),因为你可能必须从头到尾地查看链表中的每个输入。然而,bigO在时间方面究竟意味着什么?为什么合并排序可以比插入排序运行得更快,即使插入排序具有更快的"时间复杂性"?请给我你的意见,这样我才能理解。非常感谢。

看看这个例子:

假设您有两个算法A₁A₂。它们也这样做,但第一个的复杂度为Θ(n),第二个的复杂程度为Θ(n²)。两种算法的运行时间不同。你不能根据复杂性来计算运行时间,因为它取决于确切的实现、运行的计算机、你在复杂性中看不到的东西以及其他东西。但你可以通过复杂性来预测运行时间的变化。假设您将输入从长度n更改为长度2n,意味着您将输入长度增加一倍。那么A₁的运行时间也应该(几乎)翻倍,但A₂的运行时间应该是(2n)² = 4n²的大约4倍。

要解决插入排序与合并排序的示例:插入排序的复杂度为O(n²),合并排序的复杂程度为O(n log n)。所以合并排序比插入排序具有更好的复杂性,并且应该运行得更快。也许(对于非常短的列表)插入排序比合并排序运行得更快,因为合并排序在big-o表示法中隐藏了更大的常量因子。

您遇到的问题在初学者级别非常常见。我建议你多读一些关于"渐近符号"的书。(互联网上有很多有用的视频和网站可以解释这一点)渐近分析考虑的是算法在应用于大型数据库时的性能。渐近概念基本上有三种类型——

  1. 大O
  2. 大欧米茄
  3. Theta

当我们有渐近上界时,使用大O,即当存在正常数c和n时,g(n)的大O等于f(n)0<f(n)<c g(n)对于所有n>=n0。(也就是说,你定义一个极大值的方式是,你的曲线f(n)总是位于或低于该点。

当我们有渐近下界时,使用Big Omega

同时有上界和下界时,使用Theta

现在,回到您的问题——插入排序的复杂性为O(n²),合并排序为O(nlogn)。在较大的值下(n²)往往具有比(n-logn)更大的值
假设n=100。
在插入排序中,值为10000,而
对于合并排序,值为(100 log 100),即100.2->200。

因此,您可以看到合并排序将比插入排序运行得快得多。

最新更新