你好!今天的講座與其他講座略有不同。它的不同之處在於它僅與 Java 間接相關。 然而,這個主題對於每個程式設計師來說都非常重要。我們將討論演算法。什麼是演算法?簡單來說,這是為了達到預期結果而必須執行的一系列操作。我們在日常生活中經常使用演算法。例如,每天早上您都會面臨一項任務:去學校或上班,同時:
- 著裝
- 乾淨的
- 餵得很好
- 被鬧鐘叫醒。
- 洗澡,洗臉。
- 準備早餐,煮咖啡/茶。
- 吃。
- 如果您從晚上開始就沒有熨燙衣服,請熨燙它們。
- 穿上衣服。
- 離開這房子。
- 網路上購買或下載《俄羅斯人名詞典》1966 年版。
- 在這本字典中找出我們清單中的每個名字。
- 在一張紙上寫下這個名字位於字典的哪一頁。
- 使用一張紙上的筆記將姓名按順序排列。
for
您編寫一個執行此任務的 常規循環
int[] numbers = new int[100];
// ..заполняем массив числами
for (int i: numbers) {
System.out.println(i);
}
編寫的演算法的複雜度是多少?線性,O(N)。 程式必須執行的操作數量取決於傳入其中的數字數量。如果陣列中有 100 個數字,則需要執行 100 個操作(在螢幕上輸出)。如果陣列中有 10,000 個數字,則需要執行 10,000 個操作。我們的演算法可以改進嗎?不。無論如何,我們都必須對數組進行 N 次遍歷並對控制台執行 N 次輸出。讓我們來看另一個例子。
public static void main(String[] args) {
LinkedList<Integer> numbers = new LinkedList<>();
numbers.add(0, 20202);
numbers.add(0, 123);
numbers.add(0, 8283);
}
我們有一個空的,LinkedList
可以在其中插入幾個數字。我們需要估計將單個數字插入到範例中的演算法的複雜性LinkedList
,以及它如何依賴列表中的元素數量。答案是O(1) - 恆定的複雜度。為什麼?請注意:每次我們在清單的開頭插入一個數字。此外,正如您所記得的,當數字插入LinkedList
元素時,它們不會移動到任何地方 - 連結被重新定義(如果您突然忘記了 LinkedList 是如何工作的,請看一下我們的舊講座之一)。如果現在清單中的第一個數字是 number х
,而我們在清單的開頭插入數字 y ,則所需要做的就是:
x.previous = y;
y.previous = null;
y.next = x;
對於這個參考的重新定義,現在有多少個數字對我們來說並不重要LinkedList
──至少一個,至少十億。演算法的複雜度是恆定的 - O(1)。
GO TO FULL VERSION