mirror of
				https://github.com/krahets/hello-algo.git
				synced 2025-10-31 18:37:48 +08:00 
			
		
		
		
	| @ -572,7 +572,7 @@ | |||||||
|     /* 递归的空间复杂度为 O(n) */ |     /* 递归的空间复杂度为 O(n) */ | ||||||
|     void recur(int n) { |     void recur(int n) { | ||||||
|         if (n == 1) return; |         if (n == 1) return; | ||||||
|         return recur(n - 1); |         recur(n - 1); | ||||||
|     } |     } | ||||||
|     ``` |     ``` | ||||||
|  |  | ||||||
| @ -592,7 +592,7 @@ | |||||||
|     /* 递归的空间复杂度为 O(n) */ |     /* 递归的空间复杂度为 O(n) */ | ||||||
|     void recur(int n) { |     void recur(int n) { | ||||||
|         if (n == 1) return; |         if (n == 1) return; | ||||||
|         return recur(n - 1); |         recur(n - 1); | ||||||
|     } |     } | ||||||
|     ``` |     ``` | ||||||
|  |  | ||||||
| @ -721,7 +721,7 @@ | |||||||
|     /* 递归的空间复杂度为 O(n) */ |     /* 递归的空间复杂度为 O(n) */ | ||||||
|     void recur(int n) { |     void recur(int n) { | ||||||
|       if (n == 1) return; |       if (n == 1) return; | ||||||
|       return recur(n - 1); |       recur(n - 1); | ||||||
|     } |     } | ||||||
|     ``` |     ``` | ||||||
|  |  | ||||||
| @ -763,7 +763,7 @@ | |||||||
|     /* 递归的空间复杂度为 O(n) */ |     /* 递归的空间复杂度为 O(n) */ | ||||||
|     void recur(int n) { |     void recur(int n) { | ||||||
|         if (n == 1) return; |         if (n == 1) return; | ||||||
|         return recur(n - 1); |         recur(n - 1); | ||||||
|     } |     } | ||||||
|     ``` |     ``` | ||||||
|  |  | ||||||
|  | |||||||
| @ -511,7 +511,7 @@ Consider the following code, the term "worst-case" in worst-case space complexit | |||||||
|     /* Recursion O(n) */ |     /* Recursion O(n) */ | ||||||
|     void recur(int n) { |     void recur(int n) { | ||||||
|         if (n == 1) return; |         if (n == 1) return; | ||||||
|         return recur(n - 1); |         recur(n - 1); | ||||||
|     } |     } | ||||||
|     ``` |     ``` | ||||||
|  |  | ||||||
| @ -531,7 +531,7 @@ Consider the following code, the term "worst-case" in worst-case space complexit | |||||||
|     /* Recursion O(n) */ |     /* Recursion O(n) */ | ||||||
|     void recur(int n) { |     void recur(int n) { | ||||||
|         if (n == 1) return; |         if (n == 1) return; | ||||||
|         return recur(n - 1); |         recur(n - 1); | ||||||
|     } |     } | ||||||
|     ``` |     ``` | ||||||
|  |  | ||||||
| @ -660,7 +660,7 @@ Consider the following code, the term "worst-case" in worst-case space complexit | |||||||
|     /* Recursion O(n) */ |     /* Recursion O(n) */ | ||||||
|     void recur(int n) { |     void recur(int n) { | ||||||
|       if (n == 1) return; |       if (n == 1) return; | ||||||
|       return recur(n - 1); |       recur(n - 1); | ||||||
|     } |     } | ||||||
|     ``` |     ``` | ||||||
|  |  | ||||||
| @ -702,7 +702,7 @@ Consider the following code, the term "worst-case" in worst-case space complexit | |||||||
|     /* Recursion O(n) */ |     /* Recursion O(n) */ | ||||||
|     void recur(int n) { |     void recur(int n) { | ||||||
|         if (n == 1) return; |         if (n == 1) return; | ||||||
|         return recur(n - 1); |         recur(n - 1); | ||||||
|     } |     } | ||||||
|     ``` |     ``` | ||||||
|  |  | ||||||
|  | |||||||
| @ -8,10 +8,7 @@ | |||||||
| // 簡單實現,無法用於排序物件 | // 簡單實現,無法用於排序物件 | ||||||
| function countingSortNaive(nums) { | function countingSortNaive(nums) { | ||||||
|     // 1. 統計陣列最大元素 m |     // 1. 統計陣列最大元素 m | ||||||
|     let m = 0; |     let m = Math.max(...nums); | ||||||
|     for (const num of nums) { |  | ||||||
|         m = Math.max(m, num); |  | ||||||
|     } |  | ||||||
|     // 2. 統計各數字的出現次數 |     // 2. 統計各數字的出現次數 | ||||||
|     // counter[num] 代表 num 的出現次數 |     // counter[num] 代表 num 的出現次數 | ||||||
|     const counter = new Array(m + 1).fill(0); |     const counter = new Array(m + 1).fill(0); | ||||||
| @ -31,10 +28,7 @@ function countingSortNaive(nums) { | |||||||
| // 完整實現,可排序物件,並且是穩定排序 | // 完整實現,可排序物件,並且是穩定排序 | ||||||
| function countingSort(nums) { | function countingSort(nums) { | ||||||
|     // 1. 統計陣列最大元素 m |     // 1. 統計陣列最大元素 m | ||||||
|     let m = 0; |     let m = Math.max(...nums); | ||||||
|     for (const num of nums) { |  | ||||||
|         m = Math.max(m, num); |  | ||||||
|     } |  | ||||||
|     // 2. 統計各數字的出現次數 |     // 2. 統計各數字的出現次數 | ||||||
|     // counter[num] 代表 num 的出現次數 |     // counter[num] 代表 num 的出現次數 | ||||||
|     const counter = new Array(m + 1).fill(0); |     const counter = new Array(m + 1).fill(0); | ||||||
|  | |||||||
| @ -41,12 +41,7 @@ function countingSortDigit(nums, exp) { | |||||||
| /* 基數排序 */ | /* 基數排序 */ | ||||||
| function radixSort(nums) { | function radixSort(nums) { | ||||||
|     // 獲取陣列的最大元素,用於判斷最大位數 |     // 獲取陣列的最大元素,用於判斷最大位數 | ||||||
|     let m = Number.MIN_VALUE; |     let m = Math.max(... nums); | ||||||
|     for (const num of nums) { |  | ||||||
|         if (num > m) { |  | ||||||
|             m = num; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     // 按照從低位到高位的順序走訪 |     // 按照從低位到高位的順序走訪 | ||||||
|     for (let exp = 1; exp <= m; exp *= 10) { |     for (let exp = 1; exp <= m; exp *= 10) { | ||||||
|         // 對陣列元素的第 k 位執行計數排序 |         // 對陣列元素的第 k 位執行計數排序 | ||||||
|  | |||||||
| @ -8,10 +8,7 @@ | |||||||
| // 簡單實現,無法用於排序物件 | // 簡單實現,無法用於排序物件 | ||||||
| function countingSortNaive(nums: number[]): void { | function countingSortNaive(nums: number[]): void { | ||||||
|     // 1. 統計陣列最大元素 m |     // 1. 統計陣列最大元素 m | ||||||
|     let m = 0; |     let m: number = Math.max(...nums); | ||||||
|     for (const num of nums) { |  | ||||||
|         m = Math.max(m, num); |  | ||||||
|     } |  | ||||||
|     // 2. 統計各數字的出現次數 |     // 2. 統計各數字的出現次數 | ||||||
|     // counter[num] 代表 num 的出現次數 |     // counter[num] 代表 num 的出現次數 | ||||||
|     const counter: number[] = new Array<number>(m + 1).fill(0); |     const counter: number[] = new Array<number>(m + 1).fill(0); | ||||||
| @ -31,10 +28,7 @@ function countingSortNaive(nums: number[]): void { | |||||||
| // 完整實現,可排序物件,並且是穩定排序 | // 完整實現,可排序物件,並且是穩定排序 | ||||||
| function countingSort(nums: number[]): void { | function countingSort(nums: number[]): void { | ||||||
|     // 1. 統計陣列最大元素 m |     // 1. 統計陣列最大元素 m | ||||||
|     let m = 0; |     let m: number = Math.max(...nums); | ||||||
|     for (const num of nums) { |  | ||||||
|         m = Math.max(m, num); |  | ||||||
|     } |  | ||||||
|     // 2. 統計各數字的出現次數 |     // 2. 統計各數字的出現次數 | ||||||
|     // counter[num] 代表 num 的出現次數 |     // counter[num] 代表 num 的出現次數 | ||||||
|     const counter: number[] = new Array<number>(m + 1).fill(0); |     const counter: number[] = new Array<number>(m + 1).fill(0); | ||||||
|  | |||||||
| @ -41,12 +41,7 @@ function countingSortDigit(nums: number[], exp: number): void { | |||||||
| /* 基數排序 */ | /* 基數排序 */ | ||||||
| function radixSort(nums: number[]): void { | function radixSort(nums: number[]): void { | ||||||
|     // 獲取陣列的最大元素,用於判斷最大位數 |     // 獲取陣列的最大元素,用於判斷最大位數 | ||||||
|     let m = Number.MIN_VALUE; |     let m: number = Math.max(... nums); | ||||||
|     for (const num of nums) { |  | ||||||
|         if (num > m) { |  | ||||||
|             m = num; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     // 按照從低位到高位的順序走訪 |     // 按照從低位到高位的順序走訪 | ||||||
|     for (let exp = 1; exp <= m; exp *= 10) { |     for (let exp = 1; exp <= m; exp *= 10) { | ||||||
|         // 對陣列元素的第 k 位執行計數排序 |         // 對陣列元素的第 k 位執行計數排序 | ||||||
|  | |||||||
| @ -572,7 +572,7 @@ | |||||||
|     /* 遞迴的空間複雜度為 O(n) */ |     /* 遞迴的空間複雜度為 O(n) */ | ||||||
|     void recur(int n) { |     void recur(int n) { | ||||||
|         if (n == 1) return; |         if (n == 1) return; | ||||||
|         return recur(n - 1); |         recur(n - 1); | ||||||
|     } |     } | ||||||
|     ``` |     ``` | ||||||
|  |  | ||||||
| @ -592,7 +592,7 @@ | |||||||
|     /* 遞迴的空間複雜度為 O(n) */ |     /* 遞迴的空間複雜度為 O(n) */ | ||||||
|     void recur(int n) { |     void recur(int n) { | ||||||
|         if (n == 1) return; |         if (n == 1) return; | ||||||
|         return recur(n - 1); |         recur(n - 1); | ||||||
|     } |     } | ||||||
|     ``` |     ``` | ||||||
|  |  | ||||||
| @ -721,7 +721,7 @@ | |||||||
|     /* 遞迴的空間複雜度為 O(n) */ |     /* 遞迴的空間複雜度為 O(n) */ | ||||||
|     void recur(int n) { |     void recur(int n) { | ||||||
|       if (n == 1) return; |       if (n == 1) return; | ||||||
|       return recur(n - 1); |       recur(n - 1); | ||||||
|     } |     } | ||||||
|     ``` |     ``` | ||||||
|  |  | ||||||
| @ -763,7 +763,7 @@ | |||||||
|     /* 遞迴的空間複雜度為 O(n) */ |     /* 遞迴的空間複雜度為 O(n) */ | ||||||
|     void recur(int n) { |     void recur(int n) { | ||||||
|         if (n == 1) return; |         if (n == 1) return; | ||||||
|         return recur(n - 1); |         recur(n - 1); | ||||||
|     } |     } | ||||||
|     ``` |     ``` | ||||||
|  |  | ||||||
|  | |||||||
| @ -173,7 +173,19 @@ | |||||||
| === "Zig" | === "Zig" | ||||||
|  |  | ||||||
|     ```zig title="" |     ```zig title="" | ||||||
|  |     const hello = [5]u8{ 'h', 'e', 'l', 'l', 'o' }; | ||||||
|  |     // 以上程式碼展示了定義一個字面量陣列的方式,其中你可以選擇指明陣列的大小或者使用 _ 代替。使用 _ 時,Zig 會嘗試自動計算陣列的長度 | ||||||
|  |      | ||||||
|  |     const matrix_4x4 = [4][4]f32{ | ||||||
|  |         [_]f32{ 1.0, 0.0, 0.0, 0.0 }, | ||||||
|  |         [_]f32{ 0.0, 1.0, 0.0, 1.0 }, | ||||||
|  |         [_]f32{ 0.0, 0.0, 1.0, 0.0 }, | ||||||
|  |         [_]f32{ 0.0, 0.0, 0.0, 1.0 }, | ||||||
|  |     }; | ||||||
|  |     // 多維陣列(矩陣)實際上就是巢狀陣列,我們很容易就可以建立一個多維陣列出來 | ||||||
|  |  | ||||||
|  |     const array = [_:0]u8{ 1, 2, 3, 4 }; | ||||||
|  |     // 定義一個哨兵終止陣列,本質上來說,這是為了相容 C 中的規定的字串結尾字元\0。我們使用語法 [N:x]T 來描述一個元素為型別 T,長度為 N 的陣列,在它對應 N 的索引處的值應該是 x | ||||||
|     ``` |     ``` | ||||||
|  |  | ||||||
| ??? pythontutor "視覺化執行" | ??? pythontutor "視覺化執行" | ||||||
|  | |||||||
| @ -80,4 +80,4 @@ | |||||||
|  |  | ||||||
| - 二分搜尋僅適用於有序資料。若輸入資料無序,為了使用二分搜尋而專門進行排序,得不償失。因為排序演算法的時間複雜度通常為 $O(n \log n)$ ,比線性查詢和二分搜尋都更高。對於頻繁插入元素的場景,為保持陣列有序性,需要將元素插入到特定位置,時間複雜度為 $O(n)$ ,也是非常昂貴的。 | - 二分搜尋僅適用於有序資料。若輸入資料無序,為了使用二分搜尋而專門進行排序,得不償失。因為排序演算法的時間複雜度通常為 $O(n \log n)$ ,比線性查詢和二分搜尋都更高。對於頻繁插入元素的場景,為保持陣列有序性,需要將元素插入到特定位置,時間複雜度為 $O(n)$ ,也是非常昂貴的。 | ||||||
| - 二分搜尋僅適用於陣列。二分搜尋需要跳躍式(非連續地)訪問元素,而在鏈結串列中執行跳躍式訪問的效率較低,因此不適合應用在鏈結串列或基於鏈結串列實現的資料結構。 | - 二分搜尋僅適用於陣列。二分搜尋需要跳躍式(非連續地)訪問元素,而在鏈結串列中執行跳躍式訪問的效率較低,因此不適合應用在鏈結串列或基於鏈結串列實現的資料結構。 | ||||||
| - 小資料量下,線性查詢效能更佳。線性查詢中,每輪只需 1 次判斷操作;而在二分搜尋中,需要 1 次加法、1 次除法、1 ~ 3 次判斷操作、1 次加法(減法),共 4 ~ 6 個單元操作;因此,當資料量 $n$ 較小時,線性查詢反而比二分搜尋更快。 | - 小資料量下,線性查詢效能更佳。在線性查詢中,每輪只需 1 次判斷操作;而在二分搜尋中,需要 1 次加法、1 次除法、1 ~ 3 次判斷操作、1 次加法(減法),共 4 ~ 6 個單元操作;因此,當資料量 $n$ 較小時,線性查詢反而比二分搜尋更快。 | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Yudong Jin
					Yudong Jin