This commit is contained in:
krahets
2023-09-22 13:08:10 +08:00
parent 5bb9f76fbc
commit 6fffa33695
107 changed files with 2561 additions and 19178 deletions
@@ -60,7 +60,18 @@
</head>
<link href="../../assets/stylesheets/glightbox.min.css" rel="stylesheet"/><style>
html.glightbox-open { overflow: initial; height: 100%; }
.gslide-title { margin-top: 0px; user-select: text; }
.gslide-desc { color: #666; user-select: text; }
.gslide-image img { background: white; }
.gscrollbar-fixer { padding-right: 15px; }
.gdesc-inner { font-size: 0.75rem; }
body[data-md-color-scheme="slate"] .gdesc-inner { background: var(--md-default-bg-color);}
body[data-md-color-scheme="slate"] .gslide-title { color: var(--md-default-fg-color);}
body[data-md-color-scheme="slate"] .gslide-desc { color: var(--md-default-fg-color);}
</style> <script src="../../assets/javascripts/glightbox.min.js"></script></head>
@@ -2000,14 +2011,6 @@
10.2 &nbsp; 二分查找插入点
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2028,14 +2031,6 @@
10.3 &nbsp; 二分查找边界
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2455,14 +2450,6 @@
第 12 章 &nbsp; 分治
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
@@ -2494,14 +2481,6 @@
12.1 &nbsp; 分治算法
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2522,14 +2501,6 @@
12.2 &nbsp; 分治搜索策略
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2550,14 +2521,6 @@
12.3 &nbsp; 构建树问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2578,14 +2541,6 @@
12.4 &nbsp; 汉诺塔问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2606,14 +2561,6 @@
12.5 &nbsp; 小结
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2845,14 +2792,6 @@
第 14 章 &nbsp; 动态规划
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
@@ -2884,14 +2823,6 @@
14.1 &nbsp; 初探动态规划
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2912,14 +2843,6 @@
14.2 &nbsp; DP 问题特性
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2940,14 +2863,6 @@
14.3 &nbsp; DP 解题思路
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2968,14 +2883,6 @@
14.4 &nbsp; 0-1 背包问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2996,14 +2903,6 @@
14.5 &nbsp; 完全背包问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -3024,14 +2923,6 @@
14.6 &nbsp; 编辑距离问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -3052,14 +2943,6 @@
14.7 &nbsp; 小结
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -3118,14 +3001,6 @@
第 15 章 &nbsp; 贪心
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
@@ -3157,14 +3032,6 @@
15.1 &nbsp; 贪心算法
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -3185,14 +3052,6 @@
15.2 &nbsp; 分数背包问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -3213,14 +3072,6 @@
15.3 &nbsp; 最大容量问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -3241,14 +3092,6 @@
15.4 &nbsp; 最大切分乘积问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -3269,14 +3112,6 @@
15.5 &nbsp; 小结
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -3749,7 +3584,7 @@
</div>
</div>
<p>图 2-1 展示了该求和函数的流程框图。</p>
<p><img alt="求和函数的流程框图" src="../iteration_and_recursion.assets/iteration.png" /></p>
<p><a class="glightbox" href="../iteration_and_recursion.assets/iteration.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="求和函数的流程框图" src="../iteration_and_recursion.assets/iteration.png" /></a></p>
<p align="center"> 图 2-1 &nbsp; 求和函数的流程框图 </p>
<p>此求和函数的操作数量与输入数据大小 <span class="arithmatex">\(n\)</span> 成正比,或者说成“线性关系”。实际上,<strong>时间复杂度描述的就是这个“线性关系”</strong>。相关内容将会在下一节中详细介绍。</p>
@@ -4281,7 +4116,7 @@
</div>
</div>
<p>图 2-2 给出了该嵌套循环的流程框图。</p>
<p><img alt="嵌套循环的流程框图" src="../iteration_and_recursion.assets/nested_iteration.png" /></p>
<p><a class="glightbox" href="../iteration_and_recursion.assets/nested_iteration.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="嵌套循环的流程框图" src="../iteration_and_recursion.assets/nested_iteration.png" /></a></p>
<p align="center"> 图 2-2 &nbsp; 嵌套循环的流程框图 </p>
<p>在这种情况下,函数的操作数量与 <span class="arithmatex">\(n^2\)</span> 成正比,或者说算法运行时间和输入数据大小 <span class="arithmatex">\(n\)</span> 成“平方关系”。</p>
@@ -4450,7 +4285,7 @@
</div>
</div>
<p>图 2-3 展示了该函数的递归过程。</p>
<p><img alt="求和函数的递归过程" src="../iteration_and_recursion.assets/recursion_sum.png" /></p>
<p><a class="glightbox" href="../iteration_and_recursion.assets/recursion_sum.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="求和函数的递归过程" src="../iteration_and_recursion.assets/recursion_sum.png" /></a></p>
<p align="center"> 图 2-3 &nbsp; 求和函数的递归过程 </p>
<p>虽然从计算角度看,迭代与递归可以得到相同的结果,<strong>但它们代表了两种完全不同的思考和解决问题的范式</strong></p>
@@ -4470,7 +4305,7 @@
<li>递归调用函数会产生额外的开销。<strong>因此递归通常比循环的时间效率更低</strong></li>
</ul>
<p>如图 2-4 所示,在触发终止条件前,同时存在 <span class="arithmatex">\(n\)</span> 个未返回的递归函数,<strong>递归深度为 <span class="arithmatex">\(n\)</span></strong></p>
<p><img alt="递归调用深度" src="../iteration_and_recursion.assets/recursion_sum_depth.png" /></p>
<p><a class="glightbox" href="../iteration_and_recursion.assets/recursion_sum_depth.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="递归调用深度" src="../iteration_and_recursion.assets/recursion_sum_depth.png" /></a></p>
<p align="center"> 图 2-4 &nbsp; 递归调用深度 </p>
<p>在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出报错。</p>
@@ -4614,7 +4449,7 @@
<li><strong>普通递归</strong>:求和操作是在“归”的过程中执行的,每层返回后都要再执行一次求和操作。</li>
<li><strong>尾递归</strong>:求和操作是在“递”的过程中执行的,“归”的过程只需层层返回。</li>
</ul>
<p><img alt="尾递归过程" src="../iteration_and_recursion.assets/tail_recursion_sum.png" /></p>
<p><a class="glightbox" href="../iteration_and_recursion.assets/tail_recursion_sum.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="尾递归过程" src="../iteration_and_recursion.assets/tail_recursion_sum.png" /></a></p>
<p align="center"> 图 2-5 &nbsp; 尾递归过程 </p>
<div class="admonition tip">
@@ -4784,7 +4619,7 @@
</div>
</div>
<p>观察以上代码,我们在函数内递归调用了两个函数,<strong>这意味着从一个调用产生了两个调用分支</strong>。如图 2-6 所示,这样不断递归调用下去,最终将产生一个层数为 <span class="arithmatex">\(n\)</span> 的「递归树 recursion tree」。</p>
<p><img alt="斐波那契数列的递归树" src="../iteration_and_recursion.assets/recursion_tree.png" /></p>
<p><a class="glightbox" href="../iteration_and_recursion.assets/recursion_tree.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="斐波那契数列的递归树" src="../iteration_and_recursion.assets/recursion_tree.png" /></a></p>
<p align="center"> 图 2-6 &nbsp; 斐波那契数列的递归树 </p>
<p>本质上看,递归体现“将问题分解为更小子问题”的思维范式,这种分治策略是至关重要的。</p>
@@ -5110,10 +4945,15 @@ aria-label="页脚"
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2023 Krahets
Copyright &copy; 2022 - 2023 Krahets
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<!-- Social links -->
@@ -5182,5 +5022,5 @@ aria-label="页脚"
</body>
<script>document$.subscribe(() => {const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": false, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "none"});})</script></body>
</html>