我无法理解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;
}
答案 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)
..和适当的说法:正确且终止! ;)