簡體   English   中英

將第一個元素放在堆棧(鏈表)上的最壞情況時間復雜度是多少?

[英]What is worst case time complexity to get the FIRST element placed on a Stack (linked-list)?

它是線性時間還是恆定時間,為什么? 它是線性的,因為第一個元素在底部嗎? 還是因為鏈表中的遍歷而保持不變?

困惑並尋求解釋。 使用 Java

Java 的LinkedList是一個雙向隊列,它維護指向第一個和最后一個元素的指針。 每當您嘗試獲取LinkedList的最后一個元素時,都可以直接訪問它,因為它已經有一個指向它的指針。 因此,要獲取最后一個元素,時間復雜度為 O(1)。

它還有一個方法getLast()來檢索最后一個元素。

你的問題模棱兩可:

  • java.util.Stack class 不是鏈表。 它實際上是Vector的子類型,內部使用數組而不是鏈表。

  • 一般而言,“堆棧”是一種抽象:API。 如果不將它們與特定的實現聯系起來,我們就無法對“堆棧”的復雜性做出明確的陳述。

  • 甚至說“作為鏈表實現的堆棧”是不夠的,因為您可以使用鏈表以多種方式實現堆棧。 有一種明顯的方法可以做到這一點……還有其他具有不同性能特征的方法。

也不清楚您所說的“第一”和“底部”是什么意思。 我想我已經弄清楚了,但是如果您要問需要精確答案的問題,那么問題本身應該是精確的!

所以......讓我們做一些假設:

  1. 假設“底部”元素是彈出堆棧的所有元素時最后彈出的元素。

  2. 假設棧不是java.util.Stack而是使用鏈表的合理實現; push()實現為將新節點添加到列表的開頭,而pop()實現為刪除列表開頭的節點。

push()pop()的復雜度將是O(1)

那么檢索堆棧的“底部”元素的復雜性是什么?

好吧,如果您遵循具有 N 個元素的堆棧的鏈表鏈,則您有 N 個鏈接要遍歷以到達“底部”元素的列表節點; O(N)

但是,如果您的堆棧實現還保留指向最后一個列表節點的指針,則可以在O(1)中獲得“底部”列表節點。 (你會這樣做嗎?這取決於你是否需要經常獲取底部元素!)

請注意,上述分析適用於單鏈表和雙鏈表。


請注意,如果我們談論的是基於數組的堆棧,則獲取底部元素的代碼大致相當於:

get_bottom() {
    return this.array[this.bottom] 
}

O(1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM