[英]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),因為您至少要遍歷鏈表的所有節點一次。 為了解決您問題的第二部分,有兩種方法可以完成:
希望這會有所幫助.. 快樂編碼:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.