mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-28 19:07:14 +00:00
deploy
This commit is contained in:
@@ -3509,7 +3509,7 @@
|
||||
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">nums</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
|
||||
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a> <span class="c1"># 循环,当搜索区间为空时跳出(当 i > j 时为空)</span>
|
||||
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a> <span class="k">while</span> <span class="n">i</span> <span class="o"><=</span> <span class="n">j</span><span class="p">:</span>
|
||||
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a> <span class="c1"># 理论上 Python 的数字可以无限大(取决于内存大小),无需考虑大数越界问题</span>
|
||||
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a> <span class="c1"># 理论上 Python 的数字可以无限大(取决于内存大小),无须考虑大数越界问题</span>
|
||||
<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a> <span class="n">m</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="n">j</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span> <span class="c1"># 计算中点索引 m</span>
|
||||
<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a> <span class="k">if</span> <span class="n">nums</span><span class="p">[</span><span class="n">m</span><span class="p">]</span> <span class="o"><</span> <span class="n">target</span><span class="p">:</span>
|
||||
<a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a> <span class="n">i</span> <span class="o">=</span> <span class="n">m</span> <span class="o">+</span> <span class="mi">1</span> <span class="c1"># 此情况说明 target 在区间 [m+1, j] 中</span>
|
||||
@@ -3996,7 +3996,7 @@
|
||||
<p>二分查找在时间和空间方面都有较好的性能:</p>
|
||||
<ul>
|
||||
<li>二分查找的时间效率高。在大数据量下,对数阶的时间复杂度具有显著优势。例如,当数据大小 <span class="arithmatex">\(n = 2^{20}\)</span> 时,线性查找需要 <span class="arithmatex">\(2^{20} = 1048576\)</span> 轮循环,而二分查找仅需 <span class="arithmatex">\(\log_2 2^{20} = 20\)</span> 轮循环。</li>
|
||||
<li>二分查找无需额外空间。相较于需要借助额外空间的搜索算法(例如哈希查找),二分查找更加节省空间。</li>
|
||||
<li>二分查找无须额外空间。相较于需要借助额外空间的搜索算法(例如哈希查找),二分查找更加节省空间。</li>
|
||||
</ul>
|
||||
<p>然而,二分查找并非适用于所有情况,原因如下:</p>
|
||||
<ul>
|
||||
|
||||
@@ -3726,7 +3726,7 @@
|
||||
|
||||
<p>代码在此省略,值得注意的有:</p>
|
||||
<ul>
|
||||
<li>给定数组不包含小数,这意味着我们无需关心如何处理相等的情况。</li>
|
||||
<li>给定数组不包含小数,这意味着我们无须关心如何处理相等的情况。</li>
|
||||
<li>因为该方法引入了小数,所以需要将函数中的变量 <code>target</code> 改为浮点数类型。</li>
|
||||
</ul>
|
||||
|
||||
|
||||
@@ -3439,7 +3439,7 @@
|
||||
<li>「线性搜索」适用于数组和链表等线性数据结构。它从数据结构的一端开始,逐个访问元素,直到找到目标元素或到达另一端仍没有找到目标元素为止。</li>
|
||||
<li>「广度优先搜索」和「深度优先搜索」是图和树的两种遍历策略。广度优先搜索从初始节点开始逐层搜索,由近及远地访问各个节点。深度优先搜索是从初始节点开始,沿着一条路径走到头为止,再回溯并尝试其他路径,直到遍历完整个数据结构。</li>
|
||||
</ul>
|
||||
<p>暴力搜索的优点是简单且通用性好,<strong>无需对数据做预处理和借助额外的数据结构</strong>。</p>
|
||||
<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 自适应搜索<a class="headerlink" href="#1052" title="Permanent link">¶</a></h2>
|
||||
<p>自适应搜索利用数据的特有属性(例如有序性)来优化搜索过程,从而更高效地定位目标元素。</p>
|
||||
@@ -3522,7 +3522,7 @@
|
||||
<p>除了以上表格内容,搜索算法的选择还取决于数据体量、搜索性能要求、数据查询与更新频率等。</p>
|
||||
<p><strong>线性搜索</strong></p>
|
||||
<ul>
|
||||
<li>通用性较好,无需任何数据预处理操作。假如我们仅需查询一次数据,那么其他三种方法的数据预处理的时间比线性搜索的时间还要更长。</li>
|
||||
<li>通用性较好,无须任何数据预处理操作。假如我们仅需查询一次数据,那么其他三种方法的数据预处理的时间比线性搜索的时间还要更长。</li>
|
||||
<li>适用于体量较小的数据,此情况下时间复杂度对效率影响较小。</li>
|
||||
<li>适用于数据更新频率较高的场景,因为该方法不需要对数据进行任何额外维护。</li>
|
||||
</ul>
|
||||
|
||||
@@ -3348,10 +3348,10 @@
|
||||
<h1 id="106">10.6 小结<a class="headerlink" href="#106" title="Permanent link">¶</a></h1>
|
||||
<ul>
|
||||
<li>二分查找依赖于数据的有序性,通过循环逐步缩减一半搜索区间来实现查找。它要求输入数据有序,且仅适用于数组或基于数组实现的数据结构。</li>
|
||||
<li>暴力搜索通过遍历数据结构来定位数据。线性搜索适用于数组和链表,广度优先搜索和深度优先搜索适用于图和树。此类算法通用性好,无需对数据预处理,但时间复杂度 <span class="arithmatex">\(O(n)\)</span> 较高。</li>
|
||||
<li>暴力搜索通过遍历数据结构来定位数据。线性搜索适用于数组和链表,广度优先搜索和深度优先搜索适用于图和树。此类算法通用性好,无须对数据预处理,但时间复杂度 <span class="arithmatex">\(O(n)\)</span> 较高。</li>
|
||||
<li>哈希查找、树查找和二分查找属于高效搜索方法,可在特定数据结构中快速定位目标元素。此类算法效率高,时间复杂度可达 <span class="arithmatex">\(O(\log n)\)</span> 甚至 <span class="arithmatex">\(O(1)\)</span> ,但通常需要借助额外数据结构。</li>
|
||||
<li>实际中,我们需要对数据体量、搜索性能要求、数据查询和更新频率等因素进行具体分析,从而选择合适的搜索方法。</li>
|
||||
<li>线性搜索适用于小型或频繁更新的数据;二分查找适用于大型、排序的数据;哈希查找适合对查询效率要求较高且无需范围查询的数据;树查找适用于需要维护顺序和支持范围查询的大型动态数据。</li>
|
||||
<li>线性搜索适用于小型或频繁更新的数据;二分查找适用于大型、排序的数据;哈希查找适合对查询效率要求较高且无须范围查询的数据;树查找适用于需要维护顺序和支持范围查询的大型动态数据。</li>
|
||||
<li>用哈希查找替换线性查找是一种常用的优化运行时间的策略,可将时间复杂度从 <span class="arithmatex">\(O(n)\)</span> 降低至 <span class="arithmatex">\(O(1)\)</span> 。 </li>
|
||||
</ul>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user