 Hello 算法 1.0.0b1 Golang版我们将队列头部称为「队首」,队列尾部称为「队尾」,将把元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 5. 栈与队列 hello‑algo.com 68 Figure 5‑4. 队列的先入先出规则 5.2.1. 队列常用操作 队列的常用操作见下表,方法名需根据特定语言来确定。 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) poll() poll() 队首元素出队 ?(1) front() 访问队首元素 ?(1) size() 获取队列的长度 ?(1) isEmpty() 判断队列是否为空 ?(1) 我们可以直接使用编程语言实现好的队列类。 // === File: queue_test.go === /* 初始化队列 */ // 在 Go 中,将 list 作为队列来使用 queue := list.New() /* PushBack(2) queue.PushBack(5) 5. 栈与队列 hello‑algo.com 69 queue.PushBack(4) /* 访问队首元素 */ peek := queue.Front() /* 元素出队 */ poll := queue.Front() queue.Remove(poll) /* 获取队列的长度 */ size := queue.Len()0 码力 | 190 页 | 14.71 MB | 1 年前3 Hello 算法 1.0.0b1 Golang版我们将队列头部称为「队首」,队列尾部称为「队尾」,将把元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 5. 栈与队列 hello‑algo.com 68 Figure 5‑4. 队列的先入先出规则 5.2.1. 队列常用操作 队列的常用操作见下表,方法名需根据特定语言来确定。 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) poll() poll() 队首元素出队 ?(1) front() 访问队首元素 ?(1) size() 获取队列的长度 ?(1) isEmpty() 判断队列是否为空 ?(1) 我们可以直接使用编程语言实现好的队列类。 // === File: queue_test.go === /* 初始化队列 */ // 在 Go 中,将 list 作为队列来使用 queue := list.New() /* PushBack(2) queue.PushBack(5) 5. 栈与队列 hello‑algo.com 69 queue.PushBack(4) /* 访问队首元素 */ peek := queue.Front() /* 元素出队 */ poll := queue.Front() queue.Remove(poll) /* 获取队列的长度 */ size := queue.Len()0 码力 | 190 页 | 14.71 MB | 1 年前3
 Hello 算法 1.0.0b2 Golang版out」数据操作规则的线性数据结构。顾名思义,队列模 拟的是排队现象,即外面的人不断加入队列尾部,而处于队列头部的人不断地离开。 我们将队列头部称为「队首」,队列尾部称为「队尾」,将把元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 5. 栈与队列 hello‑algo.com 68 Figure 5‑4. 队列的先入先出规则 5.2.1. 队列常用操作 队列的常用操作 队列的常用操作见下表。需要注意,不同编程语言的方法名是不同的,在这里我们采用与栈相同的方法命名。 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) pop() 队首元素出队 ?(1) peek() 访问队首元素 ?(1) 我们可以直接使用编程语言实现好的队列类。 // === File: queue_test.go === /* 初始化队列 */ // 在 Go 中,将 PushBack(3) queue.PushBack(2) queue.PushBack(5) queue.PushBack(4) /* 访问队首元素 */ 5. 栈与队列 hello‑algo.com 69 peek := queue.Front() /* 元素出队 */ pop := queue.Front() queue.Remove(pop) /* 获取队列的长度 */ size :=0 码力 | 202 页 | 15.73 MB | 1 年前3 Hello 算法 1.0.0b2 Golang版out」数据操作规则的线性数据结构。顾名思义,队列模 拟的是排队现象,即外面的人不断加入队列尾部,而处于队列头部的人不断地离开。 我们将队列头部称为「队首」,队列尾部称为「队尾」,将把元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 5. 栈与队列 hello‑algo.com 68 Figure 5‑4. 队列的先入先出规则 5.2.1. 队列常用操作 队列的常用操作 队列的常用操作见下表。需要注意,不同编程语言的方法名是不同的,在这里我们采用与栈相同的方法命名。 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) pop() 队首元素出队 ?(1) peek() 访问队首元素 ?(1) 我们可以直接使用编程语言实现好的队列类。 // === File: queue_test.go === /* 初始化队列 */ // 在 Go 中,将 PushBack(3) queue.PushBack(2) queue.PushBack(5) queue.PushBack(4) /* 访问队首元素 */ 5. 栈与队列 hello‑algo.com 69 peek := queue.Front() /* 元素出队 */ pop := queue.Front() queue.Remove(pop) /* 获取队列的长度 */ size :=0 码力 | 202 页 | 15.73 MB | 1 年前3
 Hello 算法 1.0.0b4 Golang版哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“拉链法”(后续散列表章节会讲)。 在拉链法中,数组中每个地址(桶)指向一个链表;当这个链表长度超过一定阈值时,又可能 被转化为树(通常为红黑树)。因此,哈希表可能同时包含线性(数组、链表)和非线性(树) 数据结构。 � char 类型的长度是 1 byte 吗? char 类型的长度由编程语言采用的编码方法决定。例如,Java, 图:邻接表是表示图的一种常用方式,在其中,图的每个顶点都与一个链表相关联,链表中的每个元素 都代表与该顶点相连的其他顶点。 双向链表常被用于需要快速查找前一个和下一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要知道一个节点的父节点,这可以通过在节点中保存一 个指向父节点的指针来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 Queue」是一种遵循先入先出(First In, First Out)规则的线性数据结构。顾名思义,队列模拟了排 队现象,即新来的人不断加入队列的尾部,而位于队列头部的人逐个离开。 我们把队列的头部称为「队首」,尾部称为「队尾」,把将元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 Figure 5‑4. 队列的先入先出规则 5. 栈与队列 hello‑algo.com 77 50 码力 | 347 页 | 27.40 MB | 1 年前3 Hello 算法 1.0.0b4 Golang版哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“拉链法”(后续散列表章节会讲)。 在拉链法中,数组中每个地址(桶)指向一个链表;当这个链表长度超过一定阈值时,又可能 被转化为树(通常为红黑树)。因此,哈希表可能同时包含线性(数组、链表)和非线性(树) 数据结构。 � char 类型的长度是 1 byte 吗? char 类型的长度由编程语言采用的编码方法决定。例如,Java, 图:邻接表是表示图的一种常用方式,在其中,图的每个顶点都与一个链表相关联,链表中的每个元素 都代表与该顶点相连的其他顶点。 双向链表常被用于需要快速查找前一个和下一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要知道一个节点的父节点,这可以通过在节点中保存一 个指向父节点的指针来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 Queue」是一种遵循先入先出(First In, First Out)规则的线性数据结构。顾名思义,队列模拟了排 队现象,即新来的人不断加入队列的尾部,而位于队列头部的人逐个离开。 我们把队列的头部称为「队首」,尾部称为「队尾」,把将元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 Figure 5‑4. 队列的先入先出规则 5. 栈与队列 hello‑algo.com 77 50 码力 | 347 页 | 27.40 MB | 1 年前3
 Hello 算法 1.0.0 Golang版Q:为什么哈希表同时包含线性数据结构和非线性数据结构? 哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续“哈希冲突”章节会讲):数 组中每个桶指向一个链表,当链表长度超过一定阈值时,又可能被转化为树(通常为红黑树)。 从存储的角度来看,哈希表的底层是数组,其中每一个桶槽位可能包含一个值,也可能包含一个链表或一棵 树。因此,哈希表可能同时包含线性数据结构(数组、链表)和非线性数据结构(树)。 Q:char 图:邻接表是表示图的一种常用方式,其中图的每个顶点都与一个链表相关联,链表中的每个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 queue」是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断 加入队列尾部,而位于队列头部的人逐个离开。 如图 5‑4 所示,我们将队列头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”,删 除队首元素的操作称为“出队”。 图 5‑4 队列的先入先出规则 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与0 码力 | 382 页 | 17.60 MB | 1 年前3 Hello 算法 1.0.0 Golang版Q:为什么哈希表同时包含线性数据结构和非线性数据结构? 哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续“哈希冲突”章节会讲):数 组中每个桶指向一个链表,当链表长度超过一定阈值时,又可能被转化为树(通常为红黑树)。 从存储的角度来看,哈希表的底层是数组,其中每一个桶槽位可能包含一个值,也可能包含一个链表或一棵 树。因此,哈希表可能同时包含线性数据结构(数组、链表)和非线性数据结构(树)。 Q:char 图:邻接表是表示图的一种常用方式,其中图的每个顶点都与一个链表相关联,链表中的每个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 queue」是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断 加入队列尾部,而位于队列头部的人逐个离开。 如图 5‑4 所示,我们将队列头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”,删 除队首元素的操作称为“出队”。 图 5‑4 队列的先入先出规则 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与0 码力 | 382 页 | 17.60 MB | 1 年前3
 Hello 算法 1.1.0 Go版Q:为什么哈希表同时包含线性数据结构和非线性数据结构? 哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续“哈希冲突”章节会讲):数 组中每个桶指向一个链表,当链表长度超过一定阈值时,又可能被转化为树(通常为红黑树)。 从存储的角度来看,哈希表的底层是数组,其中每一个桶槽位可能包含一个值,也可能包含一个链表或一棵 树。因此,哈希表可能同时包含线性数据结构(数组、链表)和非线性数据结构(树)。 Q:char 图:邻接表是表示图的一种常用方式,其中图的每个顶点都与一个链表相关联,链表中的每个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 队列(queue)是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断 加入队列尾部,而位于队列头部的人逐个离开。 如图 5‑4 所示,我们将队列头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”,删 除队首元素的操作称为“出队”。 图 5‑4 队列的先入先出规则 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与0 码力 | 383 页 | 18.48 MB | 1 年前3 Hello 算法 1.1.0 Go版Q:为什么哈希表同时包含线性数据结构和非线性数据结构? 哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续“哈希冲突”章节会讲):数 组中每个桶指向一个链表,当链表长度超过一定阈值时,又可能被转化为树(通常为红黑树)。 从存储的角度来看,哈希表的底层是数组,其中每一个桶槽位可能包含一个值,也可能包含一个链表或一棵 树。因此,哈希表可能同时包含线性数据结构(数组、链表)和非线性数据结构(树)。 Q:char 图:邻接表是表示图的一种常用方式,其中图的每个顶点都与一个链表相关联,链表中的每个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 队列(queue)是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断 加入队列尾部,而位于队列头部的人逐个离开。 如图 5‑4 所示,我们将队列头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”,删 除队首元素的操作称为“出队”。 图 5‑4 队列的先入先出规则 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与0 码力 | 383 页 | 18.48 MB | 1 年前3
 Hello 算法 1.0.0b5 Golang版哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续哈希表章节会 讲)。在拉链法中,数组中每个地址(桶)指向一个链表;当这个链表长度超过一定阈值时,又 可能被转化为树(通常为红黑树)。因此,哈希表可能同时包含线性(数组、链表)和非线性 (树)数据结构。 � char 类型的长度是 1 byte 吗? char 类型的长度由编程语言采用的编码方法决定。例如,Java、JS、TS、C# 图:邻接表是表示图的一种常用方式,在其中,图的每个顶点都与一个链表相关联,链表中的每个元素 都代表与该顶点相连的其他顶点。 双向链表常被用于需要快速查找前一个和下一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 queue」是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断 加入队列的尾部,而位于队列头部的人逐个离开。 如图 5‑4 所示,我们将队列的头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”, 删除队首元素的操作称为“出队”。 图 5‑4 队列的先入先出规则 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与0 码力 | 379 页 | 30.70 MB | 1 年前3 Hello 算法 1.0.0b5 Golang版哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续哈希表章节会 讲)。在拉链法中,数组中每个地址(桶)指向一个链表;当这个链表长度超过一定阈值时,又 可能被转化为树(通常为红黑树)。因此,哈希表可能同时包含线性(数组、链表)和非线性 (树)数据结构。 � char 类型的长度是 1 byte 吗? char 类型的长度由编程语言采用的编码方法决定。例如,Java、JS、TS、C# 图:邻接表是表示图的一种常用方式,在其中,图的每个顶点都与一个链表相关联,链表中的每个元素 都代表与该顶点相连的其他顶点。 双向链表常被用于需要快速查找前一个和下一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 queue」是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断 加入队列的尾部,而位于队列头部的人逐个离开。 如图 5‑4 所示,我们将队列的头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”, 删除队首元素的操作称为“出队”。 图 5‑4 队列的先入先出规则 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与0 码力 | 379 页 | 30.70 MB | 1 年前3
 Hello 算法 1.2.0 简体中文 Go 版Q:为什么哈希表同时包含线性数据结构和非线性数据结构? 哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续“哈希冲突”章节会讲):数 组中每个桶指向一个链表,当链表长度超过一定阈值时,又可能被转化为树(通常为红黑树)。 从存储的角度来看,哈希表的底层是数组,其中每一个桶槽位可能包含一个值,也可能包含一个链表或一棵 树。因此,哈希表可能同时包含线性数据结构(数组、链表)和非线性数据结构(树)。 Q:char 图:邻接表是表示图的一种常用方式,其中图的每个顶点都与一个链表相关联,链表中的每个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 队列(queue)是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断 加入队列尾部,而位于队列头部的人逐个离开。 如图 5‑4 所示,我们将队列头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”,删 除队首元素的操作称为“出队”。 图 5‑4 队列的先入先出规则 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与0 码力 | 384 页 | 18.49 MB | 10 月前3 Hello 算法 1.2.0 简体中文 Go 版Q:为什么哈希表同时包含线性数据结构和非线性数据结构? 哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续“哈希冲突”章节会讲):数 组中每个桶指向一个链表,当链表长度超过一定阈值时,又可能被转化为树(通常为红黑树)。 从存储的角度来看,哈希表的底层是数组,其中每一个桶槽位可能包含一个值,也可能包含一个链表或一棵 树。因此,哈希表可能同时包含线性数据结构(数组、链表)和非线性数据结构(树)。 Q:char 图:邻接表是表示图的一种常用方式,其中图的每个顶点都与一个链表相关联,链表中的每个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 队列(queue)是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断 加入队列尾部,而位于队列头部的人逐个离开。 如图 5‑4 所示,我们将队列头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”,删 除队首元素的操作称为“出队”。 图 5‑4 队列的先入先出规则 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与0 码力 | 384 页 | 18.49 MB | 10 月前3
 Hello 算法 1.2.0 繁体中文 Go 版bottom of the stack 栈底 堆疊底 queue 队列 佇列 double‑ended queue 双向队列 雙向佇列 front of the queue 队首 佇列首 rear of the queue 队尾 佇列尾 hash table 哈希表 雜湊表 hash set 哈希集合 雜湊集合 bucket 桶 桶 第 16 章 附錄 www.hello‑algo.com balanced binary tree 平衡二叉树 平衡二元樹 binary search tree 二叉搜索树 二元搜尋樹 AVL tree AVL 树 AVL 樹 red‑black tree 红黑树 紅黑樹 level‑order traversal 层序遍历 層序走訪 breadth‑first traversal 广度优先遍历 廣度優先走訪 depth‑first traversal0 码力 | 385 页 | 18.80 MB | 10 月前3 Hello 算法 1.2.0 繁体中文 Go 版bottom of the stack 栈底 堆疊底 queue 队列 佇列 double‑ended queue 双向队列 雙向佇列 front of the queue 队首 佇列首 rear of the queue 队尾 佇列尾 hash table 哈希表 雜湊表 hash set 哈希集合 雜湊集合 bucket 桶 桶 第 16 章 附錄 www.hello‑algo.com balanced binary tree 平衡二叉树 平衡二元樹 binary search tree 二叉搜索树 二元搜尋樹 AVL tree AVL 树 AVL 樹 red‑black tree 红黑树 紅黑樹 level‑order traversal 层序遍历 層序走訪 breadth‑first traversal 广度优先遍历 廣度優先走訪 depth‑first traversal0 码力 | 385 页 | 18.80 MB | 10 月前3
 对 Go 程序进行可靠的性能测试n=20+19) 有一个样本被作为异常值剔除了 2020 © Changkun Ou · Go 夜读 · 对 Go 程序进行可靠的性能测试 例 2:测试代码错误 14 创建一颗红黑树,并依次将 0 … n 插入到这颗红黑树中: func BenchmarkRBTree_PutWrong(b *testing.B) { for size := 0; size < 1000; size += for n := 0; n < size; n++ { tree.Put(n, n) } } }) } } 为什么插入的性能是线性的?红黑树的插入性能不是 O(log(n)) 吗? 代码写错了……吧……? name time/op RBTree_PutWrong/size-0-8 0.65ns RBTree_PutWrong/size-900-8 146µs ± 0% 2020 © Changkun Ou · Go 夜读 · 对 Go 程序进行可靠的性能测试 例 2:测试代码错误(续) 15 红黑树的插入性能是指当树的大小为 n-1 插入第 n 个值时的性能: func BenchmarkRBTree_Put(b *testing.B) { for size := 0; size <0 码力 | 37 页 | 1.23 MB | 1 年前3 对 Go 程序进行可靠的性能测试n=20+19) 有一个样本被作为异常值剔除了 2020 © Changkun Ou · Go 夜读 · 对 Go 程序进行可靠的性能测试 例 2:测试代码错误 14 创建一颗红黑树,并依次将 0 … n 插入到这颗红黑树中: func BenchmarkRBTree_PutWrong(b *testing.B) { for size := 0; size < 1000; size += for n := 0; n < size; n++ { tree.Put(n, n) } } }) } } 为什么插入的性能是线性的?红黑树的插入性能不是 O(log(n)) 吗? 代码写错了……吧……? name time/op RBTree_PutWrong/size-0-8 0.65ns RBTree_PutWrong/size-900-8 146µs ± 0% 2020 © Changkun Ou · Go 夜读 · 对 Go 程序进行可靠的性能测试 例 2:测试代码错误(续) 15 红黑树的插入性能是指当树的大小为 n-1 插入第 n 个值时的性能: func BenchmarkRBTree_Put(b *testing.B) { for size := 0; size <0 码力 | 37 页 | 1.23 MB | 1 年前3
 Golang 101(Go语言101 中文版)  v1.21.a成功之后将执行下列步骤,直到 其中一个步骤的条件得到满足。 1. 如果此通道的缓冲队列不为空(这种情况下,接收数据协程队列必为 空),此协程R将从缓冲队列取出(接收)一个值。 如果发送数据协程队 列不为空,一个发送协程将从此队列中弹出,此协程欲发送的值将被推入 缓冲队列。此发送协程将恢复至运行状态。 接收数据协程R继续运行,不 会阻塞。对于这种情况,此数据接收操作为一个非阻塞操作。 2 10 | f = func() {} // 此行不会阻止恐慌产生 11 | } 延迟方法调用的属主实参的估值时刻 前面的文章曾经解释过:一个延迟调用的实参也是在此调用被推入延迟调用队 列时估值的(第13章)。 方法的属主实参也不例外。比如,下面这个程序将 打印出1342。 1| package main 2| 3| type T int 4| 5| func (t T) M(n0 码力 | 821 页 | 956.82 KB | 1 年前3 Golang 101(Go语言101 中文版)  v1.21.a成功之后将执行下列步骤,直到 其中一个步骤的条件得到满足。 1. 如果此通道的缓冲队列不为空(这种情况下,接收数据协程队列必为 空),此协程R将从缓冲队列取出(接收)一个值。 如果发送数据协程队 列不为空,一个发送协程将从此队列中弹出,此协程欲发送的值将被推入 缓冲队列。此发送协程将恢复至运行状态。 接收数据协程R继续运行,不 会阻塞。对于这种情况,此数据接收操作为一个非阻塞操作。 2 10 | f = func() {} // 此行不会阻止恐慌产生 11 | } 延迟方法调用的属主实参的估值时刻 前面的文章曾经解释过:一个延迟调用的实参也是在此调用被推入延迟调用队 列时估值的(第13章)。 方法的属主实参也不例外。比如,下面这个程序将 打印出1342。 1| package main 2| 3| type T int 4| 5| func (t T) M(n0 码力 | 821 页 | 956.82 KB | 1 年前3
共 12 条
- 1
- 2














