This commit is contained in:
krahets
2023-08-20 23:28:04 +08:00
parent 26a2e7f171
commit 47b7d6fd44
49 changed files with 161 additions and 162 deletions

View File

@ -3426,7 +3426,7 @@
<h1 id="105">10.5 &nbsp; 重识搜索算法<a class="headerlink" href="#105" title="Permanent link">&para;</a></h1>
<p>「搜索算法 Searching Algorithm」用于在数据结构例如数组、链表、树或图中搜索一个或一组满足特定条件的元素。</p>
<p>「搜索算法 searching algorithm」用于在数据结构例如数组、链表、树或图中搜索一个或一组满足特定条件的元素。</p>
<p>根据实现思路,搜索算法总体可分为两种:</p>
<ul>
<li><strong>通过遍历数据结构来定位目标元素</strong>,例如数组、链表、树和图的遍历等。</li>
@ -3436,17 +3436,17 @@
<h2 id="1051">10.5.1 &nbsp; 暴力搜索<a class="headerlink" href="#1051" title="Permanent link">&para;</a></h2>
<p>暴力搜索通过遍历数据结构的每个元素来定位目标元素。</p>
<ul>
<li>线性搜索适用于数组和链表等线性数据结构。它从数据结构的一端开始,逐个访问元素,直到找到目标元素或到达另一端仍没有找到目标元素为止。</li>
<li>广度优先搜索」和「深度优先搜索是图和树的两种遍历策略。广度优先搜索从初始节点开始逐层搜索,由近及远地访问各个节点。深度优先搜索是从初始节点开始,沿着一条路径走到头为止,再回溯并尝试其他路径,直到遍历完整个数据结构。</li>
<li>线性搜索适用于数组和链表等线性数据结构。它从数据结构的一端开始,逐个访问元素,直到找到目标元素或到达另一端仍没有找到目标元素为止。</li>
<li>广度优先搜索”和“深度优先搜索是图和树的两种遍历策略。广度优先搜索从初始节点开始逐层搜索,由近及远地访问各个节点。深度优先搜索是从初始节点开始,沿着一条路径走到头为止,再回溯并尝试其他路径,直到遍历完整个数据结构。</li>
</ul>
<p>暴力搜索的优点是简单且通用性好,<strong>无须对数据做预处理和借助额外的数据结构</strong></p>
<p>然而,<strong>此类算法的时间复杂度为 <span class="arithmatex">\(O(n)\)</span></strong> ,其中 <span class="arithmatex">\(n\)</span> 为元素数量,因此在数据量较大的情况下性能较差。</p>
<h2 id="1052">10.5.2 &nbsp; 自适应搜索<a class="headerlink" href="#1052" title="Permanent link">&para;</a></h2>
<p>自适应搜索利用数据的特有属性(例如有序性)来优化搜索过程,从而更高效地定位目标元素。</p>
<ul>
<li>二分查找利用数据的有序性实现高效查找,仅适用于数组。</li>
<li>哈希查找利用哈希表将搜索数据和目标数据建立为键值对映射,从而实现查询操作。</li>
<li>树查找在特定的树结构(例如二叉搜索树)中,基于比较节点值来快速排除节点,从而定位目标元素。</li>
<li>二分查找利用数据的有序性实现高效查找,仅适用于数组。</li>
<li>哈希查找利用哈希表将搜索数据和目标数据建立为键值对映射,从而实现查询操作。</li>
<li>树查找在特定的树结构(例如二叉搜索树)中,基于比较节点值来快速排除节点,从而定位目标元素。</li>
</ul>
<p>此类算法的优点是效率高,<strong>时间复杂度可达到 <span class="arithmatex">\(O(\log n)\)</span> 甚至 <span class="arithmatex">\(O(1)\)</span></strong></p>
<p>然而,<strong>使用这些算法往往需要对数据进行预处理</strong>。例如,二分查找需要预先对数组进行排序,哈希查找和树查找都需要借助额外的数据结构,维护这些数据结构也需要额外的时间和空间开支。</p>