This commit is contained in:
krahets
2023-08-19 22:07:27 +08:00
parent 71c7786f51
commit 2e27ad1680
99 changed files with 283 additions and 283 deletions
+3 -3
View File
@@ -2,7 +2,7 @@
comments: true
---
# 10.1.   二分查找
# 10.1   二分查找
「二分查找 Binary Search」是一种基于分治思想的高效搜索算法。它利用数据的有序性,每轮减少一半搜索范围,直至找到目标元素或搜索区间为空为止。
@@ -336,7 +336,7 @@ comments: true
空间复杂度为 $O(1)$ 。指针 `i` , `j` 使用常数大小空间。
## 10.1.1.   区间表示方法
## 10.1.1   区间表示方法
除了上述的双闭区间外,常见的区间表示还有“左闭右开”区间,定义为 $[0, n)$ ,即左边界包含自身,右边界不包含自身。在该表示下,区间 $[i, j]$ 在 $i = j$ 时为空。
@@ -631,7 +631,7 @@ comments: true
<p align="center"> 图:两种区间定义 </p>
## 10.1.2. &nbsp; 优点与局限性
## 10.1.2 &nbsp; 优点与局限性
二分查找在时间和空间方面都有较好的性能:
+3 -3
View File
@@ -3,9 +3,9 @@ comments: true
status: new
---
# 10.3. &nbsp; 二分查找边界
# 10.3 &nbsp; 二分查找边界
## 10.3.1. &nbsp; 查找左边界
## 10.3.1 &nbsp; 查找左边界
!!! question
@@ -150,7 +150,7 @@ status: new
[class]{}-[func]{binary_search_left_edge}
```
## 10.3.2. &nbsp; 查找右边界
## 10.3.2 &nbsp; 查找右边界
那么如何查找最右一个 `target` 呢?最直接的方式是修改代码,替换在 `nums[m] == target` 情况下的指针收缩操作。代码在此省略,有兴趣的同学可以自行实现。
+3 -3
View File
@@ -3,11 +3,11 @@ comments: true
status: new
---
# 10.2. &nbsp; 二分查找插入点
# 10.2 &nbsp; 二分查找插入点
二分查找不仅可用于搜索目标元素,还具有许多变种问题,比如搜索目标元素的插入位置。
## 10.2.1. &nbsp; 无重复元素的情况
## 10.2.1 &nbsp; 无重复元素的情况
!!! question
@@ -188,7 +188,7 @@ status: new
[class]{}-[func]{binary_search_insertion}
```
## 10.2.2. &nbsp; 存在重复元素的情况
## 10.2.2 &nbsp; 存在重复元素的情况
!!! question
+1 -1
View File
@@ -3,7 +3,7 @@ comments: true
icon: material/text-search
---
# 10. &nbsp; 搜索
# 第 10 章 &nbsp; 搜索
<div class="center-table" markdown>
@@ -2,7 +2,7 @@
comments: true
---
# 10.4. &nbsp; 哈希优化策略
# 10.4 &nbsp; 哈希优化策略
在算法题中,**我们常通过将线性查找替换为哈希查找来降低算法的时间复杂度**。我们借助一个算法题来加深理解。
@@ -10,7 +10,7 @@ comments: true
给定一个整数数组 `nums` 和一个目标元素 `target` ,请在数组中搜索“和”为 `target` 的两个元素,并返回它们的数组索引。返回任意一个解即可。
## 10.4.1. &nbsp; 线性查找:以时间换空间
## 10.4.1 &nbsp; 线性查找:以时间换空间
考虑直接遍历所有可能的组合。开启一个两层循环,在每轮中判断两个整数的和是否为 `target` ,若是,则返回它们的索引。
@@ -229,7 +229,7 @@ comments: true
此方法的时间复杂度为 $O(n^2)$ ,空间复杂度为 $O(1)$ ,在大数据量下非常耗时。
## 10.4.2. &nbsp; 哈希查找:以空间换时间
## 10.4.2 &nbsp; 哈希查找:以空间换时间
考虑借助一个哈希表,键值对分别为数组元素和元素索引。循环遍历数组,每轮执行:
@@ -2,7 +2,7 @@
comments: true
---
# 10.5. &nbsp; 重识搜索算法
# 10.5 &nbsp; 重识搜索算法
「搜索算法 Searching Algorithm」用于在数据结构(例如数组、链表、树或图)中搜索一个或一组满足特定条件的元素。
@@ -13,7 +13,7 @@ comments: true
不难发现,这些知识点都已在前面的章节中介绍过,因此搜索算法对于我们来说并不陌生。在本节中,我们将从更加系统的视角切入,重新审视搜索算法。
## 10.5.1. &nbsp; 暴力搜索
## 10.5.1 &nbsp; 暴力搜索
暴力搜索通过遍历数据结构的每个元素来定位目标元素。
@@ -24,7 +24,7 @@ comments: true
然而,**此类算法的时间复杂度为 $O(n)$** ,其中 $n$ 为元素数量,因此在数据量较大的情况下性能较差。
## 10.5.2. &nbsp; 自适应搜索
## 10.5.2 &nbsp; 自适应搜索
自适应搜索利用数据的特有属性(例如有序性)来优化搜索过程,从而更高效地定位目标元素。
@@ -40,7 +40,7 @@ comments: true
自适应搜索算法常被称为查找算法,**主要关注在特定数据结构中快速检索目标元素**。
## 10.5.3. &nbsp; 搜索方法选取
## 10.5.3 &nbsp; 搜索方法选取
给定大小为 $n$ 的一组数据,我们可以使用线性搜索、二分查找、树查找、哈希查找等多种方法在该数据中搜索目标元素。各个方法的工作原理如下图所示。
+1 -1
View File
@@ -2,7 +2,7 @@
comments: true
---
# 10.6. &nbsp; 小结
# 10.6 &nbsp; 小结
- 二分查找依赖于数据的有序性,通过循环逐步缩减一半搜索区间来实现查找。它要求输入数据有序,且仅适用于数组或基于数组实现的数据结构。
- 暴力搜索通过遍历数据结构来定位数据。线性搜索适用于数组和链表,广度优先搜索和深度优先搜索适用于图和树。此类算法通用性好,无需对数据预处理,但时间复杂度 $O(n)$ 较高。