【问题标题】:Is my time complexity correct for my bubble sort code?我的冒泡排序代码的时间复杂度是否正确?
【发布时间】:2015-03-12 17:28:01
【问题描述】:

这里是计算机科学的新手,所以我写了这个冒泡排序代码并尝试在这里计算它的时间复杂度和性能,排序代码在这里:

for (int i = 0; i < size; i++)
{
  Node current = head.next;
  while (current.next != tail)
  {
    if (current.element.depth < current.next.element.depth)
    {
      swap(current, current.next);
    }
    else
    {
      current = current.next;
    }
  }
}

swap方法代码在这里:

void swap(Node nodeA, Node nodeB)
{
    Node before = nodeA.prev;
    Node after = nodeB.next;
    before.next = nodeB;
    after.prev = nodeA;
    nodeB.next = nodeA;
    nodeB.prev = before;
    nodeA.prev = nodeB;
    nodeA.next = after;
}

现在我知道冒泡排序的时间复杂度是O(n^2) 在最坏情况下的性能,但我正在尝试计算我的 for 循环中每个执行的函数。我对时间复杂度有基本的了解,我知道循环的标准是f(n) = 2n + 2,我们考虑时间复杂度的最坏情况。到目前为止,这是我为我的代码找到f(n) 的想法进展:

int i = 0;            This will be executed only once.
i < size;             This will be executed N+1 times.
i ++;                 This will be executed N times.
current = head.next;  This will be executed N times.
current.next != tail; This will be executed N times.

And since a while loop is within the for loop,
    it's n*n within the while loop, there
    are 4 operations, so it's 4n^2.

在最坏的情况下,我每次都必须使用 swap 方法,因为我的 swap 方法的时间复杂度只是 8(我认为,这只是 8 执行,对吗?)所以最坏的情况是swap(current,current.next)8n

如果我们把它们加起来:

f(n) = 1 + n + 1 + n + n + n+  4n^2 + 8n

f(n) = 4n^2 + 12n + 2

f(n) ~ O(n^2)

我的时间复杂度f(n) 正确吗?

如果没有,请您指点我正确的答案,您还有一些建议可以提高我的代码性能吗?

【问题讨论】:

    标签: java algorithm sorting


    【解决方案1】:

    因为你在 for 循环中有一个 while 循环 - 是的,你有一个 O(n^2) 复杂度,这被认为是不好的。

    这里的经验法则如下(对于N个元素的输入,从好到坏):

    • 没有循环,只是一些执行,不管输入大小 = O(1)
    • Lo​​op(N/M)(在每次迭代中除以输入)= O(log N)
    • 仅对 N 个元素进行一次循环 = O(N)
    • Lo​​op2(N) 内 Loop1(N) = O(N^2)

    请参阅此答案以获得更好的解释:What does O(log n) mean exactly?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 2015-05-17
      • 2015-06-15
      • 2017-06-06
      • 2017-04-12
      相关资源
      最近更新 更多