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