mirror of
https://github.com/krahets/hello-algo.git
synced 2025-07-24 10:14:44 +08:00
deploy
This commit is contained in:
@ -1795,35 +1795,35 @@
|
||||
|
||||
<h1 id="21">2.1. 算法效率评估<a class="headerlink" href="#21" title="Permanent link">¶</a></h1>
|
||||
<h2 id="211">2.1.1. 算法评价维度<a class="headerlink" href="#211" title="Permanent link">¶</a></h2>
|
||||
<p>在开始学习算法之前,我们首先要想清楚算法的设计目标是什么,或者说,如何来评判算法的好与坏。整体上看,我们设计算法时追求两个层面的目标。</p>
|
||||
<p>在开始学习算法之前,我们首先需要明确算法的设计目标,换句话说,我们应该如何评判算法的优劣。从总体上看,算法设计追求以下两个层面的目标:</p>
|
||||
<ol>
|
||||
<li><strong>找到问题解法</strong>。算法需要能够在规定的输入范围下,可靠地求得问题的正确解。</li>
|
||||
<li><strong>寻求最优解法</strong>。同一个问题可能存在多种解法,而我们希望算法效率尽可能的高。</li>
|
||||
<li><strong>找到问题解法</strong>。算法需要在规定的输入范围内,可靠地求得问题的正确解。</li>
|
||||
<li><strong>寻求最优解法</strong>。同一个问题可能存在多种解法,我们希望找到尽可能高效的算法。</li>
|
||||
</ol>
|
||||
<p>换言之,在可以解决问题的前提下,算法效率则是主要评价维度,包括:</p>
|
||||
<p>因此,在能够解决问题的前提下,算法效率成为主要的评价维度,主要包括:</p>
|
||||
<ul>
|
||||
<li><strong>时间效率</strong>,即算法的运行速度的快慢。</li>
|
||||
<li><strong>空间效率</strong>,即算法占用的内存空间大小。</li>
|
||||
<li><strong>时间效率</strong>,即算法运行速度的快慢。</li>
|
||||
<li><strong>空间效率</strong>,即算法占用内存空间的大小。</li>
|
||||
</ul>
|
||||
<p>数据结构与算法追求“运行速度快、占用内存少”,而如何去评价算法效率则是非常重要的问题,因为只有知道如何评价算法,才能去做算法之间的对比分析,以及优化算法设计。</p>
|
||||
<p>数据结构与算法的终极目标是“又快又省”。了解如何评估算法效率非常重要,因为只有掌握了评价方法,我们才能进行算法间的对比分析,从而指导算法设计与优化。</p>
|
||||
<h2 id="212">2.1.2. 效率评估方法<a class="headerlink" href="#212" title="Permanent link">¶</a></h2>
|
||||
<h3 id="_1">实际测试<a class="headerlink" href="#_1" title="Permanent link">¶</a></h3>
|
||||
<p>假设我们现在有算法 A 和 算法 B ,都能够解决同一问题,现在需要对比两个算法之间的效率。我们能够想到的最直接的方式,就是找一台计算机,把两个算法都完整跑一遍,并监控记录运行时间和内存占用情况。这种评估方式能够反映真实情况,但是也存在很大的硬伤。</p>
|
||||
<p><strong>难以排除测试环境的干扰因素</strong>。硬件配置会影响到算法的性能表现。例如,在某台计算机中,算法 A 比算法 B 运行时间更短;但换到另一台配置不同的计算机中,可能会得到相反的测试结果。这意味着我们需要在各种机器上展开测试,而这是不现实的。</p>
|
||||
<p><strong>展开完整测试非常耗费资源</strong>。随着输入数据量的大小变化,算法会呈现出不同的效率表现。比如,有可能输入数据量较小时,算法 A 运行时间短于算法 B ,而在输入数据量较大时,测试结果截然相反。因此,若想要达到具有说服力的对比结果,那么需要输入各种体量数据,这样的测试需要占用大量计算资源。</p>
|
||||
<p>假设我们现在有算法 A 和算法 B,它们都能解决同一问题,现在需要对比这两个算法的效率。我们最直接的方法就是找一台计算机,运行这两个算法,并监控记录它们的运行时间和内存占用情况。这种评估方式能够反映真实情况,但也存在较大局限性。</p>
|
||||
<p><strong>难以排除测试环境的干扰因素</strong>。硬件配置会影响算法的性能表现。例如,在某台计算机中,算法 A 的运行时间比算法 B 短;但在另一台配置不同的计算机中,我们可能得到相反的测试结果。这意味着我们需要在各种机器上进行测试,而这是不现实的。</p>
|
||||
<p><strong>展开完整测试非常耗费资源</strong>。随着输入数据量的变化,算法会表现出不同的效率。例如,输入数据量较小时,算法 A 的运行时间可能短于算法 B;而输入数据量较大时,测试结果可能相反。因此,为了得到有说服力的结论,我们需要测试各种规模的输入数据,这样需要占用大量的计算资源。</p>
|
||||
<h3 id="_2">理论估算<a class="headerlink" href="#_2" title="Permanent link">¶</a></h3>
|
||||
<p>既然实际测试具有很大的局限性,那么我们是否可以仅通过一些计算,就获知算法的效率水平呢?答案是肯定的,我们将此估算方法称为「复杂度分析 Complexity Analysis」或「渐近复杂度分析 Asymptotic Complexity Analysis」。</p>
|
||||
<p><strong>复杂度分析评估的是算法运行效率随着输入数据量增多时的增长趋势</strong>。这句话有些拗口,我们可以将其分为三个重点来理解:</p>
|
||||
<p>由于实际测试具有较大的局限性,我们可以考虑仅通过一些计算来评估算法的效率。这种估算方法被称为「复杂度分析 Complexity Analysis」或「渐近复杂度分析 Asymptotic Complexity Analysis」。</p>
|
||||
<p><strong>复杂度分析评估的是算法运行效率随着输入数据量增多时的增长趋势</strong>。这个定义有些拗口,我们可以将其分为三个重点来理解:</p>
|
||||
<ul>
|
||||
<li>“算法运行效率”可分为“运行时间”和“占用空间”,进而可将复杂度分为「时间复杂度 Time Complexity」和「空间复杂度 Space Complexity」。</li>
|
||||
<li>“随着输入数据量增多时”代表复杂度与输入数据量有关,反映算法运行效率与输入数据量之间的关系;</li>
|
||||
<li>“增长趋势”表示复杂度分析不关心算法具体使用了多少时间或占用了多少空间,而是给出一种“趋势性分析”;</li>
|
||||
<li>“算法运行效率”可分为“运行时间”和“占用空间”,因此我们可以将复杂度分为「时间复杂度 Time Complexity」和「空间复杂度 Space Complexity」;</li>
|
||||
<li>“随着输入数据量增多时”表示复杂度与输入数据量有关,反映了算法运行效率与输入数据量之间的关系;</li>
|
||||
<li>“增长趋势”表示复杂度分析关注的是算法时间与空间的增长趋势,而非具体的运行时间或占用空间;</li>
|
||||
</ul>
|
||||
<p><strong>复杂度分析克服了实际测试方法的弊端</strong>。一是独立于测试环境,分析结果适用于所有运行平台。二是可以体现不同数据量下的算法效率,尤其是可以反映大数据量下的算法性能。</p>
|
||||
<p>如果感觉对复杂度分析的概念一知半解,无需担心,后续章节会展开介绍。</p>
|
||||
<p><strong>复杂度分析克服了实际测试方法的弊端</strong>。首先,它独立于测试环境,因此分析结果适用于所有运行平台。其次,它可以体现不同数据量下的算法效率,尤其是在大数据量下的算法性能。</p>
|
||||
<p>如果你对复杂度分析的概念仍感到困惑,无需担心,我们会在后续章节详细介绍。</p>
|
||||
<h2 id="213">2.1.3. 复杂度分析重要性<a class="headerlink" href="#213" title="Permanent link">¶</a></h2>
|
||||
<p>复杂度分析给出一把评价算法效率的“标尺”,告诉我们执行某个算法需要多少时间和空间资源,也让我们可以开展不同算法之间的效率对比。</p>
|
||||
<p>复杂度是个数学概念,对于初学者可能比较抽象,学习难度相对较高。从这个角度出发,其并不适合作为第一章内容。但是,当我们讨论某个数据结构或者算法的特点时,难以避免需要分析它的运行速度和空间使用情况。<strong>因此,在展开学习数据结构与算法之前,建议读者先对复杂度建立起初步的了解,并且能够完成简单案例的复杂度分析</strong>。</p>
|
||||
<p>复杂度分析为我们提供了一把评估算法效率的“标尺”,告诉我们执行某个算法所需的时间和空间资源,并使我们能够对比不同算法之间的效率。</p>
|
||||
<p>复杂度是个数学概念,对于初学者可能比较抽象,学习难度相对较高。从这个角度看,复杂度分析可能不太适合作为第一章的内容。然而,当我们讨论某个数据结构或算法的特点时,我们难以避免要分析其运行速度和空间使用情况。<strong>因此,在深入学习数据结构与算法之前,建议读者先对复杂度建立初步的了解,并能够完成简单案例的复杂度分析</strong>。</p>
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user