【问题标题】:Linked List time complexity for its operations [duplicate]其操作的链表时间复杂度[重复]
【发布时间】:2013-09-08 00:36:39
【问题描述】:

我正在根据股票市场计划实施链接列表。

它有和操作 - 购买

购买代码是

//Stocks is a linked List like so 
//LinkedList<Integer> stocks = new LinkedList<Integer>();
public void buy(int q, int p) {
    stocks.addLast(q); //add number of stocks
    stocks.addLast(p); //for i stocks i +1 = price of stock
}

这个操作 addLast 是针对链表显然将给定元素添加到当前列表末尾的新位置。

例如,如果我有一个列表,其中包含以下数据

//Stock, price, stock, price etc...
[100, 50, 5000, 30, 8000, 60]

如果我addLast 是链接列表搜索最后一个元素然后添加,因此时间复杂度将为 O(n)(仅就 Big Oh 而言)。还是索引到列表的末尾,意识到列表的末尾是stocks[5],然后在列表的末尾插入一个引用新数据的新节点?

所以我的问题是,addLast() 操作是否适用于 O(n) 或 O(1) 的链表时间复杂度?

在下面发布任何澄清

【问题讨论】:

  • 除了它不是 getLast 是吗?^^

标签: java linked-list


【解决方案1】:

如果您阅读了 LinkedList 类的 javadoc,它指出:“所有操作都按照双向链表的预期执行。索引到列表中的操作将从头开始遍历列表 或结尾,以更接近指定索引的为准。”

这意味着它是 O(1)

编辑

如果您想要更好地实现您的股票名称、价格表,我认为创建一个包含股票描述的类会更好:

public class Stock {
    private int stockName;
    private int stockPrice;

    // other methods, properties, constructor
}

然后创建一个LinkedList&lt;Stock&gt;

【讨论】:

  • 谢谢你没想到要查看 javadoc,下次在问这种类型的问题之前我会这样做 - 干杯
  • 随时!不过,我对您对解决方案的实施有一点意见,我将其添加为我的答案的编辑
【解决方案2】:

add()addLast() 的复杂度在列表长度上是O(1)。从阅读LinkedList source code. 可以明显看出这一点

(由于在 javadoc1 中没有精确指定行为的这方面,因此理论上可以更改......但是,我们可以自信地排除这种可能性。即使它是有道理的(事实并非如此!),这样的更改会破坏许多现有的应用程序。仅此一项就足以将其排除为不可信。)


1 - 我认为 javadoc 语句 “[o] 索引到列表中的操作将从开头或结尾遍历列表,以更接近指定索引的为准” 并不明确适用于此方法。您可能会争辩说 add / addLast 方法没有索引到列表中。

【讨论】:

    【解决方案3】:

    查看 LinkedList 类的源代码,addLast 实际上调用了一个名为 linkLast 的方法,即:

    void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }
    

    相关部分是last 在类transient Node&lt;E&gt; last; 中声明的位置,该类似乎拥有指向最后一个节点的“指针”。然后它使用给定的新节点进行更新。因此,无论列表大小如何,它都应该是 O(1)。

    【讨论】:

    • 啊谢谢这也很好,谢谢你告诉我它有一个指向最后一个元素的指针
    猜你喜欢
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2012-11-27
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    相关资源
    最近更新 更多