Hello 算法 1.0.0b1 C++版我们将队列头部称为「队首」,队列尾部称为「队尾」,将把元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 Figure 5‑4. 队列的先入先出规则 5. 栈与队列 hello‑algo.com 66 5.2.1. 队列常用操作 队列的常用操作见下表,方法名需根据特定语言来确定。 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) poll() poll() 队首元素出队 ?(1) front() 访问队首元素 ?(1) size() 获取队列的长度 ?(1) isEmpty() 判断队列是否为空 ?(1) 我们可以直接使用编程语言实现好的队列类。 // === File: queue.cpp === /* 初始化队列 */ queuequeue; /* 元素入队 */ queue.push(1); queue.push(3); push(3); queue.push(2); queue.push(5); queue.push(4); /* 访问队首元素 */ int front = queue.front(); /* 元素出队 */ queue.pop(); /* 获取队列的长度 */ int size = queue.size(); /* 判断队列是否为空 */ bool empty = queue 0 码力 | 187 页 | 14.71 MB | 1 年前3
Hello 算法 1.0.0b2 C++版out」数据操作规则的线性数据结构。顾名思义,队列模 拟的是排队现象,即外面的人不断加入队列尾部,而处于队列头部的人不断地离开。 我们将队列头部称为「队首」,队列尾部称为「队尾」,将把元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 Figure 5‑4. 队列的先入先出规则 5. 栈与队列 hello‑algo.com 66 5.2.1. 队列常用操作 队列的常用操作 队列的常用操作见下表。需要注意,不同编程语言的方法名是不同的,在这里我们采用与栈相同的方法命名。 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) pop() 队首元素出队 ?(1) peek() 访问队首元素 ?(1) 我们可以直接使用编程语言实现好的队列类。 // === File: queue.cpp === /* 初始化队列 */ queuequeue; push(1); queue.push(3); queue.push(2); queue.push(5); queue.push(4); /* 访问队首元素 */ int front = queue.front(); /* 元素出队 */ queue.pop(); /* 获取队列的长度 */ int size = queue.size(); /* 判断队列是否为空 */ bool 0 码力 | 197 页 | 15.72 MB | 1 年前3
Hello 算法 1.0.0b4 C++版哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“拉链法”(后续散列表章节会讲)。 在拉链法中,数组中每个地址(桶)指向一个链表;当这个链表长度超过一定阈值时,又可能 被转化为树(通常为红黑树)。因此,哈希表可能同时包含线性(数组、链表)和非线性(树) 数据结构。 � char 类型的长度是 1 byte 吗? char 类型的长度由编程语言采用的编码方法决定。例如,Java, 图:邻接表是表示图的一种常用方式,在其中,图的每个顶点都与一个链表相关联,链表中的每个元素 都代表与该顶点相连的其他顶点。 双向链表常被用于需要快速查找前一个和下一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要知道一个节点的父节点,这可以通过在节点中保存一 个指向父节点的指针来实现,类似于双向链表。 4. 数组与链表 hello‑algo.com 60 ‧ 浏览器历史:在网页浏 Queue」是一种遵循先入先出(First In, First Out)规则的线性数据结构。顾名思义,队列模拟了排 队现象,即新来的人不断加入队列的尾部,而位于队列头部的人逐个离开。 我们把队列的头部称为「队首」,尾部称为「队尾」,把将元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 Figure 5‑4. 队列的先入先出规则 5. 栈与队列 hello‑algo.com 75 50 码力 | 343 页 | 27.39 MB | 1 年前3
Hello 算法 1.0.0 C++版Q:为什么哈希表同时包含线性数据结构和非线性数据结构? 哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续“哈希冲突”章节会讲):数 组中每个桶指向一个链表,当链表长度超过一定阈值时,又可能被转化为树(通常为红黑树)。 从存储的角度来看,哈希表的底层是数组,其中每一个桶槽位可能包含一个值,也可能包含一个链表或一棵 树。因此,哈希表可能同时包含线性数据结构(数组、链表)和非线性数据结构(树)。 Q:char 图:邻接表是表示图的一种常用方式,其中图的每个顶点都与一个链表相关联,链表中的每个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 queue」是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断 加入队列尾部,而位于队列头部的人逐个离开。 如图 5‑4 所示,我们将队列头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”,删 除队首元素的操作称为“出队”。 图 5‑4 队列的先入先出规则 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与0 码力 | 378 页 | 17.59 MB | 1 年前3
Hello 算法 1.1.0 C++ 版Q:为什么哈希表同时包含线性数据结构和非线性数据结构? 哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续“哈希冲突”章节会讲):数 组中每个桶指向一个链表,当链表长度超过一定阈值时,又可能被转化为树(通常为红黑树)。 从存储的角度来看,哈希表的底层是数组,其中每一个桶槽位可能包含一个值,也可能包含一个链表或一棵 树。因此,哈希表可能同时包含线性数据结构(数组、链表)和非线性数据结构(树)。 Q:char 图:邻接表是表示图的一种常用方式,其中图的每个顶点都与一个链表相关联,链表中的每个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 队列(queue)是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断 加入队列尾部,而位于队列头部的人逐个离开。 如图 5‑4 所示,我们将队列头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”,删 除队首元素的操作称为“出队”。 图 5‑4 队列的先入先出规则 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0b5 C++版哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续哈希表章节会 讲)。在拉链法中,数组中每个地址(桶)指向一个链表;当这个链表长度超过一定阈值时,又 可能被转化为树(通常为红黑树)。因此,哈希表可能同时包含线性(数组、链表)和非线性 (树)数据结构。 � char 类型的长度是 1 byte 吗? char 类型的长度由编程语言采用的编码方法决定。例如,Java、JS、TS、C# 图:邻接表是表示图的一种常用方式,在其中,图的每个顶点都与一个链表相关联,链表中的每个元素 都代表与该顶点相连的其他顶点。 双向链表常被用于需要快速查找前一个和下一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 queue」是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断 加入队列的尾部,而位于队列头部的人逐个离开。 如图 5‑4 所示,我们将队列的头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”, 删除队首元素的操作称为“出队”。 图 5‑4 队列的先入先出规则 第 5 章 栈与队列 hello‑algo.com 92 5.2.1 队列常用操作 队列的常见操作如表 5‑20 码力 | 377 页 | 30.69 MB | 1 年前3
Hello 算法 1.2.0 简体中文 C++ 版Q:为什么哈希表同时包含线性数据结构和非线性数据结构? 哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续“哈希冲突”章节会讲):数 组中每个桶指向一个链表,当链表长度超过一定阈值时,又可能被转化为树(通常为红黑树)。 从存储的角度来看,哈希表的底层是数组,其中每一个桶槽位可能包含一个值,也可能包含一个链表或一棵 树。因此,哈希表可能同时包含线性数据结构(数组、链表)和非线性数据结构(树)。 Q:char 图:邻接表是表示图的一种常用方式,其中图的每个顶点都与一个链表相关联,链表中的每个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 队列(queue)是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断 加入队列尾部,而位于队列头部的人逐个离开。 如图 5‑4 所示,我们将队列头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”,删 除队首元素的操作称为“出队”。 图 5‑4 队列的先入先出规则 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与0 码力 | 379 页 | 18.48 MB | 10 月前3
Hello 算法 1.2.0 繁体中文 C++ 版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 码力 | 379 页 | 18.79 MB | 10 月前3
C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器中采用的是更为高效的红黑树。 • 区别就是每个节点上多挂了一个 bool 类型的 flag 变量,表示这个节点是红是黑。 • 总之这样三下五除二下来他的插入效率比平衡二叉树高出一个常数,但复杂度还是 O(logn) 。 • 红黑树的具体异同我会放到最后再细讲,一下子讲太深都睡着了,反正只有插入和删除的 时候需要更新红黑 flag ,查找方面的方法是完全没有区别的,现在我们只考虑查找,红黑 flag 才有资格获得哦 只有好好鞋洗的童鞋 才有资格获得哦 鉴于这位童鞋表现优异 朕决定赐你一枚金质 《好好鞋洗》勋章 鉴于这位童鞋表现优异 朕决定赐你一枚金质 《好好鞋洗》勋章 恭喜你!打败了红黑树,拯救了地球文明!0 码力 | 90 页 | 8.76 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器list 都可以调用 std::find ( set 则直接提供了 find 作为成员函数,稍后 讨论) set 和 vector 迭代器的不同点 • set 的迭代器对象也重载了 + + 为红黑树的遍历。 • vector 提供了 + 和 += 的重 载,而 set 没有。这是因为 vector 中的元素在内存中是连 续的,可以随机访问。而 set 是不连续的,所以不能随机访 问,只能顺序访问。 unordered_set 不会排序 ,里面的元素都是完全随机 的顺序,和插入的顺序也不 一样。虽然你可能注意到这 里的刚好和插入的顺序相反 ?巧合而已,具体怎么顺序 是和 glibc 实现有关的。 • set 基于红黑树实现,相当 于二分查找 树, unordered_set 基于散 列哈希表实现,正是哈希函 数导致了随机的顺序。 不同版本的 set 容器比较 类型 去重 有序 查找 插入 vector ×0 码力 | 83 页 | 10.23 MB | 1 年前3
共 15 条
- 1
- 2













