【发布时间】:2013-03-04 00:13:34
【问题描述】:
我有一个实用的方法来确定使用 O() 表示法的一小段代码的复杂性。
代码是:
for (int i = 0; i < list.size(); i++)
System.out.println(list.get(i));
有问题的列表是一个链表。对于我们的实际操作,我们得到了一个现成的 LinkedList 类,尽管我们必须编写自己的 size() 和 get() 方法。
这个问题让我感到困惑的是,在最终计算中要计算什么。问题问:
如果列表中有 100 个元素,它将进行多少次查找?在此基础上,使用 O() 表示法计算程序的复杂度。
如果我只计算get() 方法,它将平均进行 n/2 次查找,从而导致 O(n) 的大 O 表示法。但是,for 循环的每次迭代都需要重新计算 size(),这涉及到查找(以确定链表中有多少个节点)。
在计算这段代码的复杂度时,是否应该考虑到这一点?还是计算大小不算作查找?
【问题讨论】:
-
这是您自己实现的链表还是 Java 中包含的?
-
@AndrewMarshall:大学给了我们一个 LinkedList 课程。它拥有 LinkedList 类的所有方法,除了我们必须自己编写的 size() 和 get()。
-
仅供参考,如果您正在实现 get() 和 size() 调用,则可以在那些计算这些函数必须调用列表查找函数的次数(getFirst() ,下一个()等)。这将为您提供问题的“100”元素部分的答案。尝试 1000 和 10000,O 表示法应该是相当明显的......以及为什么不应该以这种方式循环链接列表。
标签: java linked-list