Hello 算法 1.2.0 繁体中文 Python 版作者:靳宇棟(@krahets) 程式碼審閱:靳宇棟(@krahets) Release 1.2.0 2024‑12‑06 序 兩年前,我在力扣上分享了“劍指 Offer”系列題解,受到了許多讀者的鼓勵與支持。在與讀者交流期間,我 最常被問到的一個問題是“如何入門演算法”。漸漸地,我對這個問題產生了濃厚的興趣。 兩眼一抹黑地刷題似乎是最受歡迎的方法,簡單、直接且有效。然而刷題就如同玩“踩地雷”遊戲,自學能 ”從這個意義上看,這本 書並非完全“免費”。為了不辜負你為本書所付出的寶貴“注意力”,我會竭盡所能,投入最大的“注意力” 來完成本書的創作。 本人自知學疏才淺,書中內容雖然已經過一段時間的打磨,但一定仍有許多錯誤,懇請各位老師與同學批評 指正。 本書中的程式碼附有可一鍵執行的原始檔,託管於 github.com/krahets/hello‑algo 倉庫。 動畫在 PDF 內的展示效果有限,可訪問 www 從巧奪天工的匠人 技藝、到解放生產力的工業產品、再到宇宙運行的科學規律,幾乎每一件平凡或令人驚嘆的事物背後,都隱 藏著精妙的演算法思想。 同樣,資料結構無處不在:大到社會網絡,小到地鐵路線,許多系統都可以建模為“圖”;大到一個國家,小 到一個家庭,社會的主要組織形式呈現出“樹”的特徵;冬天的衣服就像“堆疊”,最先穿上的最後才能脫下; 羽毛球筒則如同“佇列”,一端放入、一端取出;字典就像一個“雜湊表”,能夠快速查找目標詞條。0 码力 | 364 页 | 18.74 MB | 10 月前3
Python3 基础教程 - 廖雪峰00000000 01000001。 新的问题又出现了:如果统一成 Unicode 编码,乱码问题从此消失了。 但是,如果你写的文本基本上全部是英文的话,用 Unicode 编码比 ASCII 编码需要多一倍的存储空间,在存储和传输上就十分不划算。 所以,本着节约的精神,又出现了把 Unicode 编码转化为“可变长编码” 的 UTF-8 编码。UTF-8 编码把一个 Unicode 字符根据不同的数字大小编 内部存放的顺序和 key 放入的顺序是没有关系的。 和 list 比较,dict 有以下几个特点: 1. 查找和插入的速度极快,不会随着 key 的增加而增加; 2. 需要占用大量的内存,内存浪费多。 而 list 相反: 1. 查找和插入的时间随着元素的增加而增加; 2. 占用空间小,浪费内存很少。 Python3 基础教程【完整版】 http://www.yeayee.com/ [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 写列表生成式时,把要生成的元素 x * x 放到前面,后面跟 for 循环, 就可以把 list 创建出来,十分有用,多写几次,很快就可以熟悉这种语 法。 for 循环后面还可以加上 if 判断,这样我们就可以筛选出仅偶数的平方: >>> [x * x for x in range(1, 11) if x %0 码力 | 531 页 | 5.15 MB | 1 年前3
Hello 算法 1.0.0b4 Python版靳宇栋(Krahets) Release 1.0.0b4 2023‑07‑26 序 两年前,我在力扣上分享了《剑指 Offer》系列题解,受到了许多朋友的喜爱与支持。在此期间,我回答了众 多读者的评论问题,其中最常见的一个问题是“如何入门学习算法”。我逐渐也对这个问题产生了浓厚的兴 趣。 两眼一抹黑地刷题似乎是最受欢迎的方法,简单直接且有效。然而,刷题就如同玩“扫雷”游戏,自学能力 轮的重复后,就能将其牢记在心。 3. 搭建知识体系。在学习方面,我们可以阅读算法专栏文章、解题框架和算法教材,以不断丰富知识体 系。在刷题方面,可以尝试采用进阶刷题策略,如按专题分类、一题多解、一解多题等,相关的刷题心 得可以在各个社区找到。 作为一本入门教程,本书内容主要涵盖“第一阶段”,旨在帮助你更高效地展开第二和第三阶段的学习。 Figure 0‑7. 算法学习路线 0.3. 小结 对数阶 ?(log ?) 与指数阶相反,对数阶反映了“每轮缩减到一半的情况”。对数阶仅次于常数阶,时间增长缓慢,是理想的时 间复杂度。 对数阶常出现于「二分查找」和「分治算法」中,体现了“一分为多”和“化繁为简”的算法思想。 设输入数据大小为 ? ,由于每轮缩减到一半,因此循环次数是 log2 ? ,即 2? 的反函数。 # === File: time_complexity.py ===0 码力 | 329 页 | 27.34 MB | 1 年前3
Django 官方教程翻译项目最后,还要注意到我们使用了 ForeignKey 外键来定义一个关系。这会告诉 Django 每个 Choice 对象都和一个 Question 对象相关联。Django 支持所有常用的数据库关系:多对一、多 对多和一对一。 上面的一小段用于创建模型的代码给了 Django 很多信息,通过这些信息,Django 可以: 为这个应用创建数据库结构(生成 CREATE TABLE 语句)。 创建可以与 URL:“ME2/Sites/dirmod.asp? sid=&type=gen&mod=Core+Pages&gid=A6CD4967199A42D9B65B1B”。别担心,Django 里的 URL 要比这优雅的多! 一个 URL 模式定义了某种 URL 的基本格式 —— 举个例子: /newsarchive// / 为了将 URL 和视图关联起来,Django 使用了 “URLconfs” 代码比起来,编写枯燥的测试代码实在是太无聊了, 特别是当你知道你的代码完全没有问题的时候。 然而,编写测试还是要比花费几个小时手动测试你的应用,或者为了找到某个小错误而胡乱翻看代码 要有意义的多。 「测试是开发的对立面」,这种思想是不对的。 如果没有测试,整个应用的行为意图会变得更加的不清晰。甚至当你在看自己写的代码时也是这样, 有时候你需要仔细研读一段代码才能搞清楚它有什么用。 而 0 码力 | 103 页 | 1.86 MB | 1 年前3
Hello 算法 1.0.0b5 Python版轮的重复后,就能将其牢记在心。 3. 搭建知识体系。在学习方面,我们可以阅读算法专栏文章、解题框架和算法教材,以不断丰富知识体 系。在刷题方面,可以尝试采用进阶刷题策略,如按专题分类、一题多解、一解多题等,相关的刷题心 得可以在各个社区找到。 如图 0‑7 所示,本书内容主要涵盖“第一阶段”,旨在帮助你更高效地展开第二和第三阶段的学习。 第 0 章 前言 hello‑algo.com 8 图 int: """ 对数阶(递归实现)""" if n <= 1: return 0 return log_recur(n / 2) + 1 对数阶常出现于基于分治策略的算法中,体现了“一分为多”和“化繁为简”的算法思想。它增长缓慢,是 仅次于常数阶的理想的时间复杂度。 � ?(log ?) 的底数是多少? 准确来说,“一分为 ?”对应的时间复杂度是 ?(log? ?) 。而通过对数换底公式,我们可以 非线性数据结构可以进一步被划分为树形结构和网状结构。 ‧ 线性结构:数组、链表、队列、栈、哈希表,元素之间是一对一的顺序关系。 ‧ 树形结构:树、堆、哈希表,元素之间是一对多的关系。 ‧ 网状结构:图,元素之间是多对多的关系。 3.1.2 物理结构:连续与离散 在计算机中,内存和硬盘是两种主要的存储硬件设备。硬盘主要用于长期存储数据,容量较大(通常可达到 TB 级别)、速度较慢。内存用0 码力 | 361 页 | 30.64 MB | 1 年前3
Hello 算法 1.0.0 Python版轮的重复后,就能将其牢记在心。 3. 阶段三:搭建知识体系。在学习方面,我们可以阅读算法专栏文章、解题框架和算法教材,以不断丰富 知识体系。在刷题方面,可以尝试采用进阶刷题策略,如按专题分类、一题多解、一解多题等,相关的 刷题心得可以在各个社区找到。 如图 0‑8 所示,本书内容主要涵盖“阶段一”,旨在帮助你更高效地展开阶段二和阶段三的学习。 第 0 章 前言 hello‑algo.com 9 图 int: """ 对数阶(递归实现)""" if n <= 1: return 0 return log_recur(n / 2) + 1 对数阶常出现于基于分治策略的算法中,体现了“一分为多”和“化繁为简”的算法思想。它增长缓慢,是 仅次于常数阶的理想的时间复杂度。 � ?(log ?) 的底数是多少? 准确来说,“一分为 ?”对应的时间复杂度是 ?(log? ?) 。而通过对数换底公式,我们可以 ,元素之间是一对一的顺序关系。 ‧ 非线性数据结构:树、堆、图、哈希表。 非线性数据结构可以进一步划分为树形结构和网状结构。 ‧ 树形结构:树、堆、哈希表,元素之间是一对多的关系。 ‧ 网状结构:图,元素之间是多对多的关系。 图 3‑1 线性数据结构与非线性数据结构 3.1.2 物理结构:连续与分散 当算法程序运行时,正在处理的数据主要存储在内存中。图 3‑2 展示了一个计算机内存条,其中每个黑色方0 码力 | 362 页 | 17.54 MB | 1 年前3
Hello 算法 1.1.0 Python版GitHub 仓库。 3. 阶段三:搭建知识体系。在学习方面,我们可以阅读算法专栏文章、解题框架和算法教材,以不断丰富 知识体系。在刷题方面,可以尝试采用进阶刷题策略,如按专题分类、一题多解、一解多题等,相关的 刷题心得可以在各个社区找到。 如图 0‑8 所示,本书内容主要涵盖“阶段一”,旨在帮助你更高效地展开阶段二和阶段三的学习。 第 0 章 前言 hello‑algo.com 9 图 int: """ 对数阶(递归实现)""" if n <= 1: return 0 return log_recur(n / 2) + 1 对数阶常出现于基于分治策略的算法中,体现了“一分为多”和“化繁为简”的算法思想。它增长缓慢,是 仅次于常数阶的理想的时间复杂度。 ?(log ?) 的底数是多少? 准确来说,“一分为 ?”对应的时间复杂度是 ?(log? ?) 。而通过对数换底公式,我们可以得到具有 ,元素之间是一对一的顺序关系。 ‧ 非线性数据结构:树、堆、图、哈希表。 非线性数据结构可以进一步划分为树形结构和网状结构。 ‧ 树形结构:树、堆、哈希表,元素之间是一对多的关系。 ‧ 网状结构:图,元素之间是多对多的关系。 图 3‑1 线性数据结构与非线性数据结构 3.1.2 物理结构:连续与分散 当算法程序运行时,正在处理的数据主要存储在内存中。图 3‑2 展示了一个计算机内存条,其中每个黑色方0 码力 | 364 页 | 18.42 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Python 版GitHub 仓库。 3. 阶段三:搭建知识体系。在学习方面,我们可以阅读算法专栏文章、解题框架和算法教材,以不断丰富 知识体系。在刷题方面,可以尝试采用进阶刷题策略,如按专题分类、一题多解、一解多题等,相关的 刷题心得可以在各个社区找到。 如图 0‑8 所示,本书内容主要涵盖“阶段一”,旨在帮助你更高效地展开阶段二和阶段三的学习。 第 0 章 前言 www.hello‑algo.com 9 int: """ 对数阶(递归实现)""" if n <= 1: return 0 return log_recur(n / 2) + 1 对数阶常出现于基于分治策略的算法中,体现了“一分为多”和“化繁为简”的算法思想。它增长缓慢,是 仅次于常数阶的理想的时间复杂度。 ?(log ?) 的底数是多少? 准确来说,“一分为 ?”对应的时间复杂度是 ?(log? ?) 。而通过对数换底公式,我们可以得到具有 ,元素之间是一对一的顺序关系。 ‧ 非线性数据结构:树、堆、图、哈希表。 非线性数据结构可以进一步划分为树形结构和网状结构。 ‧ 树形结构:树、堆、哈希表,元素之间是一对多的关系。 ‧ 网状结构:图,元素之间是多对多的关系。 图 3‑1 线性数据结构与非线性数据结构 3.1.2 物理结构:连续与分散 当算法程序运行时,正在处理的数据主要存储在内存中。图 3‑2 展示了一个计算机内存条,其中每个黑色方0 码力 | 364 页 | 18.43 MB | 10 月前3
Python 3.9.20 正则表达式 HOWTO ca*t 可以匹配 'ct'(0 个 'a' )、'cat'(1 个 'a' )、'caaat'(3 个 'a' )等等。 像 * 这样的重复匹配是 贪婪的。当重复匹配正则时,匹配引擎会尝试重复尽可能多的次数。如果 pattern 的后续部分无法匹配成功,匹配引擎会回退并尝试减少重复次。 我们可以通过一个逐步的例子来更好理解这一点。来看看这个正则表达式 a[bcd]*b 。该表达式匹配的 是,首先是一个字母 [bcd] 的字母,最后以一个 'b' 结尾。现在, 让我们想象一下用这个正则去匹配字符串 'abcbd' 的过程。 步骤 匹配 说明 1 a 正则中的 a 匹配成功。 2 abcbd 引擎尽可能多地匹配 [bcd]* ,直至字符串末尾。 3 失败 引擎试图匹配正则中的 b ,但是当前位置已到达字符串末尾,因此匹配失败。 4 abcb 回退,让 [bcd]* 少匹配一个字符。 5 失败 再次尝试匹配正则中的 re.compile('[a-z]+') >>> p re.compile('[a-z]+') 现在,你可以尝试用正则 [a-z]+ 去匹配不同的字符串。空字符是无法匹配的,因为 + 表示“一次或多 次重复”。在这种情况下,match() 会返回 None,导致解释器没有任何输出。为了更直观地了解这一 点,你可以显式打印 match() 的返回结果。 >>> p.match("") >>> print(p0 码力 | 18 页 | 401.42 KB | 11 月前3
Python 3.11.10 正则表达式 HOWTO ca*t 可以匹配 'ct'(0 个 'a' )、'cat'(1 个 'a' )、'caaat'(3 个 'a' )等等。 像 * 这样的重复匹配是 贪婪的。当重复匹配正则时,匹配引擎会尝试重复尽可能多的次数。如果 pattern 的后续部分无法匹配成功,匹配引擎会回退并尝试减少重复次。 我们可以通过一个逐步的例子来更好理解这一点。来看看这个正则表达式 a[bcd]*b 。该表达式匹配的 是,首先是一个字母 [bcd] 的字母,最后以一个 'b' 结尾。现在, 让我们想象一下用这个正则去匹配字符串 'abcbd' 的过程。 3 步骤 匹配 说明 1 a 正则中的 a 匹配成功。 2 abcbd 引擎尽可能多地匹配 [bcd]* ,直至字符串末尾。 3 失败 引擎试图匹配正则中的 b ,但是当前位置已到达字符串末尾,因此匹配失败。 4 abcb 回退,让 [bcd]* 少匹配一个字符。 5 失败 再次尝试匹配正则中的 re.compile('[a-z]+') >>> p re.compile('[a-z]+') 现在,你可以尝试用正则 [a-z]+ 去匹配不同的字符串。空字符是无法匹配的,因为 + 表示“一次或多 次重复”。在这种情况下,match() 会返回 None,导致解释器没有任何输出。为了更直观地了解这一 点,你可以显式打印 match() 的返回结果。 >>> p.match("") >>> print(p0 码力 | 18 页 | 403.35 KB | 11 月前3
共 149 条
- 1
- 2
- 3
- 4
- 5
- 6
- 15













