为什么清除链表的O(n)操作?

时间:2015-02-06 06:38:10

标签: java algorithm linked-list garbage-collection time-complexity

根据附件1,链表的清除操作是O(n)。

我有一个问题,为什么会这样。

以下是我们在类(java)

中实现链表的方法
public class LinkedIntList {
           private ListNode front;
            ......
}

如果我要为这个链表类写一个清晰的方法,这就是我写它的方式

public void clear() { 
        front = null;
}

鉴于这种实现(想想大多数人都会这样写),这将是一个独立于列表大小的操作(只需将前面设置为null)。另外,通过将前指针设置为null,您基本上不会要求垃圾收集器回收底层内存并重新使用它以供将来的对象分配。"在这种情况下,底层内存将是前端节点和连续连接到它的所有节点。(http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx

在陈述所有这些之后,如何清除链表的O(n)操作?


附件1:

这是来自我所在的数据结构类 enter image description here

2 个答案:

答案 0 :(得分:2)

请记住,链接列表包含为其分配的n条目,为了清除它,您实际上需要释放它们。

由于java有一个内置的garbage collector (GC) - 你不需要明确地释放它们 - 但GC会遍历它们中的每一个并在时机到来时释放它们

因此,即使您的显式方法为O(1),从GC调用它也需要O(n)时间,这将使您的程序成为O(n)

答案 1 :(得分:1)

我希望您的数据结构类不假设JAVA是世界上唯一的系统。

在C,C ++,Pascal,汇编,机器代码,Objective C,VB 6等中,由于它们没有垃圾收集器,因此需要一段固定的时间来释放每个内存块。直到最近,大多数程序都没有垃圾收集器的好处。

所以在上面的任何一个中,所有节点都需要传递给free(),而对free()的调用大约需要一个固定的时间。


在Java中,列出的链接需要花费O(1)时间来清除链接列表的简单植入。

然而,由于有可能从列表外部指向节点,或者垃圾收集器将在不同时间考虑内存的不同部分,因此设置所有“下一个”可能会带来真正的好处和“prev”指向null。但是在99%的情况下 ,最好只将标题中的“前”指针设置为null,如代码所示。


我认为你应该向你的讲座询问这个问题,因为我希望课堂上有很多学生会遇到同样的问题。你需要先学好C才能理解最常见的数据结构书籍或课程。