This commit is contained in:
krahets
2023-05-21 19:29:51 +08:00
parent 2adbd1b856
commit 61055d21bd
83 changed files with 11043 additions and 13422 deletions

View File

@ -15,17 +15,17 @@
<link rel="canonical" href="https://www.hello-algo.com/chapter_searching/searching_algorithm_revisited/">
<link rel="prev" href="../../chapter_sorting/summary/">
<link rel="prev" href="../replace_linear_by_hashing/">
<link rel="next" href="../replace_linear_by_hashing/">
<link rel="next" href="../summary/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.4.2, mkdocs-material-9.1.6">
<title>12.1.   搜索算法New - Hello 算法</title>
<title>10.4.   重识搜索算法 - Hello 算法</title>
@ -79,7 +79,7 @@
<div data-md-component="skip">
<a href="#121" class="md-skip">
<a href="#104" class="md-skip">
跳转至
</a>
@ -113,7 +113,7 @@
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
12.1. &nbsp; 搜索算法New
10.4. &nbsp; 重识搜索算法
</span>
</div>
@ -865,17 +865,19 @@
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
6. &nbsp; &nbsp; 二分查找
6. &nbsp; &nbsp; 散列表
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
6. &nbsp; &nbsp; 二分查找
6. &nbsp; &nbsp; 散列表
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -885,8 +887,8 @@
<li class="md-nav__item">
<a href="../../chapter_binary_search/binary_search/" class="md-nav__link">
6.1. &nbsp; 二分查找
<a href="../../chapter_hashing/hash_map/" class="md-nav__link">
6.1. &nbsp; 哈希表
</a>
</li>
@ -899,8 +901,22 @@
<li class="md-nav__item">
<a href="../../chapter_binary_search/binary_search_edge/" class="md-nav__link">
6.2. &nbsp; 二分查找边界
<a href="../../chapter_hashing/hash_collision/" class="md-nav__link">
6.2. &nbsp; 哈希冲突处理
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_hashing/summary/" class="md-nav__link">
6.3. &nbsp; 小结
</a>
</li>
@ -938,17 +954,23 @@
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
7. &nbsp; &nbsp; 散列表
7. &nbsp; &nbsp;
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
7. &nbsp; &nbsp; 散列表
7. &nbsp; &nbsp;
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -958,8 +980,8 @@
<li class="md-nav__item">
<a href="../../chapter_hashing/hash_map/" class="md-nav__link">
7.1. &nbsp; 哈希表
<a href="../../chapter_tree/binary_tree/" class="md-nav__link">
7.1. &nbsp; 二叉树
</a>
</li>
@ -972,8 +994,8 @@
<li class="md-nav__item">
<a href="../../chapter_hashing/hash_collision/" class="md-nav__link">
7.2. &nbsp; 哈希冲突处理
<a href="../../chapter_tree/binary_tree_traversal/" class="md-nav__link">
7.2. &nbsp; 二叉树遍历
</a>
</li>
@ -986,8 +1008,50 @@
<li class="md-nav__item">
<a href="../../chapter_hashing/summary/" class="md-nav__link">
7.3. &nbsp; 小结
<a href="../../chapter_tree/array_representation_of_tree/" class="md-nav__link">
7.3. &nbsp; 二叉树数组表示
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_tree/binary_search_tree/" class="md-nav__link">
7.4. &nbsp; 二叉搜索树
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_tree/avl_tree/" class="md-nav__link">
7.5. &nbsp; AVL 树 *
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_tree/summary/" class="md-nav__link">
7.6. &nbsp; 小结
</a>
</li>
@ -1025,23 +1089,17 @@
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
8. &nbsp; &nbsp;
8. &nbsp; &nbsp;
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
8. &nbsp; &nbsp;
8. &nbsp; &nbsp;
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -1051,8 +1109,8 @@
<li class="md-nav__item">
<a href="../../chapter_tree/binary_tree/" class="md-nav__link">
8.1. &nbsp; 二叉树
<a href="../../chapter_heap/heap/" class="md-nav__link">
8.1. &nbsp;
</a>
</li>
@ -1065,8 +1123,8 @@
<li class="md-nav__item">
<a href="../../chapter_tree/binary_tree_traversal/" class="md-nav__link">
8.2. &nbsp; 二叉树遍历
<a href="../../chapter_heap/build_heap/" class="md-nav__link">
8.2. &nbsp; 建堆操作 *
</a>
</li>
@ -1079,50 +1137,8 @@
<li class="md-nav__item">
<a href="../../chapter_tree/array_representation_of_tree/" class="md-nav__link">
8.3. &nbsp; 二叉树数组表示
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_tree/binary_search_tree/" class="md-nav__link">
8.4. &nbsp; 二叉搜索树
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_tree/avl_tree/" class="md-nav__link">
8.5. &nbsp; AVL 树 *
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_tree/summary/" class="md-nav__link">
8.6. &nbsp; 小结
<a href="../../chapter_heap/summary/" class="md-nav__link">
8.3. &nbsp; 小结
</a>
</li>
@ -1160,17 +1176,19 @@
<label class="md-nav__link" for="__nav_10" id="__nav_10_label" tabindex="0">
9. &nbsp; &nbsp;
9. &nbsp; &nbsp;
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_10_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_10">
<span class="md-nav__icon md-icon"></span>
9. &nbsp; &nbsp;
9. &nbsp; &nbsp;
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -1180,8 +1198,8 @@
<li class="md-nav__item">
<a href="../../chapter_heap/heap/" class="md-nav__link">
9.1. &nbsp;
<a href="../../chapter_graph/graph/" class="md-nav__link">
9.1. &nbsp;
</a>
</li>
@ -1194,8 +1212,8 @@
<li class="md-nav__item">
<a href="../../chapter_heap/build_heap/" class="md-nav__link">
9.2. &nbsp; 建堆操作 *
<a href="../../chapter_graph/graph_operations/" class="md-nav__link">
9.2. &nbsp; 图基础操作
</a>
</li>
@ -1208,8 +1226,22 @@
<li class="md-nav__item">
<a href="../../chapter_heap/summary/" class="md-nav__link">
9.3. &nbsp; 小结
<a href="../../chapter_graph/graph_traversal/" class="md-nav__link">
9.3. &nbsp; 图的遍历
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_graph/summary/" class="md-nav__link">
9.4. &nbsp; 小结
</a>
</li>
@ -1228,16 +1260,18 @@
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_11" >
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_11" checked>
@ -1249,17 +1283,19 @@
<label class="md-nav__link" for="__nav_11" id="__nav_11_label" tabindex="0">
10. &nbsp; &nbsp;
10. &nbsp; &nbsp; 搜索算法
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_11_label" aria-expanded="false">
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_11_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_11">
<span class="md-nav__icon md-icon"></span>
10. &nbsp; &nbsp;
10. &nbsp; &nbsp; 搜索算法
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -1269,8 +1305,8 @@
<li class="md-nav__item">
<a href="../../chapter_graph/graph/" class="md-nav__link">
10.1. &nbsp;
<a href="../binary_search/" class="md-nav__link">
10.1. &nbsp; 二分查找New
</a>
</li>
@ -1283,8 +1319,8 @@
<li class="md-nav__item">
<a href="../../chapter_graph/graph_operations/" class="md-nav__link">
10.2. &nbsp; 图基础操作
<a href="../binary_search_edge/" class="md-nav__link">
10.2. &nbsp; 二分查找边界New
</a>
</li>
@ -1297,8 +1333,8 @@
<li class="md-nav__item">
<a href="../../chapter_graph/graph_traversal/" class="md-nav__link">
10.3. &nbsp; 图的遍历
<a href="../replace_linear_by_hashing/" class="md-nav__link">
10.3. &nbsp; 哈希优化策略
</a>
</li>
@ -1309,10 +1345,79 @@
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
10.4. &nbsp; 重识搜索算法
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
10.4. &nbsp; 重识搜索算法
</a>
<nav class="md-nav md-nav--secondary" aria-label="目录">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
目录
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#1041" class="md-nav__link">
10.4.1. &nbsp; 暴力搜索
</a>
</li>
<li class="md-nav__item">
<a href="#1042" class="md-nav__link">
10.4.2. &nbsp; 自适应搜索
</a>
</li>
<li class="md-nav__item">
<a href="#1043" class="md-nav__link">
10.4.3. &nbsp; 搜索方法选取
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../chapter_graph/summary/" class="md-nav__link">
10.4. &nbsp; 小结
<a href="../summary/" class="md-nav__link">
10.5. &nbsp; 小结
</a>
</li>
@ -1514,18 +1619,16 @@
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_13" checked>
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_13" >
@ -1538,14 +1641,14 @@
<label class="md-nav__link" for="__nav_13" id="__nav_13_label" tabindex="0">
12. &nbsp; &nbsp; 搜索算法
12. &nbsp; &nbsp; 回溯算法
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_13_label" aria-expanded="true">
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_13">
<span class="md-nav__icon md-icon"></span>
12. &nbsp; &nbsp; 搜索算法
12. &nbsp; &nbsp; 回溯算法
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -1553,79 +1656,10 @@
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
12.1. &nbsp; 搜索算法New
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
12.1. &nbsp; 搜索算法New
</a>
<nav class="md-nav md-nav--secondary" aria-label="目录">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
目录
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#1211" class="md-nav__link">
12.1.1. &nbsp; 暴力搜索
</a>
</li>
<li class="md-nav__item">
<a href="#1212" class="md-nav__link">
12.1.2. &nbsp; 自适应搜索
</a>
</li>
<li class="md-nav__item">
<a href="#1213" class="md-nav__link">
12.1.3. &nbsp; 搜索方法选取
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../replace_linear_by_hashing/" class="md-nav__link">
12.2. &nbsp; 哈希优化策略
<a href="../../chapter_backtracking/backtracking_algorithm/" class="md-nav__link">
12.1. &nbsp; 回溯算法New
</a>
</li>
@ -1638,8 +1672,22 @@
<li class="md-nav__item">
<a href="../summary/" class="md-nav__link">
12.3. &nbsp; 小结
<a href="../../chapter_backtracking/permutations_problem/" class="md-nav__link">
12.2. &nbsp; 全排列问题New
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_backtracking/n_queens_problem/" class="md-nav__link">
12.3. &nbsp; N 皇后问题New
</a>
</li>
@ -1675,19 +1723,17 @@
<label class="md-nav__link" for="__nav_14" id="__nav_14_label" tabindex="0">
13. &nbsp; &nbsp; 回溯算法
13. &nbsp; &nbsp; 附录
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_14_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_14">
<span class="md-nav__icon md-icon"></span>
13. &nbsp; &nbsp; 回溯算法
13. &nbsp; &nbsp; 附录
</label>
<ul class="md-nav__list" data-md-scrollfix>
@ -1697,8 +1743,8 @@
<li class="md-nav__item">
<a href="../../chapter_backtracking/backtracking_algorithm/" class="md-nav__link">
13.1. &nbsp; 回溯算法New
<a href="../../chapter_appendix/installation/" class="md-nav__link">
13.1. &nbsp; 编程环境安装
</a>
</li>
@ -1711,22 +1757,8 @@
<li class="md-nav__item">
<a href="../../chapter_backtracking/permutations_problem/" class="md-nav__link">
13.2. &nbsp; 全排列问题New
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_backtracking/n_queens_problem/" class="md-nav__link">
13.3. &nbsp; N 皇后问题New
<a href="../../chapter_appendix/contribution/" class="md-nav__link">
13.2. &nbsp; 一起参与创作
</a>
</li>
@ -1759,77 +1791,6 @@
<label class="md-nav__link" for="__nav_15" id="__nav_15_label" tabindex="0">
14. &nbsp; &nbsp; 附录
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_15_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_15">
<span class="md-nav__icon md-icon"></span>
14. &nbsp; &nbsp; 附录
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter_appendix/installation/" class="md-nav__link">
14.1. &nbsp; 编程环境安装
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_appendix/contribution/" class="md-nav__link">
14.2. &nbsp; 一起参与创作
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_16" >
@ -1842,8 +1803,8 @@
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_16_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_16">
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_15_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_15">
<span class="md-nav__icon md-icon"></span>
参考文献
</label>
@ -1884,22 +1845,22 @@
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#1211" class="md-nav__link">
12.1.1. &nbsp; 暴力搜索
<a href="#1041" class="md-nav__link">
10.4.1. &nbsp; 暴力搜索
</a>
</li>
<li class="md-nav__item">
<a href="#1212" class="md-nav__link">
12.1.2. &nbsp; 自适应搜索
<a href="#1042" class="md-nav__link">
10.4.2. &nbsp; 自适应搜索
</a>
</li>
<li class="md-nav__item">
<a href="#1213" class="md-nav__link">
12.1.3. &nbsp; 搜索方法选取
<a href="#1043" class="md-nav__link">
10.4.3. &nbsp; 搜索方法选取
</a>
</li>
@ -1927,10 +1888,10 @@
<h1 id="121">12.1. &nbsp; 搜索算法<a class="headerlink" href="#121" title="Permanent link">&para;</a></h1>
<h1 id="104">10.4. &nbsp; 搜索算法<a class="headerlink" href="#104" title="Permanent link">&para;</a></h1>
<p>「搜索算法 Searching Algorithm」用于在数据结构例如数组、链表、树或图中搜索一个或一组满足特定条件的元素。</p>
<p>我们已经学过数组、链表、树和图的遍历方法,也学过哈希表、二叉搜索树等可用于实现查询的复杂数据结构。因此,搜索算法对于我们来说并不陌生。在本节,我们将从更加系统的视角切入,重新审视搜索算法。</p>
<h2 id="1211">12.1.1. &nbsp; 暴力搜索<a class="headerlink" href="#1211" title="Permanent link">&para;</a></h2>
<h2 id="1041">10.4.1. &nbsp; 暴力搜索<a class="headerlink" href="#1041" title="Permanent link">&para;</a></h2>
<p>暴力搜索通过遍历数据结构的每个元素来定位目标元素。</p>
<ul>
<li>「线性搜索」适用于数组和链表等线性数据结构。它从数据结构的一端开始,逐个访问元素,直到找到目标元素或到达另一端仍没有找到目标元素为止。</li>
@ -1938,7 +1899,7 @@
</ul>
<p>暴力搜索的优点是简单且通用性好,<strong>无需对数据做预处理和借助额外的数据结构</strong></p>
<p>然而,<strong>此类算法的时间复杂度为 <span class="arithmatex">\(O(n)\)</span></strong> ,其中 <span class="arithmatex">\(n\)</span> 为元素数量,因此在数据量较大的情况下性能较差。</p>
<h2 id="1212">12.1.2. &nbsp; 自适应搜索<a class="headerlink" href="#1212" title="Permanent link">&para;</a></h2>
<h2 id="1042">10.4.2. &nbsp; 自适应搜索<a class="headerlink" href="#1042" title="Permanent link">&para;</a></h2>
<p>自适应搜索利用数据的特有属性(例如有序性)来优化搜索过程,从而更高效地定位目标元素。</p>
<ul>
<li>「二分查找」利用数据的有序性实现高效查找,仅适用于数组。</li>
@ -1951,7 +1912,7 @@
<p class="admonition-title">Note</p>
<p>自适应搜索算法常被称为查找算法,<strong>主要关注在特定数据结构中快速检索目标元素</strong></p>
</div>
<h2 id="1213">12.1.3. &nbsp; 搜索方法选取<a class="headerlink" href="#1213" title="Permanent link">&para;</a></h2>
<h2 id="1043">10.4.3. &nbsp; 搜索方法选取<a class="headerlink" href="#1043" title="Permanent link">&para;</a></h2>
<p>给定大小为 <span class="arithmatex">\(n\)</span> 的一组数据,我们可以使用线性搜索、二分查找、树查找、哈希查找等多种方法在该数据中搜索目标元素。各个方法的工作原理如下图所示。</p>
<p><img alt="多种搜索策略" src="../searching_algorithm_revisited.assets/searching_algorithms.png" /></p>
<p align="center"> Fig. 多种搜索策略 </p>
@ -2118,7 +2079,7 @@
<nav class="md-footer__inner md-grid" aria-label="页脚" >
<a href="../../chapter_sorting/summary/" class="md-footer__link md-footer__link--prev" aria-label="上一页: 11.9. &amp;nbsp; 小结" rel="prev">
<a href="../replace_linear_by_hashing/" class="md-footer__link md-footer__link--prev" aria-label="上一页: 10.3. &amp;nbsp; 哈希优化策略" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
@ -2127,20 +2088,20 @@
上一页
</span>
<div class="md-ellipsis">
11.9. &nbsp; 小结
10.3. &nbsp; 哈希优化策略
</div>
</div>
</a>
<a href="../replace_linear_by_hashing/" class="md-footer__link md-footer__link--next" aria-label="下一页: 12.2. &amp;nbsp; 哈希优化策略" rel="next">
<a href="../summary/" class="md-footer__link md-footer__link--next" aria-label="下一页: 10.5. &amp;nbsp; 小结" rel="next">
<div class="md-footer__title">
<span class="md-footer__direction">
下一页
</span>
<div class="md-ellipsis">
12.2. &nbsp; 哈希优化策略
10.5. &nbsp; 小结
</div>
</div>
<div class="md-footer__button md-icon">