Hello 算法 1.0.0b2 Python版. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 10. 查找算法 145 10.1. 线性查找 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 10.2. 二分查找 次,算法运行时间随着 ? 增大成线性增长。此算法的时间复杂度被称为 「线性阶」。 ‧ 算法 C 中的打印操作需要循环 1000000 次,但运行时间仍与输入数据大小 ? 无关。因此 C 的时间复杂 度和 A 相同,仍为「常数阶」。 # 算法 A 时间复杂度:常数阶 def algorithm_A(n: int) -> None: print(0) # 算法 B 时间复杂度:线性阶 def algorithm_B(n: 相比直接统计算法运行时间,时间复杂度分析的做法有什么好处呢?以及有什么不足? 时间复杂度可以有效评估算法效率。算法 B 运行时间的增长是线性的,在 ? > 1 时慢于算法 A ,在 ? > 1000000 时慢于算法 C 。实质上,只要输入数据大小 ? 足够大,复杂度为「常数阶」的算法一定优于 「线性阶」的算法,这也正是时间增长趋势的含义。 时间复杂度的推算方法更加简便。在时间复杂度分析中,我们可以将统计「计算操作的运行时间」简化为统计0 码力 | 186 页 | 15.69 MB | 1 年前3
Hello 算法 1.1.0 Python版是该求和函数的流程框图。 第 2 章 复杂度分析 hello‑algo.com 20 图 2‑1 求和函数的流程框图 此求和函数的操作数量与输入数据大小 ? 成正比,或者说成“线性关系”。实际上,时间复杂度描述的就是 这个“线性关系”。相关内容将会在下一节中详细介绍。 2. while 循环 与 for 循环类似,while 循环也是一种实现迭代的方法。在 while 循环中,程序每轮都会先检查条件,如果条 输入数据大小为 ? ,给定三个算法 A、B 和 C : # 算法 A 的时间复杂度:常数阶 def algorithm_A(n: int): print(0) # 算法 B 的时间复杂度:线性阶 def algorithm_B(n: int): for _ in range(n): 第 2 章 复杂度分析 hello‑algo.com 29 print(0) # 算法 C 的时间复杂度:常数阶 A 只有 1 个打印操作,算法运行时间不随着 ? 增大而增长。我们称此算法的时间复杂度为“常数 阶”。 ‧ 算法 B 中的打印操作需要循环 ? 次,算法运行时间随着 ? 增大呈线性增长。此算法的时间复杂度被称 为“线性阶”。 ‧ 算法 C 中的打印操作需要循环 1000000 次,虽然运行时间很长,但它与输入数据大小 ? 无关。因此 C 的时间复杂度和 A 相同,仍为“常数阶”。 图 2‑70 码力 | 364 页 | 18.42 MB | 1 年前3
Hello 算法 1.0.0 Python版是该求和函数的流程框图。 第 2 章 复杂度分析 hello‑algo.com 20 图 2‑1 求和函数的流程框图 此求和函数的操作数量与输入数据大小 ? 成正比,或者说成“线性关系”。实际上,时间复杂度描述的就是 这个“线性关系”。相关内容将会在下一节中详细介绍。 2. while 循环 与 for 循环类似,while 循环也是一种实现迭代的方法。在 while 循环中,程序每轮都会先检查条件,如果条 输入数据大小为 ? ,给定三个算法 A、B 和 C : # 算法 A 的时间复杂度:常数阶 def algorithm_A(n: int): print(0) # 算法 B 的时间复杂度:线性阶 第 2 章 复杂度分析 hello‑algo.com 29 def algorithm_B(n: int): for _ in range(n): print(0) # 算法 C 的时间复杂度:常数阶 A 只有 1 个打印操作,算法运行时间不随着 ? 增大而增长。我们称此算法的时间复杂度为“常数 阶”。 ‧ 算法 B 中的打印操作需要循环 ? 次,算法运行时间随着 ? 增大呈线性增长。此算法的时间复杂度被称 为“线性阶”。 ‧ 算法 C 中的打印操作需要循环 1000000 次,虽然运行时间很长,但它与输入数据大小 ? 无关。因此 C 的时间复杂度和 A 相同,仍为“常数阶”。 图 2‑70 码力 | 362 页 | 17.54 MB | 1 年前3
Hello 算法 1.0.0b5 Python版展示了该求和函数的流程框图。 第 2 章 复杂度分析 hello‑algo.com 19 图 2‑1 求和函数的流程框图 此求和函数的操作数量与输入数据大小 ? 成正比,或者说成“线性关系”。实际上,时间复杂度描述的就是 这个“线性关系”。相关内容将会在下一节中详细介绍。 2. while 循环 与 for 循环类似,while 循环也是一种实现迭代的方法。在 while 循环中,程序每轮都会先检查条件,如果条 据大小为 ? ,给定三个算法 函数 A、B 和 C : # 算法 A 的时间复杂度:常数阶 def algorithm_A(n: int): print(0) # 算法 B 的时间复杂度:线性阶 def algorithm_B(n: int): for _ in range(n): print(0) # 算法 C 的时间复杂度:常数阶 def algorithm_C(n: int): A 只有 1 个打印操作,算法运行时间不随着 ? 增大而增长。我们称此算法的时间复杂度为“常数 阶”。 ‧ 算法 B 中的打印操作需要循环 ? 次,算法运行时间随着 ? 增大呈线性增长。此算法的时间复杂度被称 为“线性阶”。 ‧ 算法 C 中的打印操作需要循环 1000000 次,虽然运行时间很长,但它与输入数据大小 ? 无关。因此 C 的时间复杂度和 A 相同,仍为“常数阶”。 第 20 码力 | 361 页 | 30.64 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Python 版www.hello‑algo.com 20 图 2‑1 是该求和函数的流程框图。 图 2‑1 求和函数的流程框图 此求和函数的操作数量与输入数据大小 ? 成正比,或者说成“线性关系”。实际上,时间复杂度描述的就是 这个“线性关系”。相关内容将会在下一节中详细介绍。 2. while 循环 与 for 循环类似,while 循环也是一种实现迭代的方法。在 while 循环中,程序每轮都会先检查条件,如果条 输入数据大小为 ? ,给定三个算法 A、B 和 C : # 算法 A 的时间复杂度:常数阶 def algorithm_A(n: int): print(0) # 算法 B 的时间复杂度:线性阶 def algorithm_B(n: int): for _ in range(n): 第 2 章 复杂度分析 www.hello‑algo.com 29 print(0) # 算法 C A 只有 1 个打印操作,算法运行时间不随着 ? 增大而增长。我们称此算法的时间复杂度为“常数 阶”。 ‧ 算法 B 中的打印操作需要循环 ? 次,算法运行时间随着 ? 增大呈线性增长。此算法的时间复杂度被称 为“线性阶”。 ‧ 算法 C 中的打印操作需要循环 1000000 次,虽然运行时间很长,但它与输入数据大小 ? 无关。因此 C 的时间复杂度和 A 相同,仍为“常数阶”。 图 2‑70 码力 | 364 页 | 18.43 MB | 10 月前3
Hello 算法 1.0.0b4 Python版次,算法运行时间随着 ? 增大呈线性增长。此算法的时间复杂度被称 为「线性阶」。 ‧ 算法 C 中的打印操作需要循环 1000000 次,但运行时间仍与输入数据大小 ? 无关。因此 C 的时间复杂 度和 A 相同,仍为「常数阶」。 # 算法 A 时间复杂度:常数阶 def algorithm_A(n: int): print(0) # 算法 B 时间复杂度:线性阶 def algorithm_B(n: 相较于直接统计算法运行时间,时间复杂度分析有哪些优势和局限性呢? 时间复杂度能够有效评估算法效率。例如,算法 B 的运行时间呈线性增长,在 ? > 1 时比算法 A 慢,在 ? > 1000000 时比算法 C 慢。事实上,只要输入数据大小 ? 足够大,复杂度为「常数阶」的算法一定优于 「线性阶」的算法,这正是时间增长趋势所表达的含义。 时间复杂度的推算方法更简便。显然,运行平台和计算操作类型都与算法运行时间的增长趋势无关。因此在 a = a * 2 # +1 # 循环 n 次 for i in range(n): # +1 print(0) # +1 ?(?) 是一次函数,说明时间增长趋势是线性的,因此可以得出时间复杂度是线性阶。 我们将线性阶的时间复杂度记为 ?(?) ,这个数学符号称为「大 ? 记号 Big‑? Notation」,表示函数 ?(?) 的「渐近上界 Asymptotic Upper Bound」。0 码力 | 329 页 | 27.34 MB | 1 年前3
Hello 算法 1.0.0b1 Python版. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 10. 查找算法 145 10.1. 线性查找 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 10.2. 二分查找 次,算法运行时间随着 ? 增大成线性增长。此算法的时间复杂度被称为 「线性阶」。 ‧ 算法 C 中的打印操作需要循环 1000000 次,但运行时间仍与输入数据大小 ? 无关。因此 C 的时间复杂 度和 A 相同,仍为「常数阶」。 # 算法 A 时间复杂度:常数阶 def algorithm_A(n): print(0) # 算法 B 时间复杂度:线性阶 def algorithm_B(n): 相比直接统计算法运行时间,时间复杂度分析的做法有什么好处呢?以及有什么不足? 时间复杂度可以有效评估算法效率。算法 B 运行时间的增长是线性的,在 ? > 1 时慢于算法 A ,在 ? > 1000000 时慢于算法 C 。实质上,只要输入数据大小 ? 足够大,复杂度为「常数阶」的算法一定优于 「线性阶」的算法,这也正是时间增长趋势的含义。 时间复杂度的推算方法更加简便。在时间复杂度分析中,我们可以将统计「计算操作的运行时间」简化为统计0 码力 | 178 页 | 14.67 MB | 1 年前3
Python 标准库参考指南 3.12 的符号)。请注 意,k 不可为零。如果 k 为 None,则当作 1 处理。 (6) 拼接不可变序列总是会生成新的对象。这意味着通过重复拼接来构建序列的运行时开销将会基于 序列总长度的乘方。想要获得线性的运行时开销,你必须改用下列替代方案之一: • 如果拼接str 对象,你可以构建一个列表并在最后使用str.join() 或是写入一个io. StringIO 实例并在结束时获取它的值 • 如果拼接bytes 字”)。不存在可在线性 时间内将一个字符串转换为二进制整数或将一个二进制整数转换为字符串的算法,除非基数为 2 的乘方。 对于基数为 10 来说已知最好的算法也有亚二次方复杂度。转换一个大数值如 int('1' * 500_000) 在 快速的 CPU 上也会花费一秒以上的时间。 限制转换大小是一项避免 CVE 2020-10735 的务实解决方式。 此限制会在可能涉及非线性转换算法时作用于输 repr(integer)。 • 任何其他目标是以 10 为基数的字符串转换,例如 f"{integer}", "{}".format(integer) 或 b"%d" % integer。 此限制不会作用于使用线性算法的函数: • int(string, base) 中 base 可以为 2, 4, 8, 16 或 32。 • int.from_bytes() 和int.to_bytes()。 • hex()0 码力 | 2253 页 | 11.81 MB | 9 月前3
Python 标准库参考指南 3.12 的符号)。请注 意,k 不可为零。如果 k 为 None,则当作 1 处理。 (6) 拼接不可变序列总是会生成新的对象。这意味着通过重复拼接来构建序列的运行时开销将会基于 序列总长度的乘方。想要获得线性的运行时开销,你必须改用下列替代方案之一: • 如果拼接str 对象,你可以构建一个列表并在最后使用str.join() 或是写入一个io. StringIO 实例并在结束时获取它的值 • 如果拼接bytes 字”)。不存在可在线性 时间内将一个字符串转换为二进制整数或将一个二进制整数转换为字符串的算法,除非基数为 2 的乘方。 对于基数为 10 来说已知最好的算法也有亚二次方复杂度。转换一个大数值如 int('1' * 500_000) 在 快速的 CPU 上也会花费一秒以上的时间。 限制转换大小是一项避免 CVE 2020-10735 的务实解决方式。 此限制会在可能涉及非线性转换算法时作用于输 repr(integer)。 • 任何其他目标是以 10 为基数的字符串转换,例如 f"{integer}", "{}".format(integer) 或 b"%d" % integer。 此限制不会作用于使用线性算法的函数: • int(string, base) 中 base 可以为 2, 4, 8, 16 或 32。 • int.from_bytes() 和int.to_bytes()。 • hex()0 码力 | 2253 页 | 11.81 MB | 9 月前3
Python 标准库参考指南 3.10.15 的符号)。请注意, k 不可为零。如果 k 为 None,则当作 1 处理。 (6) 拼接不可变序列总是会生成新的对象。这意味着通过重复拼接来构建序列的运行时开销将会基于序列 总长度的乘方。想要获得线性的运行时开销,你必须改用下列替代方案之一: • 如果拼接str 对象,你可以构建一个列表并在最后使用str.join() 或是写入一个io.StringIO 实例并在结束时获取它的值 • 如果拼接bytes 字”)。不存在可在线性时间 内将一个字符串转换为二进制整数或将一个二进制整数转换为字符串的算法,除非基数为 2 的乘方。对于 基数为 10 来说已知最好的算法也有亚二次方复杂度。转换一个大数值如 int('1' * 500_000) 在快速的 CPU 上也会花费一秒以上的时间。 限制转换大小提供了一个避免 CVE-2020-10735 的可行方法。 此限制会在可能涉及非线性转换算法时作用于输入 repr(integer)。 • 任何其他目标是以 10 为基数的字符串转换,例如 f"{integer}", "{}".format(integer) 或 b"%d" % integer。 此限制不会作用于使用线性算法的函数: • int(string, base) 中 base 可以为 2, 4, 8, 16 或 32。 • int.from_bytes() 和int.to_bytes()。 • hex()0 码力 | 2207 页 | 10.45 MB | 9 月前3
共 40 条
- 1
- 2
- 3
- 4













