This commit is contained in:
krahets
2023-02-24 18:46:22 +08:00
parent 0edd696eb7
commit 700da13226
50 changed files with 3964 additions and 3964 deletions

View File

@ -25,7 +25,7 @@
<title>2.2. 时间复杂度 - Hello 算法</title>
<title>2.2.   时间复杂度 - Hello 算法</title>
@ -111,7 +111,7 @@
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
2.2. 时间复杂度
2.2. &nbsp; 时间复杂度
</span>
</div>
@ -268,14 +268,14 @@
<label class="md-nav__link" for="__nav_1" id="__nav_1_label" tabindex="0">
0. 写在前面
0. &nbsp; &nbsp; 写在前面
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_1">
<span class="md-nav__icon md-icon"></span>
0. 写在前面
0. &nbsp; &nbsp; 写在前面
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -286,7 +286,7 @@
<li class="md-nav__item">
<a href="../../chapter_preface/about_the_book/" class="md-nav__link">
0.1. 关于本书
0.1. &nbsp; 关于本书
</a>
</li>
@ -300,7 +300,7 @@
<li class="md-nav__item">
<a href="../../chapter_preface/suggestions/" class="md-nav__link">
0.2. 如何使用本书
0.2. &nbsp; 如何使用本书
</a>
</li>
@ -314,7 +314,7 @@
<li class="md-nav__item">
<a href="../../chapter_preface/installation/" class="md-nav__link">
0.3. 编程环境安装
0.3. &nbsp; 编程环境安装
</a>
</li>
@ -328,7 +328,7 @@
<li class="md-nav__item">
<a href="../../chapter_preface/contribution/" class="md-nav__link">
0.4. 一起参与创作
0.4. &nbsp; 一起参与创作
</a>
</li>
@ -367,14 +367,14 @@
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
1. 引言
1. &nbsp; &nbsp; 引言
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
1. 引言
1. &nbsp; &nbsp; 引言
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -385,7 +385,7 @@
<li class="md-nav__item">
<a href="../../chapter_introduction/algorithms_are_everywhere/" class="md-nav__link">
1.1. 算法无处不在
1.1. &nbsp; 算法无处不在
</a>
</li>
@ -399,7 +399,7 @@
<li class="md-nav__item">
<a href="../../chapter_introduction/what_is_dsa/" class="md-nav__link">
1.2. 算法是什么
1.2. &nbsp; 算法是什么
</a>
</li>
@ -446,14 +446,14 @@
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
2. 计算复杂度
2. &nbsp; &nbsp; 计算复杂度
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
2. 计算复杂度
2. &nbsp; &nbsp; 计算复杂度
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -464,7 +464,7 @@
<li class="md-nav__item">
<a href="../performance_evaluation/" class="md-nav__link">
2.1. 算法效率评估
2.1. &nbsp; 算法效率评估
</a>
</li>
@ -487,12 +487,12 @@
<label class="md-nav__link md-nav__link--active" for="__toc">
2.2. 时间复杂度
2.2. &nbsp; 时间复杂度
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
2.2. 时间复杂度
2.2. &nbsp; 时间复杂度
</a>
@ -512,31 +512,31 @@
<li class="md-nav__item">
<a href="#221" class="md-nav__link">
2.2.1. 统计算法运行时间
2.2.1. &nbsp; 统计算法运行时间
</a>
</li>
<li class="md-nav__item">
<a href="#222" class="md-nav__link">
2.2.2. 统计时间增长趋势
2.2.2. &nbsp; 统计时间增长趋势
</a>
</li>
<li class="md-nav__item">
<a href="#223" class="md-nav__link">
2.2.3. 函数渐近上界
2.2.3. &nbsp; 函数渐近上界
</a>
</li>
<li class="md-nav__item">
<a href="#224" class="md-nav__link">
2.2.4. 推算方法
2.2.4. &nbsp; 推算方法
</a>
<nav class="md-nav" aria-label="2.2.4. 推算方法">
<nav class="md-nav" aria-label="2.2.4. &nbsp; 推算方法">
<ul class="md-nav__list">
<li class="md-nav__item">
@ -560,10 +560,10 @@
<li class="md-nav__item">
<a href="#225" class="md-nav__link">
2.2.5. 常见类型
2.2.5. &nbsp; 常见类型
</a>
<nav class="md-nav" aria-label="2.2.5. 常见类型">
<nav class="md-nav" aria-label="2.2.5. &nbsp; 常见类型">
<ul class="md-nav__list">
<li class="md-nav__item">
@ -622,7 +622,7 @@
<li class="md-nav__item">
<a href="#226" class="md-nav__link">
2.2.6. 最差、最佳、平均时间复杂度
2.2.6. &nbsp; 最差、最佳、平均时间复杂度
</a>
</li>
@ -643,7 +643,7 @@
<li class="md-nav__item">
<a href="../space_complexity/" class="md-nav__link">
2.3. 空间复杂度
2.3. &nbsp; 空间复杂度
</a>
</li>
@ -657,7 +657,7 @@
<li class="md-nav__item">
<a href="../space_time_tradeoff/" class="md-nav__link">
2.4. 权衡时间与空间
2.4. &nbsp; 权衡时间与空间
</a>
</li>
@ -671,7 +671,7 @@
<li class="md-nav__item">
<a href="../summary/" class="md-nav__link">
2.5. 小结
2.5. &nbsp; 小结
</a>
</li>
@ -712,14 +712,14 @@
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
3. 数据结构简介
3. &nbsp; &nbsp; 数据结构简介
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
3. 数据结构简介
3. &nbsp; &nbsp; 数据结构简介
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -730,7 +730,7 @@
<li class="md-nav__item">
<a href="../../chapter_data_structure/data_and_memory/" class="md-nav__link">
3.1. 数据与内存
3.1. &nbsp; 数据与内存
</a>
</li>
@ -744,7 +744,7 @@
<li class="md-nav__item">
<a href="../../chapter_data_structure/classification_of_data_structure/" class="md-nav__link">
3.2. 数据结构分类
3.2. &nbsp; 数据结构分类
</a>
</li>
@ -758,7 +758,7 @@
<li class="md-nav__item">
<a href="../../chapter_data_structure/summary/" class="md-nav__link">
3.3. 小结
3.3. &nbsp; 小结
</a>
</li>
@ -801,14 +801,14 @@
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
4. 数组与链表
4. &nbsp; &nbsp; 数组与链表
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
4. 数组与链表
4. &nbsp; &nbsp; 数组与链表
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -819,7 +819,7 @@
<li class="md-nav__item">
<a href="../../chapter_array_and_linkedlist/array/" class="md-nav__link">
4.1. 数组Array
4.1. &nbsp; 数组Array
</a>
</li>
@ -833,7 +833,7 @@
<li class="md-nav__item">
<a href="../../chapter_array_and_linkedlist/linked_list/" class="md-nav__link">
4.2. 链表LinkedList
4.2. &nbsp; 链表LinkedList
</a>
</li>
@ -847,7 +847,7 @@
<li class="md-nav__item">
<a href="../../chapter_array_and_linkedlist/list/" class="md-nav__link">
4.3. 列表List
4.3. &nbsp; 列表List
</a>
</li>
@ -861,7 +861,7 @@
<li class="md-nav__item">
<a href="../../chapter_array_and_linkedlist/summary/" class="md-nav__link">
4.4. 小结
4.4. &nbsp; 小结
</a>
</li>
@ -904,14 +904,14 @@
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
5. 栈与队列
5. &nbsp; &nbsp; 栈与队列
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
5. 栈与队列
5. &nbsp; &nbsp; 栈与队列
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -922,7 +922,7 @@
<li class="md-nav__item">
<a href="../../chapter_stack_and_queue/stack/" class="md-nav__link">
5.1. 栈Stack
5.1. &nbsp;Stack
</a>
</li>
@ -936,7 +936,7 @@
<li class="md-nav__item">
<a href="../../chapter_stack_and_queue/queue/" class="md-nav__link">
5.2. 队列Queue
5.2. &nbsp; 队列Queue
</a>
</li>
@ -950,7 +950,7 @@
<li class="md-nav__item">
<a href="../../chapter_stack_and_queue/deque/" class="md-nav__link">
5.3. 双向队列Deque
5.3. &nbsp; 双向队列Deque
</a>
</li>
@ -964,7 +964,7 @@
<li class="md-nav__item">
<a href="../../chapter_stack_and_queue/summary/" class="md-nav__link">
5.4. 小结
5.4. &nbsp; 小结
</a>
</li>
@ -1005,14 +1005,14 @@
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
6. 散列表
6. &nbsp; &nbsp; 散列表
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
6. 散列表
6. &nbsp; &nbsp; 散列表
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -1023,7 +1023,7 @@
<li class="md-nav__item">
<a href="../../chapter_hashing/hash_map/" class="md-nav__link">
6.1. 哈希表HashMap
6.1. &nbsp; 哈希表HashMap
</a>
</li>
@ -1037,7 +1037,7 @@
<li class="md-nav__item">
<a href="../../chapter_hashing/hash_collision/" class="md-nav__link">
6.2. 哈希冲突处理
6.2. &nbsp; 哈希冲突处理
</a>
</li>
@ -1051,7 +1051,7 @@
<li class="md-nav__item">
<a href="../../chapter_hashing/summary/" class="md-nav__link">
6.3. 小结
6.3. &nbsp; 小结
</a>
</li>
@ -1096,14 +1096,14 @@
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
7. 二叉树
7. &nbsp; &nbsp; 二叉树
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
7. 二叉树
7. &nbsp; &nbsp; 二叉树
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -1114,7 +1114,7 @@
<li class="md-nav__item">
<a href="../../chapter_tree/binary_tree/" class="md-nav__link">
7.1. 二叉树Binary Tree
7.1. &nbsp; 二叉树Binary Tree
</a>
</li>
@ -1128,7 +1128,7 @@
<li class="md-nav__item">
<a href="../../chapter_tree/binary_tree_traversal/" class="md-nav__link">
7.2. 二叉树遍历
7.2. &nbsp; 二叉树遍历
</a>
</li>
@ -1142,7 +1142,7 @@
<li class="md-nav__item">
<a href="../../chapter_tree/binary_search_tree/" class="md-nav__link">
7.3. 二叉搜索树
7.3. &nbsp; 二叉搜索树
</a>
</li>
@ -1156,7 +1156,7 @@
<li class="md-nav__item">
<a href="../../chapter_tree/avl_tree/" class="md-nav__link">
7.4. AVL 树 *
7.4. &nbsp; AVL 树 *
</a>
</li>
@ -1170,7 +1170,7 @@
<li class="md-nav__item">
<a href="../../chapter_tree/summary/" class="md-nav__link">
7.5. 小结
7.5. &nbsp; 小结
</a>
</li>
@ -1207,14 +1207,14 @@
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
8. 堆
8. &nbsp; &nbsp;
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
8. 堆
8. &nbsp; &nbsp;
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -1225,7 +1225,7 @@
<li class="md-nav__item">
<a href="../../chapter_heap/heap/" class="md-nav__link">
8.1. 堆Heap
8.1. &nbsp;Heap
</a>
</li>
@ -1266,14 +1266,14 @@
<label class="md-nav__link" for="__nav_10" id="__nav_10_label" tabindex="0">
9. 图
9. &nbsp; &nbsp;
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_10_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_10">
<span class="md-nav__icon md-icon"></span>
9. 图
9. &nbsp; &nbsp;
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -1284,7 +1284,7 @@
<li class="md-nav__item">
<a href="../../chapter_graph/graph/" class="md-nav__link">
9.1. 图Graph
9.1. &nbsp;Graph
</a>
</li>
@ -1298,7 +1298,7 @@
<li class="md-nav__item">
<a href="../../chapter_graph/graph_operations/" class="md-nav__link">
9.2. 图基础操作
9.2. &nbsp; 图基础操作
</a>
</li>
@ -1312,7 +1312,7 @@
<li class="md-nav__item">
<a href="../../chapter_graph/graph_traversal/" class="md-nav__link">
9.3. 图的遍历
9.3. &nbsp; 图的遍历
</a>
</li>
@ -1355,14 +1355,14 @@
<label class="md-nav__link" for="__nav_11" id="__nav_11_label" tabindex="0">
10. 查找算法
10. &nbsp; &nbsp; 查找算法
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_11_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_11">
<span class="md-nav__icon md-icon"></span>
10. 查找算法
10. &nbsp; &nbsp; 查找算法
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -1373,7 +1373,7 @@
<li class="md-nav__item">
<a href="../../chapter_searching/linear_search/" class="md-nav__link">
10.1. 线性查找
10.1. &nbsp; 线性查找
</a>
</li>
@ -1387,7 +1387,7 @@
<li class="md-nav__item">
<a href="../../chapter_searching/binary_search/" class="md-nav__link">
10.2. 二分查找
10.2. &nbsp; 二分查找
</a>
</li>
@ -1401,7 +1401,7 @@
<li class="md-nav__item">
<a href="../../chapter_searching/hashing_search/" class="md-nav__link">
10.3. 哈希查找
10.3. &nbsp; 哈希查找
</a>
</li>
@ -1415,7 +1415,7 @@
<li class="md-nav__item">
<a href="../../chapter_searching/summary/" class="md-nav__link">
10.4. 小结
10.4. &nbsp; 小结
</a>
</li>
@ -1462,14 +1462,14 @@
<label class="md-nav__link" for="__nav_12" id="__nav_12_label" tabindex="0">
11. 排序算法
11. &nbsp; &nbsp; 排序算法
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_12_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_12">
<span class="md-nav__icon md-icon"></span>
11. 排序算法
11. &nbsp; &nbsp; 排序算法
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -1480,7 +1480,7 @@
<li class="md-nav__item">
<a href="../../chapter_sorting/intro_to_sort/" class="md-nav__link">
11.1. 排序简介
11.1. &nbsp; 排序简介
</a>
</li>
@ -1494,7 +1494,7 @@
<li class="md-nav__item">
<a href="../../chapter_sorting/bubble_sort/" class="md-nav__link">
11.2. 冒泡排序
11.2. &nbsp; 冒泡排序
</a>
</li>
@ -1508,7 +1508,7 @@
<li class="md-nav__item">
<a href="../../chapter_sorting/insertion_sort/" class="md-nav__link">
11.3. 插入排序
11.3. &nbsp; 插入排序
</a>
</li>
@ -1522,7 +1522,7 @@
<li class="md-nav__item">
<a href="../../chapter_sorting/quick_sort/" class="md-nav__link">
11.4. 快速排序
11.4. &nbsp; 快速排序
</a>
</li>
@ -1536,7 +1536,7 @@
<li class="md-nav__item">
<a href="../../chapter_sorting/merge_sort/" class="md-nav__link">
11.5. 归并排序
11.5. &nbsp; 归并排序
</a>
</li>
@ -1550,7 +1550,7 @@
<li class="md-nav__item">
<a href="../../chapter_sorting/summary/" class="md-nav__link">
11.6. 小结
11.6. &nbsp; 小结
</a>
</li>
@ -1638,31 +1638,31 @@
<li class="md-nav__item">
<a href="#221" class="md-nav__link">
2.2.1. 统计算法运行时间
2.2.1. &nbsp; 统计算法运行时间
</a>
</li>
<li class="md-nav__item">
<a href="#222" class="md-nav__link">
2.2.2. 统计时间增长趋势
2.2.2. &nbsp; 统计时间增长趋势
</a>
</li>
<li class="md-nav__item">
<a href="#223" class="md-nav__link">
2.2.3. 函数渐近上界
2.2.3. &nbsp; 函数渐近上界
</a>
</li>
<li class="md-nav__item">
<a href="#224" class="md-nav__link">
2.2.4. 推算方法
2.2.4. &nbsp; 推算方法
</a>
<nav class="md-nav" aria-label="2.2.4. 推算方法">
<nav class="md-nav" aria-label="2.2.4. &nbsp; 推算方法">
<ul class="md-nav__list">
<li class="md-nav__item">
@ -1686,10 +1686,10 @@
<li class="md-nav__item">
<a href="#225" class="md-nav__link">
2.2.5. 常见类型
2.2.5. &nbsp; 常见类型
</a>
<nav class="md-nav" aria-label="2.2.5. 常见类型">
<nav class="md-nav" aria-label="2.2.5. &nbsp; 常见类型">
<ul class="md-nav__list">
<li class="md-nav__item">
@ -1748,7 +1748,7 @@
<li class="md-nav__item">
<a href="#226" class="md-nav__link">
2.2.6. 最差、最佳、平均时间复杂度
2.2.6. &nbsp; 最差、最佳、平均时间复杂度
</a>
</li>
@ -1777,8 +1777,8 @@
<h1 id="22">2.2. 时间复杂度<a class="headerlink" href="#22" title="Permanent link">&para;</a></h1>
<h2 id="221">2.2.1. 统计算法运行时间<a class="headerlink" href="#221" title="Permanent link">&para;</a></h2>
<h1 id="22">2.2. &nbsp; 时间复杂度<a class="headerlink" href="#22" title="Permanent link">&para;</a></h1>
<h2 id="221">2.2.1. &nbsp; 统计算法运行时间<a class="headerlink" href="#221" title="Permanent link">&para;</a></h2>
<p>运行时间能够直观且准确地体现出算法的效率水平。如果我们想要 <strong>准确预估一段代码的运行时间</strong> ,该如何做呢?</p>
<ol>
<li>首先需要 <strong>确定运行平台</strong> ,包括硬件配置、编程语言、系统环境等,这些都会影响到代码的运行效率。</li>
@ -1915,7 +1915,7 @@
</div>
</div>
<p>但实际上, <strong>统计算法的运行时间既不合理也不现实</strong>。首先,我们不希望预估时间和运行平台绑定,毕竟算法需要跑在各式各样的平台之上。其次,我们很难获知每一种操作的运行时间,这为预估过程带来了极大的难度。</p>
<h2 id="222">2.2.2. 统计时间增长趋势<a class="headerlink" href="#222" title="Permanent link">&para;</a></h2>
<h2 id="222">2.2.2. &nbsp; 统计时间增长趋势<a class="headerlink" href="#222" title="Permanent link">&para;</a></h2>
<p>「时间复杂度分析」采取了不同的做法,其统计的不是算法运行时间,而是 <strong>算法运行时间随着数据量变大时的增长趋势</strong></p>
<p>“时间增长趋势”这个概念比较抽象,我们借助一个例子来理解。设输入数据大小为 <span class="arithmatex">\(n\)</span> ,给定三个算法 <code>A</code> , <code>B</code> , <code>C</code></p>
<ul>
@ -2111,7 +2111,7 @@
<p><strong>时间复杂度可以有效评估算法效率</strong>。算法 <code>B</code> 运行时间的增长是线性的,在 <span class="arithmatex">\(n &gt; 1\)</span> 时慢于算法 <code>A</code> ,在 <span class="arithmatex">\(n &gt; 1000000\)</span> 时慢于算法 <code>C</code> 。实质上,只要输入数据大小 <span class="arithmatex">\(n\)</span> 足够大,复杂度为「常数阶」的算法一定优于「线性阶」的算法,这也正是时间增长趋势的含义。</p>
<p><strong>时间复杂度的推算方法更加简便</strong>。在时间复杂度分析中,我们可以将统计「计算操作的运行时间」简化为统计「计算操作的数量」,这是因为,无论是运行平台还是计算操作类型,都与算法运行时间的增长趋势无关。因而,我们可以简单地将所有计算操作的执行时间统一看作是相同的“单位时间”,这样的简化做法大大降低了估算难度。</p>
<p><strong>时间复杂度也存在一定的局限性</strong>。比如,虽然算法 <code>A</code><code>C</code> 的时间复杂度相同,但是实际的运行时间有非常大的差别。再比如,虽然算法 <code>B</code><code>C</code> 的时间复杂度要更高,但在输入数据大小 <span class="arithmatex">\(n\)</span> 比较小时,算法 <code>B</code> 是要明显优于算法 <code>C</code> 的。对于以上情况,我们很难仅凭时间复杂度来判定算法效率高低。然而,即使存在这些问题,计算复杂度仍然是评判算法效率的最有效且常用的方法。</p>
<h2 id="223">2.2.3. 函数渐近上界<a class="headerlink" href="#223" title="Permanent link">&para;</a></h2>
<h2 id="223">2.2.3. &nbsp; 函数渐近上界<a class="headerlink" href="#223" title="Permanent link">&para;</a></h2>
<p>设算法「计算操作数量」为 <span class="arithmatex">\(T(n)\)</span> ,其是一个关于输入数据大小 <span class="arithmatex">\(n\)</span> 的函数。例如,以下算法的操作数量为</p>
<div class="arithmatex">\[
T(n) = 3 + 2n
@ -2254,7 +2254,7 @@ $$</p>
<p class="admonition-title">Tip</p>
<p>渐近上界的数学味儿有点重,如果你感觉没有完全理解,无需担心,因为在实际使用中我们只需要会推算即可,数学意义可以慢慢领悟。</p>
</div>
<h2 id="224">2.2.4. 推算方法<a class="headerlink" href="#224" title="Permanent link">&para;</a></h2>
<h2 id="224">2.2.4. &nbsp; 推算方法<a class="headerlink" href="#224" title="Permanent link">&para;</a></h2>
<p>推算出 <span class="arithmatex">\(f(n)\)</span> 后,我们就得到时间复杂度 <span class="arithmatex">\(O(f(n))\)</span> 。那么,如何来确定渐近上界 <span class="arithmatex">\(f(n)\)</span> 呢?总体分为两步,首先「统计操作数量」,然后「判断渐近上界」。</p>
<h3 id="1">1) 统计操作数量<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3>
<p>对着代码,从上到下一行一行地计数即可。然而,<strong>由于上述 <span class="arithmatex">\(c \cdot f(n)\)</span> 中的常数项 <span class="arithmatex">\(c\)</span> 可以取任意大小,因此操作数量 <span class="arithmatex">\(T(n)\)</span> 中的各种系数、常数项都可以被忽略</strong>。根据此原则,可以总结出以下计数偷懒技巧:</p>
@ -2468,7 +2468,7 @@ T(n) &amp; = n^2 + n &amp; \text{偷懒统计 (o.O)}
</tbody>
</table>
</div>
<h2 id="225">2.2.5. 常见类型<a class="headerlink" href="#225" title="Permanent link">&para;</a></h2>
<h2 id="225">2.2.5. &nbsp; 常见类型<a class="headerlink" href="#225" title="Permanent link">&para;</a></h2>
<p>设输入数据大小为 <span class="arithmatex">\(n\)</span> ,常见的时间复杂度类型有(从低到高排列)</p>
<div class="arithmatex">\[
\begin{aligned}
@ -3898,7 +3898,7 @@ n! = n \times (n - 1) \times (n - 2) \times \cdots \times 2 \times 1
<p><img alt="time_complexity_factorial" src="../time_complexity.assets/time_complexity_factorial.png" /></p>
<p align="center"> Fig. 阶乘阶的时间复杂度 </p>
<h2 id="226">2.2.6. 最差、最佳、平均时间复杂度<a class="headerlink" href="#226" title="Permanent link">&para;</a></h2>
<h2 id="226">2.2.6. &nbsp; 最差、最佳、平均时间复杂度<a class="headerlink" href="#226" title="Permanent link">&para;</a></h2>
<p><strong>某些算法的时间复杂度不是恒定的,而是与输入数据的分布有关</strong>。举一个例子,输入一个长度为 <span class="arithmatex">\(n\)</span> 数组 <code>nums</code> ,其中 <code>nums</code> 由从 <span class="arithmatex">\(1\)</span><span class="arithmatex">\(n\)</span> 的数字组成,但元素顺序是随机打乱的;算法的任务是返回元素 <span class="arithmatex">\(1\)</span> 的索引。我们可以得出以下结论:</p>
<ul>
<li><code>nums = [?, ?, ..., 1]</code>,即当末尾元素是 <span class="arithmatex">\(1\)</span> 时,则需完整遍历数组,此时达到 <strong>最差时间复杂度 <span class="arithmatex">\(O(n)\)</span></strong> </li>
@ -4278,7 +4278,7 @@ n! = n \times (n - 1) \times (n - 2) \times \cdots \times 2 \times 1
<nav class="md-footer__inner md-grid" aria-label="页脚" >
<a href="../performance_evaluation/" class="md-footer__link md-footer__link--prev" aria-label="上一页: 2.1. 算法效率评估" rel="prev">
<a href="../performance_evaluation/" class="md-footer__link md-footer__link--prev" aria-label="上一页: 2.1. &amp;nbsp; 算法效率评估" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
@ -4287,20 +4287,20 @@ n! = n \times (n - 1) \times (n - 2) \times \cdots \times 2 \times 1
<span class="md-footer__direction">
上一页
</span>
2.1. 算法效率评估
2.1. &nbsp; 算法效率评估
</div>
</div>
</a>
<a href="../space_complexity/" class="md-footer__link md-footer__link--next" aria-label="下一页: 2.3. 空间复杂度" rel="next">
<a href="../space_complexity/" class="md-footer__link md-footer__link--next" aria-label="下一页: 2.3. &amp;nbsp; 空间复杂度" rel="next">
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
下一页
</span>
2.3. 空间复杂度
2.3. &nbsp; 空间复杂度
</div>
</div>
<div class="md-footer__button md-icon">