<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[studypal]]></title> 
<atom:link href="https://blog.studypal.cn/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[一起努力学习吧！！]]></description>
<link>https://blog.studypal.cn/</link>
<language>zh-cn</language>

<item>
    <title>知识点讲解：算法的基本概念一文讲清</title>
    <link>https://blog.studypal.cn/post/21</link>
    <description><![CDATA[<h2>难点概览</h2>
<blockquote>
<p><strong>算法（Algorithm）</strong> 是对特定问题求解步骤的描述，是一个<strong>有穷的指令序列</strong>。</p>
<p></p>
<p>学这个概念时，关键不是背定义，而是理解：算法必须能在有限步骤内，把输入加工成符合要求的输出。</p>
</blockquote>
<p>这张教材截图讲的是“算法的基本概念”。它不是一道选择题，而是数据结构与算法学习中的基础知识点：先讲什么是算法，再讲一个有效算法必须具备的五个特性，最后说明评价一个好算法时要看哪些目标。</p>
<hr>
<h2>原图内容</h2>
<p><img src="https://blog.studypal.cn/content/uploadfile/202607/65631783004080.png" alt="算法基本概念教材截图"></p>
<p>截图中的重点可以归纳为三部分：</p>
<ol>
<li><strong>算法定义</strong>：对特定问题求解步骤的描述，是有穷的指令序列。</li>
<li><strong>算法五大特性</strong>：有穷性、确定性、可行性、输入、输出。</li>
<li><strong>好算法的评价目标</strong>：正确性、可读性、健壮性、高效率与低存储量需求。</li>
</ol>
<hr>
<h2>一句话理解算法</h2>
<blockquote>
<p><strong>算法就是“解决某个问题的一套有限步骤”。</strong></p>
</blockquote>
<p>比如“在数组中查找一个数”就是一个问题。可以设计这样的算法：</p>
<pre><code class="language-text">从第一个元素开始看；
如果等于目标值，就返回它的位置；
如果不等于，就继续看下一个；
直到找到目标值，或者全部看完。</code></pre>
<p>这就是一个算法，因为它有明确步骤，也会在有限次数后结束。</p>
<hr>
<h2>算法的定义拆解</h2>
<p>教材定义是：</p>
<blockquote>
<p>算法是对特定问题求解步骤的描述，是一个有穷的指令序列，其中每条指令表示一个或多个操作。</p>
</blockquote>
<p>这句话可以拆成四个关键词：</p>
<table>
<tr><th>关键词</th><th>含义</th><th>例子</th></tr>
<tr><td>特定问题</td><td>算法一定是为了解决某类问题</td><td>排序、查找、求最大值</td></tr>
<tr><td>求解步骤</td><td>不是只给结果，而是给过程</td><td>第一步比较，第二步交换</td></tr>
<tr><td>有穷</td><td>步骤不能无限执行</td><td>循环必须能结束</td></tr>
<tr><td>指令序列</td><td>每一步要能被执行</td><td>赋值、比较、加减、移动指针</td></tr>
</table>
<p>所以，算法不是一句“把数组排好序”这么简单，而是要说明<strong>怎样一步一步排好序</strong>。</p>
<hr>
<h2>五大特性之一：有穷性</h2>
<blockquote>
<p><strong>有穷性</strong>：算法必须在执行有限步之后结束，并且每一步都能在有限时间内完成。</p>
</blockquote>
<p>这说明算法不能无限循环。</p>
<p>例如下面这个逻辑就不是合格算法：</p>
<pre><code class="language-c">while (1) {
    // 一直执行，永远不结束
}</code></pre>
<p>除非循环内部有明确的退出条件，否则它无法在有限步骤内结束，不满足有穷性。</p>
<p>一个合格的线性查找算法通常会这样写：</p>
<pre><code class="language-c">for (int i = 0; i &lt; n; i++) {
    if (A[i] == k) {
        return i;
    }
}
return -1;</code></pre>
<p>最多检查 <code>n</code> 个元素，检查完就结束，因此满足有穷性。</p>
<hr>
<h2>五大特性之二：确定性</h2>
<blockquote>
<p><strong>确定性</strong>：算法中每条指令必须有明确含义；对于相同输入，只能产生相同输出。</p>
</blockquote>
<p>算法步骤不能含糊。</p>
<p>比如这句话就不够确定：</p>
<pre><code class="language-text">找一个差不多大的数。</code></pre>
<p>“差不多”没有明确标准，不同人可能理解不同。</p>
<p>更确定的写法应该是：</p>
<pre><code class="language-text">找出数组中第一个大于等于 60 的元素。</code></pre>
<p>这就有明确判断条件，计算机可以执行。</p>
<hr>
<h2>五大特性之三：可行性</h2>
<blockquote>
<p><strong>可行性</strong>：算法中描述的操作，都可以通过已经实现的基本运算执行有限次来完成。</p>
</blockquote>
<p>也就是说，算法不能写成现实中无法执行的魔法步骤。</p>
<p>例如：</p>
<pre><code class="language-text">一步得到所有可能答案中最优的那个。</code></pre>
<p>这不是可行步骤，因为它没有说明如何得到。</p>
<p>可行的算法应该把过程拆成基本操作，例如：</p>
<pre><code class="language-text">枚举每一种可能方案；
计算每种方案的代价；
记录当前最小代价；
遍历结束后输出最优方案。</code></pre>
<p>这样每一步都能由比较、赋值、循环等基本运算完成。</p>
<hr>
<h2>五大特性之四：输入</h2>
<blockquote>
<p><strong>输入</strong>：算法可以有零个或多个输入，这些输入取自某个特定对象的集合。</p>
</blockquote>
<p>注意：算法可以没有输入。</p>
<p>例如：</p>
<pre><code class="language-text">输出当前系统时间。</code></pre>
<p>这个算法不需要用户额外输入，也可以运行。</p>
<p>但大多数算法都有输入，比如：</p>
<table>
<tr><th>问题</th><th>输入</th></tr>
<tr><td>求最大值</td><td>一个数组</td></tr>
<tr><td>二分查找</td><td>有序数组、目标值</td></tr>
<tr><td>排序</td><td>一组待排序元素</td></tr>
<tr><td>求最短路径</td><td>图、起点、终点</td></tr>
</table>
<p>输入决定了算法处理的对象。</p>
<hr>
<h2>五大特性之五：输出</h2>
<blockquote>
<p><strong>输出</strong>：算法至少有一个输出，并且输出与输入之间存在某种特定关系。</p>
</blockquote>
<p>算法不能没有结果。</p>
<p>比如排序算法的输出是排好序的序列：</p>
<pre><code class="language-text">输入：3, 1, 2
输出：1, 2, 3</code></pre>
<p>查找算法的输出可以是元素位置：</p>
<pre><code class="language-text">输入：数组 A、目标值 k
输出：k 所在的位置；如果不存在，输出 -1</code></pre>
<p>输出必须和输入有关系，否则就不是在解决问题。</p>
<hr>
<h2>好算法的四个评价目标</h2>
<p>教材还提到：设计一个“好”的算法通常要满足以下目标。</p>
<table>
<tr><th>评价目标</th><th>含义</th><th>通俗理解</th></tr>
<tr><td>正确性</td><td>能够正确解决给定问题</td><td>结果必须对</td></tr>
<tr><td>可读性</td><td>结构清晰，便于理解和交流</td><td>人能看懂，方便维护</td></tr>
<tr><td>健壮性</td><td>对非法或异常输入能适当处理</td><td>不轻易崩溃</td></tr>
<tr><td>高效率与低存储量需求</td><td>时间效率高，空间占用少</td><td>跑得快，占内存少</td></tr>
</table>
<p>注意：这些目标之间有时会互相权衡。</p>
<p>例如，一个极致优化的算法可能速度很快，但代码难读；一个特别清晰的写法可能更适合教学，但效率不是最高。实际开发和考试分析时，要根据场景判断重点。</p>
<hr>
<h2>用“求数组最大值”串起来理解</h2>
<p>假设问题是：给定数组 <code>A</code>，找出其中最大值。</p>
<p>一个简单算法如下：</p>
<pre><code class="language-c">int max = A[0];
for (int i = 1; i &lt; n; i++) {
    if (A[i] &gt; max) {
        max = A[i];
    }
}
return max;</code></pre>
<p>它为什么是算法？</p>
<table>
<tr><th>特性</th><th>对应体现</th></tr>
<tr><td>有穷性</td><td>循环最多执行 <code>n-1</code> 次</td></tr>
<tr><td>确定性</td><td>每一步比较和赋值含义明确</td></tr>
<tr><td>可行性</td><td>只用到了比较、赋值、循环等基本操作</td></tr>
<tr><td>输入</td><td>输入是数组 <code>A</code> 和元素个数 <code>n</code></td></tr>
<tr><td>输出</td><td>输出数组中的最大值</td></tr>
</table>
<p>它是不是好算法？</p>
<table>
<tr><th>评价目标</th><th>分析</th></tr>
<tr><td>正确性</td><td>能找到最大值</td></tr>
<tr><td>可读性</td><td>逻辑清晰，容易理解</td></tr>
<tr><td>健壮性</td><td>如果考虑 <code>n &lt;= 0</code> 的情况会更完善</td></tr>
<tr><td>效率</td><td>时间复杂度 <code>O(n)</code>，额外空间 <code>O(1)</code></td></tr>
</table>
<hr>
<h2>常见误区</h2>
<table>
<tr><th>误区</th><th>正确理解</th></tr>
<tr><td>算法就是程序</td><td>算法是解决步骤，程序是算法的具体实现</td></tr>
<tr><td>算法一定要有输入</td><td>可以有零个或多个输入</td></tr>
<tr><td>算法可以没有输出</td><td>不可以，至少要有一个输出</td></tr>
<tr><td>步骤越多越详细就越好</td><td>步骤要明确且可执行，不是越啰嗦越好</td></tr>
<tr><td>只要结果正确就是好算法</td><td>还要考虑可读性、健壮性、效率和存储需求</td></tr>
</table>
<hr>
<h2>考试怎么问</h2>
<p>这个知识点常见考法包括：</p>
<ol>
<li>问算法的定义。</li>
<li>问算法的五个基本特性。</li>
<li>判断某个描述是否满足有穷性、确定性或可行性。</li>
<li>区分“算法必须有输入”和“算法必须有输出”。</li>
<li>问好算法的评价标准，尤其是时间效率和空间需求。</li>
</ol>
<p>重点记住：</p>
<blockquote>
<p><strong>算法可以没有输入，但必须有输出；可以循环，但必须有限结束。</strong></p>
</blockquote>
<hr>
<h2>一句话记忆</h2>
<blockquote>
<p><strong>算法 = 有穷步骤 + 明确指令 + 可执行操作 + 输入输出。</strong></p>
</blockquote>
<p>再记五大特性：</p>
<blockquote>
<p><strong>有穷、确定、可行、输入、输出。</strong></p>
</blockquote>
<hr>
<h2>自测题</h2>
<ol>
<li>算法是否必须有输入？</li>
<li>算法是否必须有输出？</li>
<li>“一直重复直到满意为止”是否满足确定性？</li>
<li>一个好算法只需要结果正确吗？</li>
</ol>
<p>&lt;details&gt;<br>
&lt;summary&gt;点击查看答案&lt;/summary&gt;</p>
<ol>
<li>不一定。算法可以有零个或多个输入。</li>
<li>必须。算法至少有一个输出。</li>
<li>不满足。“满意”没有明确标准，且可能无法有限结束。</li>
<li>不是。还要考虑可读性、健壮性、时间效率和空间需求。</li>
</ol>
<p>&lt;/details&gt;</p>]]></description>
    <pubDate>Thu, 02 Jul 2026 23:13:45 +0800</pubDate>
    <dc:creator>小明</dc:creator>
    <guid>https://blog.studypal.cn/post/21</guid>
</item>
</channel>
</rss>