如何找到此Java程序的Big-O复杂性和最坏情况的运行时间?

时间:2019-01-24 01:35:58

标签: java big-o

我无法理解Big-O表示法。如何找到此功能的Big-O和最坏情况下的运行时间?

我编写了此函数来反转双向链表的顺序。

public void reverse() {
    Node<T> temp = head;
    Node<T> current = head.next;
    head.next = null;
    head.previous = current;

    while(current != null)
    {
        Node<T> next = current.next;
        current.next = temp;
        current.previous= next;
        temp = current;
        current = next;
    }
    head = tail;
}

2 个答案:

答案 0 :(得分:2)

寻找嵌套循环的数量。

因为没有一个,所以它只是O(n),因为在循环过程中n没有几何缩小

答案 1 :(得分:0)

“数据结构”应该使我们想起“双重链接列表”,并且假设列表的大小为n,则此算法会颠倒该列表的顺序。 现在,我们可以算出该算法将完成的(比较,赋值,数学)运算(相对于n:。

)。

我们会发现,该算法确实(在最坏的情况下,最好的情况下以及平均值(如此))都适用:

4 assign statements:
 Node<T> temp = head;
 Node<T> current = head.next;
 head.next = null;
 head.previous = current;
n + 1 compare statements:
 while(current != null)
(lets not count the braces))
n * 5 assign operations:
 Node<T> next = current.next;
 current.next = temp;
 current.previous= next;
 temp = current;
 current = next;
and 1 last assign operation
 head = tail;

因此它是4 + n + 1 + 5 * n + 1 = 6 * n + 6(分配或比较...但比较在运行时间上是“最昂贵的”操作)。 我们消除了常数因子和偏移量(由于n变大时...由于可以忽略,并且由于精确的数学规则,我们可以了解它们),因此得到:

6n + 6 = O(n)

..和适当的说法:正确且终止! ;)