This commit is contained in:
krahets
2023-08-24 17:47:31 +08:00
parent b70b7c9e75
commit e7d6347f09
113 changed files with 7243 additions and 555 deletions
@@ -18,7 +18,7 @@
<link rel="prev" href="../">
<link rel="next" href="../time_complexity/">
<link rel="next" href="../iteration_and_recursion/">
<link rel="icon" href="../../assets/images/favicon.png">
@@ -525,6 +525,8 @@
@@ -631,13 +633,6 @@
2.1.2 &nbsp; 理论估算
</a>
</li>
<li class="md-nav__item">
<a href="#213" class="md-nav__link">
2.1.3 &nbsp; 复杂度的重要性
</a>
</li>
</ul>
@@ -654,12 +649,32 @@
<li class="md-nav__item">
<a href="../iteration_and_recursion/" class="md-nav__link">
<span class="md-ellipsis">
2.2 &nbsp; 迭代与递归
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../time_complexity/" class="md-nav__link">
<span class="md-ellipsis">
2.2 &nbsp; 时间复杂度
2.3 &nbsp; 时间复杂度
</span>
@@ -679,7 +694,7 @@
<span class="md-ellipsis">
2.3 &nbsp; 空间复杂度
2.4 &nbsp; 空间复杂度
</span>
@@ -699,7 +714,7 @@
<span class="md-ellipsis">
2.4 &nbsp; 小结
2.5 &nbsp; 小结
</span>
@@ -3393,13 +3408,6 @@
2.1.2 &nbsp; 理论估算
</a>
</li>
<li class="md-nav__item">
<a href="#213" class="md-nav__link">
2.1.3 &nbsp; 复杂度的重要性
</a>
</li>
</ul>
@@ -3431,31 +3439,37 @@
<li><strong>找到问题解法</strong>:算法需要在规定的输入范围内,可靠地求得问题的正确解。</li>
<li><strong>寻求最优解法</strong>:同一个问题可能存在多种解法,我们希望找到尽可能高效的算法。</li>
</ol>
<p>因此,在能够解决问题的前提下,算法效率已成为衡量算法优劣的主要评价指标,它包括以下两个维度。</p>
<p>也就是说,在能够解决问题的前提下,算法效率衡量算法优劣的主要评价指标,它包括以下两个维度。</p>
<ul>
<li><strong>时间效率</strong>:算法运行速度的快慢。</li>
<li><strong>空间效率</strong>:算法占用内存空间的大小。</li>
</ul>
<p>简而言之,<strong>我们的目标是设计“既快又省”的数据结构与算法</strong>。而有效地评估算法效率至关重要,因为只有这样我们才能将各种算法进行对比,从而指导算法设计与优化过程。</p>
<p>效率评估方法主要分为两种:实际测试理论估算。</p>
<p>效率评估方法主要分为两种:实际测试理论估算。</p>
<h2 id="211">2.1.1 &nbsp; 实际测试<a class="headerlink" href="#211" title="Permanent link">&para;</a></h2>
<p>假设我们现在有算法 <code>A</code> 和算法 <code>B</code> ,它们都能解决同一问题,现在需要对比这两个算法的效率。最直接的方法是找一台计算机,运行这两个算法,并监控记录它们的运行时间和内存占用情况。这种评估方式能够反映真实情况,但也存在较大局限性。</p>
<p>一方面,<strong>难以排除测试环境的干扰因素</strong>。硬件配置会影响算法的性能表现。比如在某台计算机中,算法 <code>A</code> 的运行时间比算法 <code>B</code> 短;但在另一台配置不同的计算机中,我们可能得到相反的测试结果。这意味着我们需要在各种机器上进行测试,统计平均效率,而这是不现实的。</p>
<p>另一方面,<strong>展开完整测试非常耗费资源</strong>。随着输入数据量的变化,算法会表现出不同的效率。例如,在输入数据量较小时,算法 <code>A</code> 的运行时间比算法 <code>B</code> 更少;而输入数据量较大时,测试结果可能恰恰相反。因此,为了得到有说服力的结论,我们需要测试各种规模的输入数据,而这样需要耗费大量的计算资源。</p>
<h2 id="212">2.1.2 &nbsp; 理论估算<a class="headerlink" href="#212" title="Permanent link">&para;</a></h2>
<p>由于实际测试具有较大的局限性,我们可以考虑仅通过一些计算来评估算法的效率。这种估算方法被称为「渐近复杂度分析 asymptotic complexity analysis」,简称「复杂度分析」。</p>
<p>复杂度分析评估的是算法运行所需的时间空间资源<strong>它描述了随着输入数据大小的增加,算法所需时间空间的增长趋势</strong>。这个定义有些拗口,我们可以将其分为三个重点来理解。</p>
<ol>
<p>复杂度分析体现算法运行所需的时间空间资源与输入数据大小之间的关系。<strong>它描述了随着输入数据大小的增加,算法执行所需时间空间的增长趋势</strong>。这个定义有些拗口,我们可以将其分为三个重点来理解。</p>
<ul>
<li>“时间和空间资源”分别对应「时间复杂度 time complexity」和「空间复杂度 space complexity」。</li>
<li>“随着输入数据大小的增加”意味着复杂度反映了算法运行效率与输入数据体量之间的关系。</li>
<li>“增长趋势”表示复杂度分析关注的是算法时间与空间的增长趋势,而非具体的运行时间或占用空间</li>
</ol>
<p><strong>复杂度分析克服了实际测试方法的弊端</strong>。首先,它独立于测试环境,分析结果适用于所有运行平台。其次,它可以体现不同数据量下的算法效率,尤其是在大数据量下的算法性能</p>
<p>如果你对复杂度分析的概念仍感到困惑,无须担心,我们会在后续章节中详细介绍。</p>
<h2 id="213">2.1.3 &nbsp; 复杂度的重要性<a class="headerlink" href="#213" title="Permanent link">&para;</a></h2>
<p>复杂度分析为我们提供了一把评估算法效率的“标尺”,帮助我们衡量了执行某个算法所需的时间和空间资源,并使我们能够对比不同算法之间的效率</p>
<p>复杂度是个数学概念,对于初学者可能比较抽象,学习难度相对较高。从这个角度看,复杂度分析可能不太适合作为第 1 章的内容。</p>
<p>然而,当我们讨论某个数据结构或算法的特点时,难以避免要分析其运行速度和空间使用情况。因此,在深入学习数据结构与算法之前,<strong>建议你先对复杂度建立初步的了解,以便能够完成简单算法的复杂度分析</strong></p>
<li>时间和空间的增长趋势”表示复杂度分析关注的不是运行时间或占用空间的具体值,而是时间或空间增长的“快慢”</li>
</ul>
<p><strong>复杂度分析克服了实际测试方法的弊端</strong>,体现在以下两个方面</p>
<ul>
<li>它独立于测试环境,分析结果适用于所有运行平台。</li>
<li>它可以体现不同数据量下的算法效率,尤其是在大数据量下的算法性能</li>
</ul>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>如果你仍对复杂度的概念感到困惑,无须担心,我们会在后续章节中详细介绍。</p>
</div>
<p>复杂度分析为我们提供了一把评估算法效率的“标尺”,使我们可以衡量执行某个算法所需的时间和空间资源,对比不同算法之间的效率。</p>
<p>复杂度是个数学概念,对于初学者可能比较抽象,学习难度相对较高。从这个角度看,复杂度分析可能不太适合作为最先介绍的内容。然而,当我们讨论某个数据结构或算法的特点时,难以避免要分析其运行速度和空间使用情况。</p>
<p>综上所述,建议你在深入学习数据结构与算法之前,<strong>先对复杂度分析建立初步的了解,以便能够完成简单算法的复杂度分析</strong></p>
@@ -3551,13 +3565,13 @@
<a href="../time_complexity/" class="md-footer__link md-footer__link--next" aria-label="下一页: 2.2 &amp;nbsp; 时间复杂度" rel="next">
<a href="../iteration_and_recursion/" class="md-footer__link md-footer__link--next" aria-label="下一页: 2.2 &amp;nbsp; 迭代与递归" rel="next">
<div class="md-footer__title">
<span class="md-footer__direction">
下一页
</span>
<div class="md-ellipsis">
2.2 &nbsp; 时间复杂度
2.2 &nbsp; 迭代与递归
</div>
</div>
<div class="md-footer__button md-icon">