簡體   English   中英

如何知道這個 while 循環是 O(n) 還是 O(1)?

[英]How to know if this while loop is O(n) or O(1)?

我的任務是編寫一個返回自制鏈表長度的方法。 該方法必須在恆定時間 O(1) 內。 我的想法是始終將計數器增加 1,以確保鏈表中的節點不是 null 並且根本不會弄亂列表的大小以避免 O(n)。

我的代碼:

public int getLength() {
    // TODO Code hier einfügen
    
    if (headNode == null) {
        return 0;
    } 

    int count = 0;
    while (headNode != null)
    {
        count++;
        headNode = headNode.next;
    }
    return count;
}

我的代碼是否處於恆定時間 O(1)? 如果不是,您將如何在 O(1) 中為鏈表創建長度方法?

你的代碼是O(n)。 如果它已經被裝箱並且您必須遍歷它,您無法在 O(1) 中獲得鏈表的長度。 要獲得 O(1) 中的長度,您可以做的是保留一個變量,只要將節點插入列表中,該變量就會增加,而每當從列表中刪除節點時,該變量就會減少。

要了解任何代碼的復雜性,您必須查看循環。 假設列表的大小為 n。 如果代碼中有一個從 1 到 n 的循環,則復雜度為 O(n),類似地,如果第一個循環內還有另一個嵌套循環也從 1 到 n,則復雜度為 O(n^2 )。 如果代碼中沒有循環,則表示其復雜度為 O(1)。

我希望這能回答你的問題。

您的代碼是 O(n),因為您至少要遍歷鏈表的所有節點一次。 為了解決您問題的第二部分,有兩種方法可以完成:

  1. 定義一個 static 可變長度,每次從列表中添加或刪除元素時,都必須更新此變量。
  2. 更改節點的結構以存儲每個節點的索引或在頭節點中保留一個額外的指針長度,以跟蹤鏈表的長度。

希望這會有所幫助.. 快樂編碼:)

暫無
暫無

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

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