 Hello 算法 1.1.0 Rust版5.2 队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 5.3 双向队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 5.4 小结 . . 中,任意节点都可以视作头节点。 ‧ 双向链表:与单向链表相比,双向链表记录了两个方向的引用。双向链表的节点定义同时包含指向后继 节点(下一个节点)和前驱节点(上一个节点)的引用(指针)。相较于单向链表,双向链表更具灵活 性,可以朝两个方向遍历链表,但相应地也需要占用更多的内存空间。 use std::rc::Rc; use std::cell::RefCell; /* 双向链表节点类型 */ #[derive(Debug)] 个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 后一个网页。双向链表的特性使得这种操作变得简单。 ‧ LRU0 码力 | 388 页 | 18.50 MB | 1 年前3 Hello 算法 1.1.0 Rust版5.2 队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 5.3 双向队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 5.4 小结 . . 中,任意节点都可以视作头节点。 ‧ 双向链表:与单向链表相比,双向链表记录了两个方向的引用。双向链表的节点定义同时包含指向后继 节点(下一个节点)和前驱节点(上一个节点)的引用(指针)。相较于单向链表,双向链表更具灵活 性,可以朝两个方向遍历链表,但相应地也需要占用更多的内存空间。 use std::rc::Rc; use std::cell::RefCell; /* 双向链表节点类型 */ #[derive(Debug)] 个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 后一个网页。双向链表的特性使得这种操作变得简单。 ‧ LRU0 码力 | 388 页 | 18.50 MB | 1 年前3
 Hello 算法 1.2.0 简体中文 Rust 版5.2 队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 5.3 双向队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 5.4 小结 . . 中,任意节点都可以视作头节点。 ‧ 双向链表:与单向链表相比,双向链表记录了两个方向的引用。双向链表的节点定义同时包含指向后继 节点(下一个节点)和前驱节点(上一个节点)的引用(指针)。相较于单向链表,双向链表更具灵活 性,可以朝两个方向遍历链表,但相应地也需要占用更多的内存空间。 use std::rc::Rc; use std::cell::RefCell; /* 双向链表节点类型 */ #[derive(Debug)] 个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 后一个网页。双向链表的特性使得这种操作变得简单。 ‧ LRU0 码力 | 387 页 | 18.51 MB | 10 月前3 Hello 算法 1.2.0 简体中文 Rust 版5.2 队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 5.3 双向队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 5.4 小结 . . 中,任意节点都可以视作头节点。 ‧ 双向链表:与单向链表相比,双向链表记录了两个方向的引用。双向链表的节点定义同时包含指向后继 节点(下一个节点)和前驱节点(上一个节点)的引用(指针)。相较于单向链表,双向链表更具灵活 性,可以朝两个方向遍历链表,但相应地也需要占用更多的内存空间。 use std::rc::Rc; use std::cell::RefCell; /* 双向链表节点类型 */ #[derive(Debug)] 个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 后一个网页。双向链表的特性使得这种操作变得简单。 ‧ LRU0 码力 | 387 页 | 18.51 MB | 10 月前3
 Hello 算法 1.0.0 Rust版5.2 队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 5.3 双向队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 5.4 小结 . . 中,任意节点都可以视作头节点。 ‧ 双向链表:与单向链表相比,双向链表记录了两个方向的引用。双向链表的节点定义同时包含指向后继 节点(下一个节点)和前驱节点(上一个节点)的引用(指针)。相较于单向链表,双向链表更具灵活 性,可以朝两个方向遍历链表,但相应地也需要占用更多的内存空间。 use std::rc::Rc; use std::cell::RefCell; /* 双向链表节点类型 */ #[derive(Debug)] 个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 后一个网页。双向链表的特性使得这种操作变得简单。 ‧ LRU0 码力 | 383 页 | 17.61 MB | 1 年前3 Hello 算法 1.0.0 Rust版5.2 队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 5.3 双向队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 5.4 小结 . . 中,任意节点都可以视作头节点。 ‧ 双向链表:与单向链表相比,双向链表记录了两个方向的引用。双向链表的节点定义同时包含指向后继 节点(下一个节点)和前驱节点(上一个节点)的引用(指针)。相较于单向链表,双向链表更具灵活 性,可以朝两个方向遍历链表,但相应地也需要占用更多的内存空间。 use std::rc::Rc; use std::cell::RefCell; /* 双向链表节点类型 */ #[derive(Debug)] 个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 后一个网页。双向链表的特性使得这种操作变得简单。 ‧ LRU0 码力 | 383 页 | 17.61 MB | 1 年前3
 Rust 程序设计语言 简体中文版 1.85.0个限制的好处是 Rust 可以在编译时就避免数据竞争。数据竞争(data race)类似于竞态条 件,它可由这三个行为造成: • 两个或更多指针同时访问同一数据。 • 至少有一个指针被用来写入数据。 • 没有同步数据访问的机制。 数据竞争会导致未定义行为,难以在运行时追踪,并且难以诊断和修复;Rust 通过拒绝编译 存在数据竞争的代码来避免此问题! 一如既往,可以使用大括号来创建一个新的作用域,以允许拥有多个可变引用,只是不能同时 5。可以尝试用值 5 来提取变量 s 的第一个 单词,不过这是有 bug 的,因为在我们将 5 保存到 word 之后 s 的内容已经改变。 我们不得不时刻担心 word 的索引与 s 中的数据不再同步,这既繁琐又易出错!如果编写这么 一个 second_word 函数的话,管理索引这件事将更加容易出问题。它的签名看起来像这样: fn second_word(s: &String) -> (usize (usize, usize) { 现在我们要跟踪一个开始索引和一个结束索引,同时有了更多从数据的某个特定状态计算而来 的值,但都完全没有与这个状态相关联。现在有三个飘忽不定的不相关变量需要保持同步。 幸运的是,Rust 为这个问题提供了一个解决方法:字符串 slice。 字符串 slice 字符串 slice(string slice)是 String 中一部分值的引用,它看起来像这样: 89/562Rust0 码力 | 562 页 | 3.23 MB | 26 天前3 Rust 程序设计语言 简体中文版 1.85.0个限制的好处是 Rust 可以在编译时就避免数据竞争。数据竞争(data race)类似于竞态条 件,它可由这三个行为造成: • 两个或更多指针同时访问同一数据。 • 至少有一个指针被用来写入数据。 • 没有同步数据访问的机制。 数据竞争会导致未定义行为,难以在运行时追踪,并且难以诊断和修复;Rust 通过拒绝编译 存在数据竞争的代码来避免此问题! 一如既往,可以使用大括号来创建一个新的作用域,以允许拥有多个可变引用,只是不能同时 5。可以尝试用值 5 来提取变量 s 的第一个 单词,不过这是有 bug 的,因为在我们将 5 保存到 word 之后 s 的内容已经改变。 我们不得不时刻担心 word 的索引与 s 中的数据不再同步,这既繁琐又易出错!如果编写这么 一个 second_word 函数的话,管理索引这件事将更加容易出问题。它的签名看起来像这样: fn second_word(s: &String) -> (usize (usize, usize) { 现在我们要跟踪一个开始索引和一个结束索引,同时有了更多从数据的某个特定状态计算而来 的值,但都完全没有与这个状态相关联。现在有三个飘忽不定的不相关变量需要保持同步。 幸运的是,Rust 为这个问题提供了一个解决方法:字符串 slice。 字符串 slice 字符串 slice(string slice)是 String 中一部分值的引用,它看起来像这样: 89/562Rust0 码力 | 562 页 | 3.23 MB | 26 天前3
 基于静态分析的Rust内存安全缺陷检测研究bob只读借用Box对象, alice临时失去修改权, 保留只读权 alice可读 bob自动归还Box对象, alice恢复修改权 如果需要违背XOR Mutability怎么办? ❑ 以双向链表为例,中间节点被前后两个节点访用 ❑ Rust为了提升可用性所做的妥协 ▪ 智能指针(性能损失) ▪ 允许使用裸指针(unsafe模式) • 逃逸编译器的借用检查 => 指针别名 next0 码力 | 28 页 | 1.55 MB | 1 年前3 基于静态分析的Rust内存安全缺陷检测研究bob只读借用Box对象, alice临时失去修改权, 保留只读权 alice可读 bob自动归还Box对象, alice恢复修改权 如果需要违背XOR Mutability怎么办? ❑ 以双向链表为例,中间节点被前后两个节点访用 ❑ Rust为了提升可用性所做的妥协 ▪ 智能指针(性能损失) ▪ 允许使用裸指针(unsafe模式) • 逃逸编译器的借用检查 => 指针别名 next0 码力 | 28 页 | 1.55 MB | 1 年前3
 Rust 程序设计语言简体中文版个限制的好处是 Rust 可以在编译时就避免数据竞争。数据竞争(data race)类似于竞态条 件,它可由这三个行为造成: • 两个或更多指针同时访问同一数据。 • 至少有一个指针被用来写入数据。 • 没有同步数据访问的机制。 数据竞争会导致未定义行为,难以在运行时追踪,并且难以诊断和修复;Rust 避免了这种情 况的发生,因为它甚至不会编译存在数据竞争的代码! 一如既往,可以使用大括号来创建一个新的 。可以尝试用值 5 来提取变量 s 的第一个单词,不过这是有 bug 的,因为在我们将 5 保存到 word 之后 s 的内容已经改变。 我们不得不时刻担心 word 的索引与 s 中的数据不再同步,这很啰嗦且易出错!如果编写这 么一个 second_word 函数的话,管理索引这件事将更加容易出问题。它的签名看起来像这样: fn second_word(s: &String) -> (usize (usize, usize) { 现在我们要跟踪一个开始索引 和 一个结尾索引,同时有了更多从数据的某个特定状态计算而 来的值,但都完全没有与这个状态相关联。现在有三个飘忽不定的不相关变量需要保持同步。 幸运的是,Rust 为这个问题提供了一个解决方法:字符串 slice。 字符串 slice 字符串 slice(string slice)是 String 中一部分值的引用,它看起来像这样:0 码力 | 600 页 | 12.99 MB | 1 年前3 Rust 程序设计语言简体中文版个限制的好处是 Rust 可以在编译时就避免数据竞争。数据竞争(data race)类似于竞态条 件,它可由这三个行为造成: • 两个或更多指针同时访问同一数据。 • 至少有一个指针被用来写入数据。 • 没有同步数据访问的机制。 数据竞争会导致未定义行为,难以在运行时追踪,并且难以诊断和修复;Rust 避免了这种情 况的发生,因为它甚至不会编译存在数据竞争的代码! 一如既往,可以使用大括号来创建一个新的 。可以尝试用值 5 来提取变量 s 的第一个单词,不过这是有 bug 的,因为在我们将 5 保存到 word 之后 s 的内容已经改变。 我们不得不时刻担心 word 的索引与 s 中的数据不再同步,这很啰嗦且易出错!如果编写这 么一个 second_word 函数的话,管理索引这件事将更加容易出问题。它的签名看起来像这样: fn second_word(s: &String) -> (usize (usize, usize) { 现在我们要跟踪一个开始索引 和 一个结尾索引,同时有了更多从数据的某个特定状态计算而 来的值,但都完全没有与这个状态相关联。现在有三个飘忽不定的不相关变量需要保持同步。 幸运的是,Rust 为这个问题提供了一个解决方法:字符串 slice。 字符串 slice 字符串 slice(string slice)是 String 中一部分值的引用,它看起来像这样:0 码力 | 600 页 | 12.99 MB | 1 年前3
 Comprehensive Rust(繁体中文)並行:上午練習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 XIV 並行:下午 326 63 非同步的 Rust 327 63.1 async/await . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 63.4 工作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 63.5 非同步管道 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 64 Future 控制流程 332 65.2 Pin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 65.3 非同步特徵 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 65.4 安裝 . . . . .0 码力 | 358 页 | 1.41 MB | 10 月前3 Comprehensive Rust(繁体中文)並行:上午練習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 XIV 並行:下午 326 63 非同步的 Rust 327 63.1 async/await . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 63.4 工作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 63.5 非同步管道 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 64 Future 控制流程 332 65.2 Pin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 65.3 非同步特徵 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 65.4 安裝 . . . . .0 码力 | 358 页 | 1.41 MB | 10 月前3
 Comprehensive Rust(繁体中文) 202406並行:上午練習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318 XIV 並行:下午 324 63 非同步的 Rust 325 63.1 async/await . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 63.4 工作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 63.5 非同步管道 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 64 Future 控制流程 330 65.2 Pin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 65.3 非同步特徵 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 65.4 安裝 . . . . .0 码力 | 356 页 | 1.41 MB | 1 年前3 Comprehensive Rust(繁体中文) 202406並行:上午練習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318 XIV 並行:下午 324 63 非同步的 Rust 325 63.1 async/await . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 63.4 工作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 63.5 非同步管道 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 64 Future 控制流程 330 65.2 Pin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 65.3 非同步特徵 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 65.4 安裝 . . . . .0 码力 | 356 页 | 1.41 MB | 1 年前3
 Rust 语言学习笔记........... 95 7.2.3 通过克隆发送者来创建多个生产者 ........................................... 96 7.2.4 异步通道与同步通道 ............................................................. 97 7.2.5 可发送的消息类型 .............. 4.2 堆 .................................................................................. 102 7.5 同步 ........................................................................................ 102 7.5 Got: thread 虽然你可能会看到这些值以不同的顺序出现。在并发下,运行结果可能每次都 不相同。以进入到 channel 的顺序为主。 7.2.4 异步通道与同步通道 Rust 的标准库其实提供了两种类型的通道:异步通道和同步通道。在前面使用 的都是异步通道。异步通道指的是:不管接收者是否正在接收消息,消息发送 者在发送消息时都不会阻塞。为了验证这一点,我们尝试多增加个线程来发送 消息:0 码力 | 117 页 | 2.24 MB | 1 年前3 Rust 语言学习笔记........... 95 7.2.3 通过克隆发送者来创建多个生产者 ........................................... 96 7.2.4 异步通道与同步通道 ............................................................. 97 7.2.5 可发送的消息类型 .............. 4.2 堆 .................................................................................. 102 7.5 同步 ........................................................................................ 102 7.5 Got: thread 虽然你可能会看到这些值以不同的顺序出现。在并发下,运行结果可能每次都 不相同。以进入到 channel 的顺序为主。 7.2.4 异步通道与同步通道 Rust 的标准库其实提供了两种类型的通道:异步通道和同步通道。在前面使用 的都是异步通道。异步通道指的是:不管接收者是否正在接收消息,消息发送 者在发送消息时都不会阻塞。为了验证这一点,我们尝试多增加个线程来发送 消息:0 码力 | 117 页 | 2.24 MB | 1 年前3
 Hello 算法 1.2.0 繁体中文 Rust 版通雜湊表有所不同。 ‧ 插入元素:透過雜湊函式計算桶索引,若發現桶內已有元素,則從衝突位置向後線性走訪(步長通常為 1 ),直至找到空桶,將元素插入其中。 ‧ 查詢元素:若發現雜湊衝突,則使用相同步長向後進行線性走訪,直到找到對應元素,返回 value 即 可;如果遇到空桶,說明目標元素不在雜湊表中,返回 None 。 圖 6‑6 展示了開放定址(線性探查)雜湊表的鍵值對分佈。根據此雜湊函式,最後兩位相同的 快取命中率 stack 栈 堆疊 top of the stack 栈顶 堆疊頂 bottom of the stack 栈底 堆疊底 queue 队列 佇列 double‑ended queue 双向队列 雙向佇列 front of the queue 队首 佇列首 rear of the queue 队尾 佇列尾 hash table 哈希表 雜湊表 hash set 哈希集合 雜湊集合0 码力 | 388 页 | 18.82 MB | 10 月前3 Hello 算法 1.2.0 繁体中文 Rust 版通雜湊表有所不同。 ‧ 插入元素:透過雜湊函式計算桶索引,若發現桶內已有元素,則從衝突位置向後線性走訪(步長通常為 1 ),直至找到空桶,將元素插入其中。 ‧ 查詢元素:若發現雜湊衝突,則使用相同步長向後進行線性走訪,直到找到對應元素,返回 value 即 可;如果遇到空桶,說明目標元素不在雜湊表中,返回 None 。 圖 6‑6 展示了開放定址(線性探查)雜湊表的鍵值對分佈。根據此雜湊函式,最後兩位相同的 快取命中率 stack 栈 堆疊 top of the stack 栈顶 堆疊頂 bottom of the stack 栈底 堆疊底 queue 队列 佇列 double‑ended queue 双向队列 雙向佇列 front of the queue 队首 佇列首 rear of the queue 队尾 佇列尾 hash table 哈希表 雜湊表 hash set 哈希集合 雜湊集合0 码力 | 388 页 | 18.82 MB | 10 月前3
共 21 条
- 1
- 2
- 3














