Comprehensive Rust(繁体中文)29.6.1 解決方案 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 30 不安全的 Rust 174 30.1 不安全的 Rust . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 30.2 對裸指標解參考 . 176 30.5 呼叫不安全的函式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 30.6 實作不安全的特徵 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 30.7 安全的 FFI 包裝函式 . . . minutes 模組 40 minutes 測試 45 minutes • 第 4 天下午 (2 小時 10 分鐘,含休息) Segment Duration 錯誤處理 55 minutes 不安全的 Rust 1 hour and 5 minutes 深入探索 In addition to the 4-day class on Rust Fundamentals, we cover some0 码力 | 358 页 | 1.41 MB | 10 月前3
 Hello 算法 1.2.0 繁体中文 TypeScript 版} } return -1; } 值得說明的是,我們在實際中很少使用最佳時間複雜度,因為通常只有在很小機率下才能達到,可能會帶來 一定的誤導性。而最差時間複雜度更為實用,因為它給出了一個效率安全值,讓我們可以放心地使用演算 法。 從上述示例可以看出,最差時間複雜度和最佳時間複雜度只出現於“特殊的資料分佈”,這些情況的出現機率 可能很小,並不能真實地反映演算法執行效率。相比之下,平均時間複雜度可以體現演算法在隨機輸入資料 /* 類別 */ class Node { val: number; next: Node | null; constructor(val?: number) { this.val = val === undefined ? 0 : val; // 節點值 this.next = null; // 指向下一節點的引用 } } /* 函式 */ function constFunc(): quadratic(n: number): void { // 矩陣佔用 O(n^2) 空間 const numMatrix = Array(n) .fill(null) .map(() => Array(n).fill(null)); // 二維串列佔用 O(n^2) 空間 const numList = []; for (let i = 0; i < n; i++) { const0 码力 | 384 页 | 18.80 MB | 10 月前3
 Hello 算法 1.2.0 繁体中文 C语言 版i; } return -1; } 值得說明的是,我們在實際中很少使用最佳時間複雜度,因為通常只有在很小機率下才能達到,可能會帶來 一定的誤導性。而最差時間複雜度更為實用,因為它給出了一個效率安全值,讓我們可以放心地使用演算 法。 從上述示例可以看出,最差時間複雜度和最佳時間複雜度只出現於“特殊的資料分佈”,這些情況的出現機率 可能很小,並不能真實地反映演算法執行效率。相比之下,平均時間複雜度可以體現演算法在隨機輸入資料 (int i = 0; i < n; i++) { free(nodes[i]); } free(nodes); // 長度為 n 的雜湊表佔用 O(n) 空間 HashTable *h = NULL; for (int i = 0; i < n; i++) { HashTable *tmp = malloc(sizeof(HashTable)); tmp->key = i; tmp->val File: space_complexity.c === /* 指數階(建立滿二元樹) */ TreeNode *buildTree(int n) { if (n == 0) return NULL; TreeNode *root = newTreeNode(0); root->left = buildTree(n - 1); root->right = buildTree(n - 1);0 码力 | 392 页 | 18.83 MB | 10 月前3
 Hello 算法 1.2.0 繁体中文 JavaScript 版} } return -1; } 值得說明的是,我們在實際中很少使用最佳時間複雜度,因為通常只有在很小機率下才能達到,可能會帶來 一定的誤導性。而最差時間複雜度更為實用,因為它給出了一個效率安全值,讓我們可以放心地使用演算 法。 從上述示例可以看出,最差時間複雜度和最佳時間複雜度只出現於“特殊的資料分佈”,這些情況的出現機率 可能很小,並不能真實地反映演算法執行效率。相比之下,平均時間複雜度可以體現演算法在隨機輸入資料 Node { val; next; constructor(val) { this.val = val === undefined ? 0 : val; // 節點值 this.next = null; // 指向下一節點的引用 } } /* 函式 */ function constFunc() { // 執行某些操作 第 2 章 複雜度分析 www.hello‑algo.com 43 */ function quadratic(n) { // 矩陣佔用 O(n^2) 空間 const numMatrix = Array(n) .fill(null) .map(() => Array(n).fill(null)); // 二維串列佔用 O(n^2) 空間 const numList = []; for (let i = 0; i < n; i++) { const0 码力 | 379 页 | 18.78 MB | 10 月前3
 Hello 算法 1.2.0 繁体中文 Kotlin 版i } return -1 } 值得說明的是,我們在實際中很少使用最佳時間複雜度,因為通常只有在很小機率下才能達到,可能會帶來 一定的誤導性。而最差時間複雜度更為實用,因為它給出了一個效率安全值,讓我們可以放心地使用演算 法。 從上述示例可以看出,最差時間複雜度和最佳時間複雜度只出現於“特殊的資料分佈”,這些情況的出現機率 可能很小,並不能真實地反映演算法執行效率。相比之下,平均時間複雜度可以體現演算法在隨機輸入資料 圖 2‑15 所示。 圖 2‑15 演算法使用的相關空間 相關程式碼如下: /* 類別 */ class Node(var _val: Int) { var next: Node? = null } /* 函式 */ fun function(): Int { // 執行某些操作... return 0 } fun algorithm(n: Int): Int { // 輸入資料 space_complexity.kt === /* 指數階(建立滿二元樹) */ fun buildTree(n: Int): TreeNode? { if (n == 0) return null val root = TreeNode(0) root.left = buildTree(n - 1) root.right = buildTree(n - 1) return root0 码力 | 382 页 | 18.79 MB | 10 月前3
 Hello 算法 1.2.0 繁体中文 Dart 版i; } return -1; } 值得說明的是,我們在實際中很少使用最佳時間複雜度,因為通常只有在很小機率下才能達到,可能會帶來 一定的誤導性。而最差時間複雜度更為實用,因為它給出了一個效率安全值,讓我們可以放心地使用演算 法。 從上述示例可以看出,最差時間複雜度和最佳時間複雜度只出現於“特殊的資料分佈”,這些情況的出現機率 可能很小,並不能真實地反映演算法執行效率。相比之下,平均時間複雜度可以體現演算法在隨機輸入資料 File: space_complexity.dart === /* 指數階(建立滿二元樹) */ TreeNode? buildTree(int n) { if (n == 0) return null; TreeNode root = TreeNode(0); root.left = buildTree(n - 1); root.right = buildTree(n - 1); return { if (nums[i] == target) return i; } return -1; } 7. 擴容陣列 在複雜的系統環境中,程式難以保證陣列之後的記憶體空間是可用的,從而無法安全地擴展陣列容量。因此 在大多數程式語言中,陣列的長度是不可變的。 如果我們希望擴容陣列,則需重新建立一個更大的陣列,然後把原陣列元素依次複製到新陣列。這是一個 ?(?) 的操作,在陣列很大的情況下非常耗時。程式碼如下所示:0 码力 | 378 页 | 18.77 MB | 10 月前3
 Hello 算法 1.2.0 繁体中文 C# 版i; } return -1; } 值得說明的是,我們在實際中很少使用最佳時間複雜度,因為通常只有在很小機率下才能達到,可能會帶來 一定的誤導性。而最差時間複雜度更為實用,因為它給出了一個效率安全值,讓我們可以放心地使用演算 法。 從上述示例可以看出,最差時間複雜度和最佳時間複雜度只出現於“特殊的資料分佈”,這些情況的出現機率 可能很小,並不能真實地反映演算法執行效率。相比之下,平均時間複雜度可以體現演算法在隨機輸入資料 File: space_complexity.cs === /* 指數階(建立滿二元樹) */ TreeNode? BuildTree(int n) { if (n == 0) return null; TreeNode root = new(0) { left = BuildTree(n - 1), right = BuildTree(n - 1) }; return root; { if (nums[i] == target) return i; } return -1; } 7. 擴容陣列 在複雜的系統環境中,程式難以保證陣列之後的記憶體空間是可用的,從而無法安全地擴展陣列容量。因此 在大多數程式語言中,陣列的長度是不可變的。 如果我們希望擴容陣列,則需重新建立一個更大的陣列,然後把原陣列元素依次複製到新陣列。這是一個 ?(?) 的操作,在陣列很大的情況下非常耗時。程式碼如下所示:0 码力 | 379 页 | 18.79 MB | 10 月前3
 Hello 算法 1.2.0 繁体中文 Java 版i; } return -1; } 值得說明的是,我們在實際中很少使用最佳時間複雜度,因為通常只有在很小機率下才能達到,可能會帶來 一定的誤導性。而最差時間複雜度更為實用,因為它給出了一個效率安全值,讓我們可以放心地使用演算 法。 從上述示例可以看出,最差時間複雜度和最佳時間複雜度只出現於“特殊的資料分佈”,這些情況的出現機率 可能很小,並不能真實地反映演算法執行效率。相比之下,平均時間複雜度可以體現演算法在隨機輸入資料 File: space_complexity.java === /* 指數階(建立滿二元樹) */ TreeNode buildTree(int n) { if (n == 0) return null; TreeNode root = new TreeNode(0); root.left = buildTree(n - 1); root.right = buildTree(n - 1); { if (nums[i] == target) return i; } return -1; } 7. 擴容陣列 在複雜的系統環境中,程式難以保證陣列之後的記憶體空間是可用的,從而無法安全地擴展陣列容量。因此 在大多數程式語言中,陣列的長度是不可變的。 如果我們希望擴容陣列,則需重新建立一個更大的陣列,然後把原陣列元素依次複製到新陣列。這是一個 ?(?) 的操作,在陣列很大的情況下非常耗時。程式碼如下所示:0 码力 | 379 页 | 18.79 MB | 10 月前3
 Hello 算法 1.2.0 繁体中文 Swift 版} } return -1 } 值得說明的是,我們在實際中很少使用最佳時間複雜度,因為通常只有在很小機率下才能達到,可能會帶來 一定的誤導性。而最差時間複雜度更為實用,因為它給出了一個效率安全值,讓我們可以放心地使用演算 法。 從上述示例可以看出,最差時間複雜度和最佳時間複雜度只出現於“特殊的資料分佈”,這些情況的出現機率 可能很小,並不能真實地反映演算法執行效率。相比之下,平均時間複雜度可以體現演算法在隨機輸入資料 if nums[i] == target { return i } } return -1 } 7. 擴容陣列 在複雜的系統環境中,程式難以保證陣列之後的記憶體空間是可用的,從而無法安全地擴展陣列容量。因此 在大多數程式語言中,陣列的長度是不可變的。 如果我們希望擴容陣列,則需重新建立一個更大的陣列,然後把原陣列元素依次複製到新陣列。這是一個 ?(?) 的操作,在陣列很大的情況下非常耗時。程式碼如下所示: “值”和指向下 一節點的“引用”。 ‧ 鏈結串列的首個節點被稱為“頭節點”,最後一個節點被稱為“尾節點”。 ‧ 尾節點指向的是“空”,它在 Java、C++ 和 Python 中分別被記為 null、nullptr 和 None 。 ‧ 在 C、C++、Go 和 Rust 等支持指標的語言中,上述“引用”應被替換為“指標”。 如以下程式碼所示,鏈結串列節點 ListNode 除了包含值,0 码力 | 379 页 | 18.79 MB | 10 月前3
 Hello 算法 1.2.0 繁体中文 Rust 版Some(i); } } None } 值得說明的是,我們在實際中很少使用最佳時間複雜度,因為通常只有在很小機率下才能達到,可能會帶來 一定的誤導性。而最差時間複雜度更為實用,因為它給出了一個效率安全值,讓我們可以放心地使用演算 法。 從上述示例可以看出,最差時間複雜度和最佳時間複雜度只出現於“特殊的資料分佈”,這些情況的出現機率 可能很小,並不能真實地反映演算法執行效率。相比之下,平均時間複雜度可以體現演算法在隨機輸入資料 if nums[i] == target { return Some(i); } } None } 7. 擴容陣列 在複雜的系統環境中,程式難以保證陣列之後的記憶體空間是可用的,從而無法安全地擴展陣列容量。因此 在大多數程式語言中,陣列的長度是不可變的。 如果我們希望擴容陣列,則需重新建立一個更大的陣列,然後把原陣列元素依次複製到新陣列。這是一個 ?(?) 的操作,在陣列很大的情況下非常耗時。程式碼如下所示: “值”和指向下 一節點的“引用”。 ‧ 鏈結串列的首個節點被稱為“頭節點”,最後一個節點被稱為“尾節點”。 ‧ 尾節點指向的是“空”,它在 Java、C++ 和 Python 中分別被記為 null、nullptr 和 None 。 ‧ 在 C、C++、Go 和 Rust 等支持指標的語言中,上述“引用”應被替換為“指標”。 如以下程式碼所示,鏈結串列節點 ListNode 除了包含值,0 码力 | 388 页 | 18.82 MB | 10 月前3
共 42 条
- 1
 - 2
 - 3
 - 4
 - 5
 













