Hello 算法 1.2.0 简体中文 Rust 版19 2.3 时间复杂度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.4 空间复杂度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.5 小结 . . . 前置条件 你需要至少具备任一语言的编程基础,能够阅读和编写简单代码。 0.1.2 内容结构 本书的主要内容如图 0‑1 所示。 ‧ 复杂度分析:数据结构和算法的评价维度与方法。时间复杂度和空间复杂度的推算方法、常见类型、示 例等。 ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 具有可行性,能够在有限步骤、时间和内存空间下完成。 ‧ 各步骤都有确定的含义,在相同的输入和运行条件下,输出始终相同。 1.2.2 数据结构定义 数据结构(data structure)是组织和存储数据的方式,涵盖数据内容、数据之间关系和数据操作方法,它具 有以下设计目标。 第 1 章 初识算法 www.hello‑algo.com 14 ‧ 空间占用尽量少,以节省计算机内存。 ‧0 码力 | 387 页 | 18.51 MB | 10 月前3
Hello 算法 1.1.0 Rust版19 2.3 时间复杂度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.4 空间复杂度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.5 小结 . . . 前置条件 你需要至少具备任一语言的编程基础,能够阅读和编写简单代码。 0.1.2 内容结构 本书的主要内容如图 0‑1 所示。 ‧ 复杂度分析:数据结构和算法的评价维度与方法。时间复杂度和空间复杂度的推算方法、常见类型、示 例等。 ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 问题是明确的,包含清晰的输入和输出定义。 ‧ 具有可行性,能够在有限步骤、时间和内存空间下完成。 ‧ 各步骤都有确定的含义,在相同的输入和运行条件下,输出始终相同。 1.2.2 数据结构定义 数据结构(data structure)是计算机中组织和存储数据的方式,具有以下设计目标。 ‧ 空间占用尽量少,以节省计算机内存。 第 1 章 初识算法 hello‑algo.com 140 码力 | 388 页 | 18.50 MB | 1 年前3
Hello 算法 1.0.0 Rust版19 2.3 时间复杂度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.4 空间复杂度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.5 小结 . . . 前置条件 你需要至少具备任一语言的编程基础,能够阅读和编写简单代码。 0.1.2 内容结构 本书的主要内容如图 0‑1 所示。 ‧ 复杂度分析:数据结构和算法的评价维度与方法。时间复杂度和空间复杂度的推算方法、常见类型、示 例等。 ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 问题是明确的,包含清晰的输入和输出定义。 ‧ 具有可行性,能够在有限步骤、时间和内存空间下完成。 ‧ 各步骤都有确定的含义,在相同的输入和运行条件下,输出始终相同。 1.2.2 数据结构定义 「数据结构 data structure」是计算机中组织和存储数据的方式,具有以下设计目标。 ‧ 空间占用尽量少,以节省计算机内存。 第 1 章 初识算法 hello‑algo.com 140 码力 | 383 页 | 17.61 MB | 1 年前3
Rust 程序设计语言 简体中文版 1.85.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 14.3. Cargo 工作空间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 我们将数组的值写成在方括号内,用逗号分隔的列表: 文件名:src/main.rs fn main() { let a = [1, 2, 3, 4, 5]; } 当你想要在栈(stack)而不是在堆(heap)上为数据分配空间(第四章将讨论栈与堆的更多 内容),或者是想要确保总是有固定数量的元素时,数组非常有用。但是数组并不如 vector 类 型灵活。vector 类型是标准库提供的一个 允许 增长和缩小长度的类似数组的集合类型。当不 的数组将包含 5 个元素,这些元素的值最初都将被设置为 3。这种写法与 let a = [3, 3, 3, 3, 3]; 效果相同,但更简洁。 访问数组元素 数组是可以在栈 (stack) 上分配的已知固定大小的单个内存块。可以使用索引来访问数组的元 素,像这样: 文件名:src/main.rs fn main() { let a = [1, 2, 3, 4, 5]; let0 码力 | 562 页 | 3.23 MB | 25 天前3
Rust 程序设计语言简体中文版................................................................................ 352 14.3. Cargo 工作空间 .................................................................................................. 我们将数组的值写成在方括号内,用逗号分隔: 文件名:src/main.rs fn main() { let a = [1, 2, 3, 4, 5]; } 当你想要在栈(stack)而不是在堆(heap)上为数据分配空间(第四章将讨论栈与堆的更多 内容),或者是想要确保总是有固定数量的元素时,数组非常有用。但是数组并不如 vector 类 型灵活。vector 类型是标准库提供的一个 允许 增长和缩小长度的类似数组的集合类型。当不 的数组将包含 5 个元素,这些元素的值最初都将被设置为 3 。这种写法与 let a = [3, 3, 3, 3, 3]; 效果相同,但更简洁。 访问数组元素 数组是可以在栈 (stack) 上分配的已知固定大小的单个内存块。可以使用索引来访问数组的元 素,像这样: 文件名:src/main.rs fn main() { let a = [1, 2, 3, 4, 5]; 52/6000 码力 | 600 页 | 12.99 MB | 1 年前3
Comprehensive Rust(简体中文) 202412. . . . . . . . . . . . . . . . . . . 95 V 第三天:上午 97 18 欢迎参加第 3 天的课程 98 19 内存管理 99 19.1 回顾:程序的内存分配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 19.2 内存管理方法 . . . . . . . . . . Unicode 标量类型 char 'a'、' α '、' ∞' 布尔值 bool true、false 各类型占用的空间为: • iN, uN 和 fN 占用 N 位, • isize 和 usize 占用一个指针大小的空间, • char 占用 32 位空间, • bool 占用 8 位空间。 上表中还有一些未提及的语法: • 数字中的所有下划线均可忽略,它们只是为了方便辨识。因此,1_000 可以写为 'X'。 • Rust 会跟踪所有引用的生命周期,以确保它们存在足够长的时间。在安全的 Rust 中不会出现悬空 引用。x_axis 会返回对 point 的引用,但 point 会在该函数返回时取消分配,因此不会进行编 译。 • 我们会在讲到所有权(ownership)时详细讨论借用(borrow)。 9.2 独占引用 独占引用(也称为可变引用)允许更改其所引用的值。它们的类型为&mut T。0 码力 | 359 页 | 1.33 MB | 10 月前3
Rust 语言学习笔记大节省时间。 6.4 堆,栈,BOX 6.4.1 堆和栈 一般而言,在编译期间不能确定大小的数据类型都需要使用堆上内存,因为编 译器无法在栈上分配 编译期未知大小 的内存,所以诸如 String, Vec 这些类 型的内存其实是被分配在堆上的。换句话说,我们可以很轻松的将一个 Vec move 出作用域而不必担心消耗,因为数据实际上不会被复制。 对比一下 Vec和 Vec > └───┘ 堆和栈区别: 栈内存从高位地址向下增长,且栈内存分配是连续的,一般操作系统对栈内存 大小是有限制的,Linux/Unix 类系统上面可以通过 ulimit 设置最大栈空间大 小,所以 C 语言中无法创建任意长度的数组。在 Rust 里,函数调用时会创建 一个临时栈空间,调用结束后 Rust 会让这个栈空间里的对象自动进 入 Drop 流程,最后栈顶指针自动移动到上一个调用栈顶,无需程序员手动 相对地,堆上内存则是从低位地址向上增长,堆内存通常只受物理内存限制, 而且通常是不连续的,一般由程序员手动申请和释放的,如果想申请一块连续 内存,则操作系统需要在堆中查找一块未使用的满足大小的连续内存空间,故 其效率比栈要低很多,尤其是堆上如果有大量不连续内存时。另外内存使用完 也必须由程序员手动释放,不然就会出现内存泄漏,内存泄漏对需要长时间运 行的程序(例如守护进程)影响非常大。 rust 0 码力 | 117 页 | 2.24 MB | 1 年前3
Hello 算法 1.2.0 繁体中文 Rust 版‧ 遞迴:將問題分解為子問題 ?(?) = ?+?(?−1) ,不斷(遞迴地)分解下去,直至基本情況 ?(1) = 1 時終止。 1. 呼叫堆疊 遞迴函式每次呼叫自身時,系統都會為新開啟的函式分配記憶體,以儲存區域性變數、呼叫位址和其他資訊 等。這將導致兩方面的結果。 ‧ 函式的上下文資料都儲存在稱為“堆疊幀空間”的記憶體區域中,直至函式返回後才會被釋放。因此, 遞迴通常比迭代更加耗費記憶體空間。 的,這種工作機制與堆疊的“先入後出”原則異曲同工。 事實上,“呼叫堆疊”和“堆疊幀空間”這類遞迴術語已經暗示了遞迴與堆疊之間的密切關係。 1. 遞:當函式被呼叫時,系統會在“呼叫堆疊”上為該函式分配新的堆疊幀,用於儲存函式的區域性變 數、參數、返回位址等資料。 2. 迴:當函式完成執行並返回時,對應的堆疊幀會被從“呼叫堆疊”上移除,恢復之前函式的執行環境。 因此,我們可以使用一個顯式的堆 基於鏈結串列可實現:堆疊、佇列、雜湊表、樹、堆積、圖等。 鏈結串列在初始化後,仍可以在程式執行過程中對其長度進行調整,因此也稱“動態資料結構”。陣列在初始 化後長度不可變,因此也稱“靜態資料結構”。值得注意的是,陣列可透過重新分配記憶體實現長度變化,從 而具備一定的“動態性”。 Tip 如果你感覺物理結構理解起來有困難,建議先閱讀下一章,然後再回顧本節內容。 3.2 基本資料型別 當談及計算機中的資料時,我們會想到文字、圖片、影片、語音、3D0 码力 | 388 页 | 18.82 MB | 10 月前3
Comprehensive Rust(繁体中文)&mut self:使用不重複且可變動的參照,從呼叫端借用物件。之後可以再次使用該物件。 • self:取得物件擁有權,並將其移出呼叫端。方法會成為物件的擁有者。系統會在方法傳回時捨棄 物件 (取消分配),但如果其擁有權已明確傳送的情況例外。具備完整擁有權,不自動等同於具備可變 動性。 • mut self: same as above, but the method can mutate the 移動語意 5 minutes Clone 2 minutes Copy 型別 5 minutes Drop 10 minutes 練習:建構工具型別 20 minutes 19.1 檢查程式記憶體 程式分配記憶體的方式有兩種: • 堆疊 (Stack):本機變數的連續記憶體區域。 – 值在編譯期間具有已知的固定大小。 – 相當快速:只需移動堆疊指標。 – 易於管理:追蹤函式呼叫。 – 良好的記憶體區域性。 len = {len}"); } } 19.2 自動記憶體管理 傳統上,語言大致可分為兩種: • 透過手動管理記憶體,取得完整掌控權:C、C++、Pascal... – 程式設計師會決定何時分配或釋出堆積記憶體。 – 程式設計師必須判斷指標是否仍指向有效記憶體。 – 研究顯示,程式設計師難免會出錯。 • 透過在執行階段中自動管理記憶體,取得完整安全性:Java、Python、Go、Haskell0 码力 | 358 页 | 1.41 MB | 10 月前3
Comprehensive Rust(繁体中文) 202406&mut self:使用不重複且可變動的參照,從呼叫端借用物件。之後可以再次使用該物件。 • self:取得物件擁有權,並將其移出呼叫端。方法會成為物件的擁有者。系統會在方法傳回時捨棄 物件 (取消分配),但如果其擁有權已明確傳送的情況例外。具備完整擁有權,不自動等同於具備可變 動性。 • mut self: same as above, but the method can mutate the 移動語意 5 minutes Clone 2 minutes Copy 型別 5 minutes Drop 10 minutes 練習:建構工具型別 20 minutes 19.1 檢查程式記憶體 程式分配記憶體的方式有兩種: • 堆疊 (Stack):本機變數的連續記憶體區域。 – 值在編譯期間具有已知的固定大小。 – 相當快速:只需移動堆疊指標。 – 易於管理:追蹤函式呼叫。 – 良好的記憶體區域性。 len = {len}"); } } 19.2 自動記憶體管理 傳統上,語言大致可分為兩種: • 透過手動管理記憶體,取得完整掌控權:C、C++、Pascal... – 程式設計師會決定何時分配或釋出堆積記憶體。 – 程式設計師必須判斷指標是否仍指向有效記憶體。 – 研究顯示,程式設計師難免會出錯。 • 透過在執行階段中自動管理記憶體,取得完整安全性:Java、Python、Go、Haskell0 码力 | 356 页 | 1.41 MB | 1 年前3
共 17 条
- 1
- 2













