 Go在工程实践的错误处理Golang在工程实践中的错误处理 彭友顺 石墨文档 产研负责人 目 录 为什么我们处理错误会这么慢 01 如何完善错误信息 02 优雅处理错误信息 03 分布式错误处理 04 错误信息手册的必要性 05 为什么我们处理错误 会这么慢 第一部分 错误信息不够完善 why 原因 出现 错误 定位 慢 恢复 慢 效率低 为什么我们处理错误会这么慢 错误处理不够优雅 分布式错误难以串联 对接起来会非常麻烦 优雅处理错误信息 第三部分 为什么定位慢?-- 错误处理 不要透传错误 错误码唯一性 记录一次错误 假设用户反馈了无法打开一个文件 我们的程序员非常认真 记录了文件不存在的错误日志 • 同样的错误信息,非常多的杂音 • 每个Error,都去查看一次对应代码,排查效率低 • 占用存储空间 • 最外层入口处只记录一次错误日志 为什么定位慢?-- 错误处理 带来新的问题,无法定位整个代码执行链路 日志分析不出是哪个service 调用了MySQL 为什么定位慢?-- 错误处理 带来新的问题,无法定位整个代码执行链路 不要透传错误 错误码唯一性 记录一次错误 • 不能透传错误,fmt.Errorf • 如果不考虑性能 • 日志开启Stack • 错误追加Stack 为什么定位慢?-- 错误处理 不要透传错误 错误码唯一性 记录一次错误 文件不存在 数据表里不存在0 码力 | 30 页 | 3.11 MB | 1 年前3 Go在工程实践的错误处理Golang在工程实践中的错误处理 彭友顺 石墨文档 产研负责人 目 录 为什么我们处理错误会这么慢 01 如何完善错误信息 02 优雅处理错误信息 03 分布式错误处理 04 错误信息手册的必要性 05 为什么我们处理错误 会这么慢 第一部分 错误信息不够完善 why 原因 出现 错误 定位 慢 恢复 慢 效率低 为什么我们处理错误会这么慢 错误处理不够优雅 分布式错误难以串联 对接起来会非常麻烦 优雅处理错误信息 第三部分 为什么定位慢?-- 错误处理 不要透传错误 错误码唯一性 记录一次错误 假设用户反馈了无法打开一个文件 我们的程序员非常认真 记录了文件不存在的错误日志 • 同样的错误信息,非常多的杂音 • 每个Error,都去查看一次对应代码,排查效率低 • 占用存储空间 • 最外层入口处只记录一次错误日志 为什么定位慢?-- 错误处理 带来新的问题,无法定位整个代码执行链路 日志分析不出是哪个service 调用了MySQL 为什么定位慢?-- 错误处理 带来新的问题,无法定位整个代码执行链路 不要透传错误 错误码唯一性 记录一次错误 • 不能透传错误,fmt.Errorf • 如果不考虑性能 • 日志开启Stack • 错误追加Stack 为什么定位慢?-- 错误处理 不要透传错误 错误码唯一性 记录一次错误 文件不存在 数据表里不存在0 码力 | 30 页 | 3.11 MB | 1 年前3
 3.云原生边云协同AI框架实践App Unseen Task Detect ① 基于N个历史任务,完成云端知识库初 始化 ② 基于云端知识库,学习当前边侧任务 ③ 基于当前边侧任务,更新云端知识库 ④ 重复步骤2-3以处理M个未来任务 Cloud 任务模型 任务样本 1 2 3 4 N个历史任务 当前任务 M个未来任务 知识库 边云协同终身学习: 云侧知识库记忆,解决新情景下数据异构和小样本 NewUpstreamController():【5】创建UpstreamController,每个GM进程有 一个UpstreamController - uc.Run(stopCh):启动一个for循环协程,来处理 - pkg/globalmanager/controllers/upstream.go/syncEdgeUpdate() - NewRegistry():【6】注册所有controller。 pkg/globalmanager/controllers/lifelonglearning/upstream.go/updateFromEd ge() - f.Run()【9】Controller核心处理逻辑 - ws.ListenAndServe() 【10】 整体的初始化逻辑。 【1】main函数入口 func main() { rand.Seed(time.Now().UnixNano())0 码力 | 37 页 | 2.36 MB | 1 年前3 3.云原生边云协同AI框架实践App Unseen Task Detect ① 基于N个历史任务,完成云端知识库初 始化 ② 基于云端知识库,学习当前边侧任务 ③ 基于当前边侧任务,更新云端知识库 ④ 重复步骤2-3以处理M个未来任务 Cloud 任务模型 任务样本 1 2 3 4 N个历史任务 当前任务 M个未来任务 知识库 边云协同终身学习: 云侧知识库记忆,解决新情景下数据异构和小样本 NewUpstreamController():【5】创建UpstreamController,每个GM进程有 一个UpstreamController - uc.Run(stopCh):启动一个for循环协程,来处理 - pkg/globalmanager/controllers/upstream.go/syncEdgeUpdate() - NewRegistry():【6】注册所有controller。 pkg/globalmanager/controllers/lifelonglearning/upstream.go/updateFromEd ge() - f.Run()【9】Controller核心处理逻辑 - ws.ListenAndServe() 【10】 整体的初始化逻辑。 【1】main函数入口 func main() { rand.Seed(time.Now().UnixNano())0 码力 | 37 页 | 2.36 MB | 1 年前3
 Hello 算法 1.0.0b4 Golang版释、内容注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2. 在动画图解中高效学习 相较于文字,视频和图片具有更高的信息密度和结构化程度,因此更易于理解。在本书中,重点和难点知识 将主要通过动画和图解形式展示,而文字则作为动画和图片的解释与补充。 在阅读本书时,如果发现某段内容提供了动画或图解 在无序区间抽出一张扑克牌,插入至有序区间的正确位置;完成后最左 3 张扑克已经有序。 4. 不断循环以上操作,直至所有扑克牌都有序后终止。 以上整理扑克牌的方法本质上就是「插入排序」算法,它在处理小型数据集时非常高效。许多编程语言的排 序库函数中都存在插入排序的身影。 Figure 1‑2. 扑克排序步骤 例三:货币找零。假设我们在超市购买了 69 元的商品,给收银员付了 100 元,则收银员需要给我们找 表”,然后再回头理解物理结构 的含义。数组与链表是其他所有数据结构的基石,建议你投入更多时间深入了解这两种基本 数据结构。 3.2. 基本数据类型 谈及计算机中的数据,我们会想到文本、图片、视频、语音、3D 模型等各种形式。尽管这些数据的组织形式 各异,但它们都由各种基本数据类型构成。 基本数据类型是 CPU 可以直接进行运算的类型,在算法中直接被使用。它包括: ‧ 整数类型 byte0 码力 | 347 页 | 27.40 MB | 1 年前3 Hello 算法 1.0.0b4 Golang版释、内容注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2. 在动画图解中高效学习 相较于文字,视频和图片具有更高的信息密度和结构化程度,因此更易于理解。在本书中,重点和难点知识 将主要通过动画和图解形式展示,而文字则作为动画和图片的解释与补充。 在阅读本书时,如果发现某段内容提供了动画或图解 在无序区间抽出一张扑克牌,插入至有序区间的正确位置;完成后最左 3 张扑克已经有序。 4. 不断循环以上操作,直至所有扑克牌都有序后终止。 以上整理扑克牌的方法本质上就是「插入排序」算法,它在处理小型数据集时非常高效。许多编程语言的排 序库函数中都存在插入排序的身影。 Figure 1‑2. 扑克排序步骤 例三:货币找零。假设我们在超市购买了 69 元的商品,给收银员付了 100 元,则收银员需要给我们找 表”,然后再回头理解物理结构 的含义。数组与链表是其他所有数据结构的基石,建议你投入更多时间深入了解这两种基本 数据结构。 3.2. 基本数据类型 谈及计算机中的数据,我们会想到文本、图片、视频、语音、3D 模型等各种形式。尽管这些数据的组织形式 各异,但它们都由各种基本数据类型构成。 基本数据类型是 CPU 可以直接进行运算的类型,在算法中直接被使用。它包括: ‧ 整数类型 byte0 码力 | 347 页 | 27.40 MB | 1 年前3
 大规模高性能区块链架构设计模式与测试框架-李世敬Layer 轻客户端层 Edge Layer 轻节点层 Gateway Layer 核⼼技术 多类型节点分层部署模式 1 3 动态⾃发现⽹络转发模型 2 ⼤规模组⽹⾼效共识算法 1.提⾼数据处理效率 2.提升终端异构性能⼒ 3.提供实时计算与验证服务 4.解决数据真实性“第⼀公⾥” 问题 ⾯向海量节点⼤规模应⽤场景, ⽀持1000+节点的⽣产级联盟链⽹络, 可以实现数⼗万个多类型区块链⽹络节点分层部署 ©2016-2021 18 趣链科技 版权所有 ©2016-2021 18 不同分区(Namespace)间共识、执行、存储、网络完全独立;借助分区,一方面可实现业务隔离,保障 数据隐私安全;另一方面可实现交易并行处理,提升系统整体性能。 功 能 特 性 分区机制 业务分区而治 • 通过Namespace进行业务划分 • 业务数据对其他分区不可见 分区性能优异 运维灵活便捷 • 单次部署节点、灵活配置分区,降低运维成本 系统外部 系统内部 交易拦截器限流 在系统最外层及早对交易进⾏拦截,阻⽌交易渗透 到主流程花费不必要的系统开销 消息分发器限流 P2P⽹络层通过消息分发器将消息带权分发给对应 模块处理,降低各模块由于处理能⼒差异⽽相互⼲ 扰,保证核⼼模块正常运⾏ ⽹络带宽限流 限制节点最⼤出⼝带宽流量,适⽤于对⽹络带宽 有限制需求的场景 功能简介 22 趣链科技 版权所有 ©2016-20210 码力 | 39 页 | 56.58 MB | 1 年前3 大规模高性能区块链架构设计模式与测试框架-李世敬Layer 轻客户端层 Edge Layer 轻节点层 Gateway Layer 核⼼技术 多类型节点分层部署模式 1 3 动态⾃发现⽹络转发模型 2 ⼤规模组⽹⾼效共识算法 1.提⾼数据处理效率 2.提升终端异构性能⼒ 3.提供实时计算与验证服务 4.解决数据真实性“第⼀公⾥” 问题 ⾯向海量节点⼤规模应⽤场景, ⽀持1000+节点的⽣产级联盟链⽹络, 可以实现数⼗万个多类型区块链⽹络节点分层部署 ©2016-2021 18 趣链科技 版权所有 ©2016-2021 18 不同分区(Namespace)间共识、执行、存储、网络完全独立;借助分区,一方面可实现业务隔离,保障 数据隐私安全;另一方面可实现交易并行处理,提升系统整体性能。 功 能 特 性 分区机制 业务分区而治 • 通过Namespace进行业务划分 • 业务数据对其他分区不可见 分区性能优异 运维灵活便捷 • 单次部署节点、灵活配置分区,降低运维成本 系统外部 系统内部 交易拦截器限流 在系统最外层及早对交易进⾏拦截,阻⽌交易渗透 到主流程花费不必要的系统开销 消息分发器限流 P2P⽹络层通过消息分发器将消息带权分发给对应 模块处理,降低各模块由于处理能⼒差异⽽相互⼲ 扰,保证核⼼模块正常运⾏ ⽹络带宽限流 限制节点最⼤出⼝带宽流量,适⽤于对⽹络带宽 有限制需求的场景 功能简介 22 趣链科技 版权所有 ©2016-20210 码力 | 39 页 | 56.58 MB | 1 年前3
 Go 入门指南(The way to Go)XML 数据格式 12.11 用 Gob 传输数据 12.12 Go 中的密码学 第13章:错误处理与测试 13.1 错误处理 13.2 运行时异常和 panic 13.3 从 panic 中恢复(Recover) 13.4 自定义包中的错误处理和 panicking 13.5 一种用闭包处理错误的模式 13.6 启动外部命令和程序 13.7 Go 中的单元测试和基准测试 13.8 16.5 不需要将一个指向切片的指针传递给函数 16.6 使用指针指向接口类型 16.7 使用值类型时误用指针 16.8 误用协程和通道 16.9 闭包和协程的使用 16.10 糟糕的错误处理 第 17章 模式 17.1 关于逗号ok模式 第 18章 出于性能考虑的实用代码片段 18.1 字符串 18.2 数组和切片 18.3 映射 18.4 结构体 18.5 接口 18 本文档使用 书栈(BookStack.CN) 构建 阅前必读 在接触 Go 语言之后,对这门编程语言非常着迷,期间也陆陆续续开始一些帮助国内编程爱好者了解和发展 Go 语言 的工作,比如开始录制视频教程《Go编程基础》。但由于目前国内并没有比较好的 Go 语言书籍,而国外的优秀书籍 因为英文的缘故在一定程度上也为不少 Go 语言爱好者带来了一些学习上的困扰,不仅为了加快扩散 Go 爱好者的国0 码力 | 466 页 | 4.44 MB | 1 年前3 Go 入门指南(The way to Go)XML 数据格式 12.11 用 Gob 传输数据 12.12 Go 中的密码学 第13章:错误处理与测试 13.1 错误处理 13.2 运行时异常和 panic 13.3 从 panic 中恢复(Recover) 13.4 自定义包中的错误处理和 panicking 13.5 一种用闭包处理错误的模式 13.6 启动外部命令和程序 13.7 Go 中的单元测试和基准测试 13.8 16.5 不需要将一个指向切片的指针传递给函数 16.6 使用指针指向接口类型 16.7 使用值类型时误用指针 16.8 误用协程和通道 16.9 闭包和协程的使用 16.10 糟糕的错误处理 第 17章 模式 17.1 关于逗号ok模式 第 18章 出于性能考虑的实用代码片段 18.1 字符串 18.2 数组和切片 18.3 映射 18.4 结构体 18.5 接口 18 本文档使用 书栈(BookStack.CN) 构建 阅前必读 在接触 Go 语言之后,对这门编程语言非常着迷,期间也陆陆续续开始一些帮助国内编程爱好者了解和发展 Go 语言 的工作,比如开始录制视频教程《Go编程基础》。但由于目前国内并没有比较好的 Go 语言书籍,而国外的优秀书籍 因为英文的缘故在一定程度上也为不少 Go 语言爱好者带来了一些学习上的困扰,不仅为了加快扩散 Go 爱好者的国0 码力 | 466 页 | 4.44 MB | 1 年前3
 Hello 算法 1.0.0b1 Golang版释、内容 注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.3. 在动画图解中高效学习 视频和图片相比于文字的信息密度和结构化程度更高,更容易理解。在本书中,知识重难点会主要以动画、图 解的形式呈现,而文字的作用则是作为动画和图的解释与补充。 阅读本书时,若发现某段内容提供了动画或图解 ?(log ?) , ?(?) , ?(?2) , ?(2?) 。 38 3. 数据结构简介 3.1. 数据与内存 3.1.1. 基本数据类型 谈到计算机中的数据,我们能够想到文本、图片、视频、语音、3D 模型等等,这些数据虽然组织形式不同,但 都是由各种基本数据类型构成的。 「基本数据类型」是 CPU 可以直接进行运算的类型,在算法中直接被使用。 ‧「整数」根据不同的长度分为 byte 2.3. 两种实现对比 与栈的结论一致,在此不再赘述。 5.2.4. 队列典型应用 ‧ 淘宝订单。购物者下单后,订单就被加入到队列之中,随后系统再根据顺序依次处理队列中的订单。在 双十一时,在短时间内会产生海量的订单,如何处理「高并发」则是工程师们需要重点思考的问题。 ‧ 各种待办事项。任何需要实现“先来后到”的功能,例如打印机的任务队列、餐厅的出餐队列等等。 5. 栈与队列 hello‑algo0 码力 | 190 页 | 14.71 MB | 1 年前3 Hello 算法 1.0.0b1 Golang版释、内容 注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.3. 在动画图解中高效学习 视频和图片相比于文字的信息密度和结构化程度更高,更容易理解。在本书中,知识重难点会主要以动画、图 解的形式呈现,而文字的作用则是作为动画和图的解释与补充。 阅读本书时,若发现某段内容提供了动画或图解 ?(log ?) , ?(?) , ?(?2) , ?(2?) 。 38 3. 数据结构简介 3.1. 数据与内存 3.1.1. 基本数据类型 谈到计算机中的数据,我们能够想到文本、图片、视频、语音、3D 模型等等,这些数据虽然组织形式不同,但 都是由各种基本数据类型构成的。 「基本数据类型」是 CPU 可以直接进行运算的类型,在算法中直接被使用。 ‧「整数」根据不同的长度分为 byte 2.3. 两种实现对比 与栈的结论一致,在此不再赘述。 5.2.4. 队列典型应用 ‧ 淘宝订单。购物者下单后,订单就被加入到队列之中,随后系统再根据顺序依次处理队列中的订单。在 双十一时,在短时间内会产生海量的订单,如何处理「高并发」则是工程师们需要重点思考的问题。 ‧ 各种待办事项。任何需要实现“先来后到”的功能,例如打印机的任务队列、餐厅的出餐队列等等。 5. 栈与队列 hello‑algo0 码力 | 190 页 | 14.71 MB | 1 年前3
 Hello 算法 1.1.0 Go版“如果我当年学数据结构与算法的时候有《Hello 算法》,学起来应该会简单 10 倍!” ——李沐,亚马逊资深首席科学家 计算机的出现给世界带来了巨大变革,它凭借高速的计算能力和出色的可编程性,成为了执行算法与处理数 据的理想媒介。无论是电子游戏的逼真画面、自动驾驶的智能决策,还是 AlphaGo 的精彩棋局、ChatGPT 的自然交互,这些应用都是算法在计算机上的精妙演绎。 事实上,在计算机问世之前, hello‑algo.com 5 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2 在动画图解中高效学习 相较于文字,视频和图片具有更高的信息密度和结构化程度,更易于理解。在本书中,重点和难点知识将主 要通过动画以图解形式展示,而文字则作为解释与补充。 如果你在阅读本书时,发现某段内容提供了如图 0‑2 所示的动画图解,请以图为主、以文字为辅,综合两者 2 张扑克已经有序。 3. 不断循环步骤 2. ,每一轮将一张扑克牌从无序部分插入至有序部分,直至所有扑克牌都有序。 图 1‑2 扑克排序步骤 上述整理扑克牌的方法本质上是“插入排序”算法,它在处理小型数据集时非常高效。许多编程语言的排序 库函数中都有插入排序的身影。 例三:货币找零。假设我们在超市购买了 69 元的商品,给了收银员 100 元,则收银员需要找我们 31 元。他 会很自然地完成如图0 码力 | 383 页 | 18.48 MB | 1 年前3 Hello 算法 1.1.0 Go版“如果我当年学数据结构与算法的时候有《Hello 算法》,学起来应该会简单 10 倍!” ——李沐,亚马逊资深首席科学家 计算机的出现给世界带来了巨大变革,它凭借高速的计算能力和出色的可编程性,成为了执行算法与处理数 据的理想媒介。无论是电子游戏的逼真画面、自动驾驶的智能决策,还是 AlphaGo 的精彩棋局、ChatGPT 的自然交互,这些应用都是算法在计算机上的精妙演绎。 事实上,在计算机问世之前, hello‑algo.com 5 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2 在动画图解中高效学习 相较于文字,视频和图片具有更高的信息密度和结构化程度,更易于理解。在本书中,重点和难点知识将主 要通过动画以图解形式展示,而文字则作为解释与补充。 如果你在阅读本书时,发现某段内容提供了如图 0‑2 所示的动画图解,请以图为主、以文字为辅,综合两者 2 张扑克已经有序。 3. 不断循环步骤 2. ,每一轮将一张扑克牌从无序部分插入至有序部分,直至所有扑克牌都有序。 图 1‑2 扑克排序步骤 上述整理扑克牌的方法本质上是“插入排序”算法,它在处理小型数据集时非常高效。许多编程语言的排序 库函数中都有插入排序的身影。 例三:货币找零。假设我们在超市购买了 69 元的商品,给了收银员 100 元,则收银员需要找我们 31 元。他 会很自然地完成如图0 码力 | 383 页 | 18.48 MB | 1 年前3
 Hello 算法 1.0.0 Golang版标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 第 0 章 前言 hello‑algo.com 5 * 注释 */ 0.2.2 在动画图解中高效学习 相较于文字,视频和图片具有更高的信息密度和结构化程度,更易于理解。在本书中,重点和难点知识将主 要通过动画以图解形式展示,而文字则作为解释与补充。 如果你在阅读本书时,发现某段内容提供了如图 0‑2 所示的动画图解,请以图为主、以文字为辅,综合两者 2 张扑克已经有序。 3. 不断循环步骤 2. ,每一轮将一张扑克牌从无序部分插入至有序部分,直至所有扑克牌都有序。 图 1‑2 扑克排序步骤 上述整理扑克牌的方法本质上是“插入排序”算法,它在处理小型数据集时非常高效。许多编程语言的排序 库函数中都有插入排序的身影。 例三:货币找零。假设我们在超市购买了 69 元的商品,给了收银员 100 元,则收银员需要找我们 31 元。他 会很自然地完成如图 图 2‑5 尾递归过程 � 请注意,许多编译器或解释器并不支持尾递归优化。例如,Python 默认不支持尾递归优化, 因此即使函数是尾递归形式,仍然可能会遇到栈溢出问题。 3. 递归树 当处理与“分治”相关的算法问题时,递归往往比迭代的思路更加直观、代码更加易读。以“斐波那契数列” 为例。 � 给定一个斐波那契数列 0, 1, 1, 2, 3, 5, 8, 13, … ,求该数列的第0 码力 | 382 页 | 17.60 MB | 1 年前3 Hello 算法 1.0.0 Golang版标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 第 0 章 前言 hello‑algo.com 5 * 注释 */ 0.2.2 在动画图解中高效学习 相较于文字,视频和图片具有更高的信息密度和结构化程度,更易于理解。在本书中,重点和难点知识将主 要通过动画以图解形式展示,而文字则作为解释与补充。 如果你在阅读本书时,发现某段内容提供了如图 0‑2 所示的动画图解,请以图为主、以文字为辅,综合两者 2 张扑克已经有序。 3. 不断循环步骤 2. ,每一轮将一张扑克牌从无序部分插入至有序部分,直至所有扑克牌都有序。 图 1‑2 扑克排序步骤 上述整理扑克牌的方法本质上是“插入排序”算法,它在处理小型数据集时非常高效。许多编程语言的排序 库函数中都有插入排序的身影。 例三:货币找零。假设我们在超市购买了 69 元的商品,给了收银员 100 元,则收银员需要找我们 31 元。他 会很自然地完成如图 图 2‑5 尾递归过程 � 请注意,许多编译器或解释器并不支持尾递归优化。例如,Python 默认不支持尾递归优化, 因此即使函数是尾递归形式,仍然可能会遇到栈溢出问题。 3. 递归树 当处理与“分治”相关的算法问题时,递归往往比迭代的思路更加直观、代码更加易读。以“斐波那契数列” 为例。 � 给定一个斐波那契数列 0, 1, 1, 2, 3, 5, 8, 13, … ,求该数列的第0 码力 | 382 页 | 17.60 MB | 1 年前3
 Hello 算法 1.0.0b5 Golang版释、内容注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2 在动画图解中高效学习 相较于文字,视频和图片具有更高的信息密度和结构化程度,更易于理解。在本书中,重点和难点知识将主 要通过动画和图解形式展示,而文字则作为动画和图片的解释与补充。 如果你在阅读本书时,发现某段内容提供了图 0‑2 2 张扑克已经有序。 3. 不断循环步骤 2. ,每一轮将一张扑克牌从无序部分插入至有序部分,直至所有扑克牌都有序。 图 1‑2 扑克排序步骤 上述整理扑克牌的方法本质上是“插入排序”算法,它在处理小型数据集时非常高效。许多编程语言的排序 库函数中都存在插入排序的身影。 例三:货币找零。假设我们在超市购买了 69 元的商品,给了收银员 100 元,则收银员需要找我们 31 元。他 会很自然地完成如图 图 2‑5 尾递归过程 请注意,许多编译器或解释器并不支持尾递归优化。例如,Python 默认不支持尾递归优化,因此即使函数 是尾递归形式,但仍然可能会遇到栈溢出问题。 3. 递归树 当处理与“分治”相关的算法问题时,递归往往比迭代的思路更加直观、代码更加易读。以“斐波那契数列” 为例。 � 给定一个斐波那契数列 0, 1, 1, 2, 3, 5, 8, 13, … ,求该数列的第0 码力 | 379 页 | 30.70 MB | 1 年前3 Hello 算法 1.0.0b5 Golang版释、内容注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2 在动画图解中高效学习 相较于文字,视频和图片具有更高的信息密度和结构化程度,更易于理解。在本书中,重点和难点知识将主 要通过动画和图解形式展示,而文字则作为动画和图片的解释与补充。 如果你在阅读本书时,发现某段内容提供了图 0‑2 2 张扑克已经有序。 3. 不断循环步骤 2. ,每一轮将一张扑克牌从无序部分插入至有序部分,直至所有扑克牌都有序。 图 1‑2 扑克排序步骤 上述整理扑克牌的方法本质上是“插入排序”算法,它在处理小型数据集时非常高效。许多编程语言的排序 库函数中都存在插入排序的身影。 例三:货币找零。假设我们在超市购买了 69 元的商品,给了收银员 100 元,则收银员需要找我们 31 元。他 会很自然地完成如图 图 2‑5 尾递归过程 请注意,许多编译器或解释器并不支持尾递归优化。例如,Python 默认不支持尾递归优化,因此即使函数 是尾递归形式,但仍然可能会遇到栈溢出问题。 3. 递归树 当处理与“分治”相关的算法问题时,递归往往比迭代的思路更加直观、代码更加易读。以“斐波那契数列” 为例。 � 给定一个斐波那契数列 0, 1, 1, 2, 3, 5, 8, 13, … ,求该数列的第0 码力 | 379 页 | 30.70 MB | 1 年前3
 Hello 算法 1.0.0b2 Golang版释、内容 注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.3. 在动画图解中高效学习 视频和图片相比于文字的信息密度和结构化程度更高,更容易理解。在本书中,知识重难点会主要以动画、图 解的形式呈现,而文字的作用则是作为动画和图的解释与补充。 阅读本书时,若发现某段内容提供了动画或图解 ?(log ?) , ?(?) , ?(?2) , ?(2?) 。 38 3. 数据结构简介 3.1. 数据与内存 3.1.1. 基本数据类型 谈到计算机中的数据,我们能够想到文本、图片、视频、语音、3D 模型等等,这些数据虽然组织形式不同,但 都是由各种基本数据类型构成的。 「基本数据类型」是 CPU 可以直接进行运算的类型,在算法中直接被使用。 ‧「整数」根据不同的长度分为 byte 2.3. 两种实现对比 与栈的结论一致,在此不再赘述。 5.2.4. 队列典型应用 ‧ 淘宝订单。购物者下单后,订单就被加入到队列之中,随后系统再根据顺序依次处理队列中的订单。在 双十一时,在短时间内会产生海量的订单,如何处理「高并发」则是工程师们需要重点思考的问题。 ‧ 各种待办事项。任何需要实现“先来后到”的功能,例如打印机的任务队列、餐厅的出餐队列等等。 5. 栈与队列 hello‑algo0 码力 | 202 页 | 15.73 MB | 1 年前3 Hello 算法 1.0.0b2 Golang版释、内容 注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.3. 在动画图解中高效学习 视频和图片相比于文字的信息密度和结构化程度更高,更容易理解。在本书中,知识重难点会主要以动画、图 解的形式呈现,而文字的作用则是作为动画和图的解释与补充。 阅读本书时,若发现某段内容提供了动画或图解 ?(log ?) , ?(?) , ?(?2) , ?(2?) 。 38 3. 数据结构简介 3.1. 数据与内存 3.1.1. 基本数据类型 谈到计算机中的数据,我们能够想到文本、图片、视频、语音、3D 模型等等,这些数据虽然组织形式不同,但 都是由各种基本数据类型构成的。 「基本数据类型」是 CPU 可以直接进行运算的类型,在算法中直接被使用。 ‧「整数」根据不同的长度分为 byte 2.3. 两种实现对比 与栈的结论一致,在此不再赘述。 5.2.4. 队列典型应用 ‧ 淘宝订单。购物者下单后,订单就被加入到队列之中,随后系统再根据顺序依次处理队列中的订单。在 双十一时,在短时间内会产生海量的订单,如何处理「高并发」则是工程师们需要重点思考的问题。 ‧ 各种待办事项。任何需要实现“先来后到”的功能,例如打印机的任务队列、餐厅的出餐队列等等。 5. 栈与队列 hello‑algo0 码力 | 202 页 | 15.73 MB | 1 年前3
共 52 条
- 1
- 2
- 3
- 4
- 5
- 6














 
 