Hello 算法 1.0.0b1 Java版我们将队列头部称为「队首」,队列尾部称为「队尾」,将把元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 Figure 5‑4. 队列的先入先出规则 5. 栈与队列 hello‑algo.com 67 5.2.1. 队列常用操作 队列的常用操作见下表,方法名需根据特定语言来确定。 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) poll() poll() 队首元素出队 ?(1) front() 访问队首元素 ?(1) size() 获取队列的长度 ?(1) isEmpty() 判断队列是否为空 ?(1) 我们可以直接使用编程语言实现好的队列类。 // === File: queue.java === /* 初始化队列 */ Queuequeue = new LinkedList<>(); /* 元素入队 */ offer(1); queue.offer(3); queue.offer(2); queue.offer(5); queue.offer(4); /* 访问队首元素 */ int peek = queue.peek(); /* 元素出队 */ int poll = queue.poll(); /* 获取队列的长度 */ int size = queue.size(); /* 判断队列是否为空 0 码力 | 186 页 | 14.71 MB | 1 年前3
Hello 算法 1.0.0b2 Java版out」数据操作规则的线性数据结构。顾名思义,队列模 拟的是排队现象,即外面的人不断加入队列尾部,而处于队列头部的人不断地离开。 我们将队列头部称为「队首」,队列尾部称为「队尾」,将把元素加入队尾的操作称为「入队」,删除队首元素的 操作称为「出队」。 Figure 5‑4. 队列的先入先出规则 5. 栈与队列 hello‑algo.com 67 5.2.1. 队列常用操作 队列的常用操作 队列的常用操作见下表。需要注意,不同编程语言的方法名是不同的,在这里我们采用与栈相同的方法命名。 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1) pop() 队首元素出队 ?(1) peek() 访问队首元素 ?(1) 我们可以直接使用编程语言实现好的队列类。 // === File: queue.java === /* 初始化队列 */ Queueoffer(1); queue.offer(3); queue.offer(2); queue.offer(5); queue.offer(4); /* 访问队首元素 */ int peek = queue.peek(); /* 元素出队 */ int pop = queue.poll(); /* 获取队列的长度 */ int size = queue.size(); /* 判断队列是否为空 0 码力 | 197 页 | 15.72 MB | 1 年前3
Hello 算法 1.0.0b4 Java版哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“拉链法”(后续散列表章节会讲)。 在拉链法中,数组中每个地址(桶)指向一个链表;当这个链表长度超过一定阈值时,又可能 被转化为树(通常为红黑树)。因此,哈希表可能同时包含线性(数组、链表)和非线性(树) 数据结构。 � 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 码力 | 342 页 | 27.39 MB | 1 年前3
Hello 算法 1.0.0 Java版Q:为什么哈希表同时包含线性数据结构和非线性数据结构? 哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续“哈希冲突”章节会讲):数 组中每个桶指向一个链表,当链表长度超过一定阈值时,又可能被转化为树(通常为红黑树)。 从存储的角度来看,哈希表的底层是数组,其中每一个桶槽位可能包含一个值,也可能包含一个链表或一棵 树。因此,哈希表可能同时包含线性数据结构(数组、链表)和非线性数据结构(树)。 Q:char 图:邻接表是表示图的一种常用方式,其中图的每个顶点都与一个链表相关联,链表中的每个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 所示,我们将队列头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”,删 除队首元素的操作称为“出队”。 图 5‑4 队列的先入先出规则 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与 栈相同的方法命名。 表 5‑2 队列操作效率 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1)0 码力 | 376 页 | 17.59 MB | 1 年前3
Hello 算法 1.1.0 Java版Q:为什么哈希表同时包含线性数据结构和非线性数据结构? 哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续“哈希冲突”章节会讲):数 组中每个桶指向一个链表,当链表长度超过一定阈值时,又可能被转化为树(通常为红黑树)。 从存储的角度来看,哈希表的底层是数组,其中每一个桶槽位可能包含一个值,也可能包含一个链表或一棵 树。因此,哈希表可能同时包含线性数据结构(数组、链表)和非线性数据结构(树)。 Q:char 图:邻接表是表示图的一种常用方式,其中图的每个顶点都与一个链表相关联,链表中的每个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 所示,我们将队列头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”,删 除队首元素的操作称为“出队”。 图 5‑4 队列的先入先出规则 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与 栈相同的方法命名。 表 5‑2 队列操作效率 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1)0 码力 | 378 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0b5 Java版哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续哈希表章节会 讲)。在拉链法中,数组中每个地址(桶)指向一个链表;当这个链表长度超过一定阈值时,又 可能被转化为树(通常为红黑树)。因此,哈希表可能同时包含线性(数组、链表)和非线性 (树)数据结构。 � char 类型的长度是 1 byte 吗? char 类型的长度由编程语言采用的编码方法决定。例如,Java、JS、TS、C# 图:邻接表是表示图的一种常用方式,在其中,图的每个顶点都与一个链表相关联,链表中的每个元素 都代表与该顶点相连的其他顶点。 双向链表常被用于需要快速查找前一个和下一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 queue」是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断 加入队列的尾部,而位于队列头部的人逐个离开。 如图 5‑4 所示,我们将队列的头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”, 删除队首元素的操作称为“出队”。 图 5‑4 队列的先入先出规则 第 5 章 栈与队列 hello‑algo.com 92 5.2.1 队列常用操作 队列的常见操作如表 5‑20 码力 | 376 页 | 30.69 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Java 版Q:为什么哈希表同时包含线性数据结构和非线性数据结构? 哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续“哈希冲突”章节会讲):数 组中每个桶指向一个链表,当链表长度超过一定阈值时,又可能被转化为树(通常为红黑树)。 从存储的角度来看,哈希表的底层是数组,其中每一个桶槽位可能包含一个值,也可能包含一个链表或一棵 树。因此,哈希表可能同时包含线性数据结构(数组、链表)和非线性数据结构(树)。 Q:char 图:邻接表是表示图的一种常用方式,其中图的每个顶点都与一个链表相关联,链表中的每个元素都代 表与该顶点相连的其他顶点。 双向链表常用于需要快速查找前一个和后一个元素的场景。 ‧ 高级数据结构:比如在红黑树、B 树中,我们需要访问节点的父节点,这可以通过在节点中保存一个指 向父节点的引用来实现,类似于双向链表。 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 所示,我们将队列头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”,删 除队首元素的操作称为“出队”。 图 5‑4 队列的先入先出规则 5.2.1 队列常用操作 队列的常见操作如表 5‑2 所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与 栈相同的方法命名。 表 5‑2 队列操作效率 方法名 描述 时间复杂度 push() 元素入队,即将元素添加至队尾 ?(1)0 码力 | 379 页 | 18.48 MB | 10 月前3
Hello 算法 1.2.0 繁体中文 Java 版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
Java 应用与开发 - 线程编程通过线程间的对话来解决线程间的同步问题。 O 线程间通信的有效手段 wait() 如果一个正在执行同步代码(synchronized)的线程 A 执行了 wait() 调用(在对象 x 上),该线程暂停执行而进入对象 x 的等待队 列,并释放已获得的对象 x 的互斥锁。线程 A 要一直等到其他线程在 对象 x 上调用 notify() 或 notifyAll() 方法,才能重新获得对象 x 的互 斥锁后继续执行(从 wait() 通过线程间的对话来解决线程间的同步问题。 O 线程间通信的有效手段 wait() 如果一个正在执行同步代码(synchronized)的线程 A 执行了 wait() 调用(在对象 x 上),该线程暂停执行而进入对象 x 的等待队 列,并释放已获得的对象 x 的互斥锁。线程 A 要一直等到其他线程在 对象 x 上调用 notify() 或 notifyAll() 方法,才能重新获得对象 x 的互 斥锁后继续执行(从 wait() 通过线程间的对话来解决线程间的同步问题。 O 线程间通信的有效手段 wait() 如果一个正在执行同步代码(synchronized)的线程 A 执行了 wait() 调用(在对象 x 上),该线程暂停执行而进入对象 x 的等待队 列,并释放已获得的对象 x 的互斥锁。线程 A 要一直等到其他线程在 对象 x 上调用 notify() 或 notifyAll() 方法,才能重新获得对象 x 的互 斥锁后继续执行(从 wait()0 码力 | 82 页 | 1010.73 KB | 1 年前3
Nacos架构&原理
注册中心的健康检查机制 想象⼀下这么⼀个场景,你所在的地区突然发生地质灾害,你被掩盖在废墟下面,搜救队必须要知 道你在废墟里面那么才能对你进行施救。那么有什么方法可以让救援队知道你在废墟下面?第⼀种, 你在废墟里面大喊 help! help! I am here! ,让搜救队知道你的位置和健康状态。第二种,搜救队 使用了他们的专业检查设备,探测到你正埋在废墟下面。 这两种检查方式其实也可以类比到我们 认为服务已经不健康。第二种,则是服务端主动向客户端进行探测,检查客户端是否还被能探测到。 Nacos 架构 < 90 再回到前面的场景中,如果是你在废墟中大声呼叫救援队并且提供你的位置和健康信息,那么相比 于搜救队用探测设备挨着废墟探测会使探测队的工作量减轻很多,那么他可以专注于尽快将你救出。 这也好比于注册中心对于服务健康状态的检测,如果所有服务都需要注册中心去主动探测,由于服 务的数量远大于注册 务的数量远大于注册中心的数量,那么注册中心的任务量将会比较巨大。所以我们自然而然会想到, 那就都采用服务主动上报的方式进行健康检查。那如果在废墟之下的我们因为身体状况无法呼救, 那么搜救队就会放弃搜救了吗?当然不是,搜救队肯定也会对废墟进行全面探测将你救出。类比到 服务健康检查,如果服务本身就没法主动进行健康上报,那么这个时候注册中心主动检查健康状态 就有用武之地了。 在当前主流的注册中心,对于健康检查机制主要都采用了0 码力 | 326 页 | 12.83 MB | 10 月前3
共 12 条
- 1
- 2













