mirror of
https://github.com/krahets/hello-algo.git
synced 2024-12-24 03:56:28 +08:00
Add the chapter of searching.
This commit is contained in:
parent
90634cef97
commit
f6ad1411f4
5 changed files with 154 additions and 10 deletions
|
@ -35,9 +35,10 @@ For full documentation visit [mkdocs.org](https://www.mkdocs.org).
|
|||
| 更新:二叉搜索树 | 2022-11-14 |
|
||||
| 更新:首页介绍 | 2022-11-15 |
|
||||
| 更新:关于本书</br>新增:如何使用本书</br>新增:一起参与创作 | 2022-11-16 |
|
||||
| 新增:查找算法 | 2022-11-19 |
|
||||
|
||||
## License
|
||||
|
||||
![cc_by-nc-sa](https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png)
|
||||
|
||||
The **texts, codes, images, photos, and videos** present on the website(book) is licensed under a [CC BY-NC-SA-4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/).
|
||||
The **texts, codes, images, photos, and videos** present on this work is licensed under [CC BY-NC-SA-4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/).
|
||||
|
|
52
codes/java/chapter_searching/binary_search.java
Normal file
52
codes/java/chapter_searching/binary_search.java
Normal file
|
@ -0,0 +1,52 @@
|
|||
package chapter_searching;
|
||||
|
||||
public class binary_search {
|
||||
/* 二分查找(双闭区间) */
|
||||
static int binarySearch(int[] nums, int target) {
|
||||
// 初始化双闭区间 [0, n-1] ,即 i, j 分别指向数组首元素、尾元素
|
||||
int i = 0, j = nums.length - 1;
|
||||
// 循环,当搜索区间为空时跳出(当 i > j 时为空)
|
||||
while (i <= j) {
|
||||
int m = (i + j) / 2; // 计算中点索引 m
|
||||
if (nums[m] < target) // 此情况说明 target 在区间 [m+1, j] 中
|
||||
i = m + 1;
|
||||
else if (nums[m] > target) // 此情况说明 target 在区间 [i, m-1] 中
|
||||
j = m - 1;
|
||||
else // 找到目标元素,返回其索引
|
||||
return m;
|
||||
}
|
||||
// 未找到目标元素,返回 -1
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* 二分查找(左闭右开) */
|
||||
static int binarySearch1(int[] nums, int target) {
|
||||
// 初始化左闭右开 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1
|
||||
int i = 0, j = nums.length;
|
||||
// 循环,当搜索区间为空时跳出(当 i = j 时为空)
|
||||
while (i < j) {
|
||||
int m = (i + j) / 2; // 计算中点索引 m
|
||||
if (nums[m] < target) // 此情况说明 target 在区间 [m+1, j) 中
|
||||
i = m + 1;
|
||||
else if (nums[m] > target) // 此情况说明 target 在区间 [i, m) 中
|
||||
j = m;
|
||||
else // 找到目标元素,返回其索引
|
||||
return m;
|
||||
}
|
||||
// 未找到目标元素,返回 -1
|
||||
return -1;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
int target = 6;
|
||||
int[] nums = { 1, 3, 6, 8, 12, 15, 23, 67, 70, 92 };
|
||||
|
||||
/* 二分查找(双闭区间) */
|
||||
int index = binarySearch(nums, target);
|
||||
System.out.println("目标元素 6 的索引 = " + index);
|
||||
|
||||
/* 二分查找(左闭右开) */
|
||||
index = binarySearch1(nums, target);
|
||||
System.out.println("目标元素 6 的索引 = " + index);
|
||||
}
|
||||
}
|
45
codes/java/chapter_searching/hashing_search.java
Normal file
45
codes/java/chapter_searching/hashing_search.java
Normal file
|
@ -0,0 +1,45 @@
|
|||
package chapter_searching;
|
||||
|
||||
import include.*;
|
||||
import java.util.*;
|
||||
|
||||
public class hashing_search {
|
||||
/* 哈希查找(数组) */
|
||||
static int hashingSearch(Map<Integer, Integer> map, int target) {
|
||||
// 哈希表的 key: 目标元素,value: 索引
|
||||
// 若哈希表中无此 key ,返回 -1
|
||||
return map.getOrDefault(target, -1);
|
||||
}
|
||||
|
||||
/* 哈希查找(链表) */
|
||||
static ListNode hashingSearch1(Map<Integer, ListNode> map, int target) {
|
||||
// 哈希表的 key: 目标结点值,value: 结点对象
|
||||
// 若哈希表中无此 key ,返回 -1
|
||||
return map.getOrDefault(target, null);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
int target = 3;
|
||||
|
||||
/* 哈希查找(数组) */
|
||||
int[] nums = { 1, 5, 3, 2, 4, 7, 5, 9, 10, 8 };
|
||||
// 初始化哈希表
|
||||
Map<Integer, Integer> map = new HashMap<>();
|
||||
for (int i = 0; i < nums.length; i++) {
|
||||
map.put(nums[i], i); // key: 元素,value: 索引
|
||||
}
|
||||
int index = hashingSearch(map, target);
|
||||
System.out.println("目标元素 3 的索引 = " + index);
|
||||
|
||||
/* 哈希查找(链表) */
|
||||
ListNode head = ListNode.arrToLinkedList(nums);
|
||||
// 初始化哈希表
|
||||
Map<Integer, ListNode> map1 = new HashMap<>();
|
||||
while (head != null) {
|
||||
map1.put(head.val, head); // key: 结点值,value: 结点
|
||||
head = head.next;
|
||||
}
|
||||
ListNode node = hashingSearch1(map1, target);
|
||||
System.out.println("目标结点值 3 的对应结点对象为 " + node);
|
||||
}
|
||||
}
|
45
codes/java/chapter_searching/linear_search.java
Normal file
45
codes/java/chapter_searching/linear_search.java
Normal file
|
@ -0,0 +1,45 @@
|
|||
package chapter_searching;
|
||||
|
||||
import include.*;
|
||||
|
||||
public class linear_search {
|
||||
|
||||
/* 线性查找(数组) */
|
||||
static int linearSearch(int[] nums, int target) {
|
||||
// 遍历数组
|
||||
for (int i = 0; i < nums.length; i++) {
|
||||
// 找到目标元素,返回其索引
|
||||
if (nums[i] == target)
|
||||
return i;
|
||||
}
|
||||
// 未找到目标元素,返回 -1
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* 线性查找(链表) */
|
||||
static ListNode linearSearch(ListNode head, int target) {
|
||||
// 遍历链表
|
||||
while (head != null) {
|
||||
// 找到目标结点,返回之
|
||||
if (head.val == target)
|
||||
return head;
|
||||
head = head.next;
|
||||
}
|
||||
// 未找到目标结点,返回 null
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
int target = 3;
|
||||
|
||||
/* 在数组中执行线性查找 */
|
||||
int[] nums = { 1, 5, 3, 2, 4, 7, 5, 9, 10, 8 };
|
||||
int index = linearSearch(nums, target);
|
||||
System.out.println("目标元素 3 的索引 = " + index);
|
||||
|
||||
/* 在链表中执行线性查找 */
|
||||
ListNode head = ListNode.arrToLinkedList(nums);
|
||||
ListNode node = linearSearch(head, target);
|
||||
System.out.println("目标结点值 3 的对应结点对象为 " + node);
|
||||
}
|
||||
}
|
19
mkdocs.yml
19
mkdocs.yml
|
@ -113,19 +113,19 @@ extra_css:
|
|||
|
||||
# Page tree
|
||||
nav:
|
||||
- 关于本书:
|
||||
- chapter_about/index.md
|
||||
- 如何使用本书: chapter_about/how_to_read.md
|
||||
- 编程环境安装: chapter_about/installation.md
|
||||
- 一起参与创作: chapter_about/contribution.md
|
||||
- License: chapter_about/license.md
|
||||
- 算法无处不在:
|
||||
- 前言:
|
||||
- chapter_introduction/index.md
|
||||
- 如何使用本书:
|
||||
- 算法学习建议: chapter_prerequisites/suggestions.md
|
||||
- 编程环境安装: chapter_prerequisites/installation.md
|
||||
- 一起参与创作: chapter_prerequisites/contribution.md
|
||||
- 算法是什么:
|
||||
- chapter_dsa_introduction/index.md
|
||||
- 计算复杂度:
|
||||
- 算法效率评估: chapter_computational_complexity/performance_evaluation.md
|
||||
- 时间复杂度: chapter_computational_complexity/time_complexity.md
|
||||
- 空间复杂度: chapter_computational_complexity/space_complexity.md
|
||||
- 权衡时间与空间: chapter_computational_complexity/space_time_tradeoff.md
|
||||
- 权衡时间与空间 *: chapter_computational_complexity/space_time_tradeoff.md
|
||||
- 小结: chapter_computational_complexity/summary.md
|
||||
- 数据结构简介:
|
||||
- 数据与内存: chapter_data_structure/data_and_memory.md
|
||||
|
@ -134,7 +134,7 @@ nav:
|
|||
- 数组与链表:
|
||||
- 数组(Array): chapter_array_and_linkedlist/array.md
|
||||
- 链表(LinkedList): chapter_array_and_linkedlist/linked_list.md
|
||||
- 列表(List): chapter_array_and_linkedlist/list.md
|
||||
- 列表(List)*: chapter_array_and_linkedlist/list.md
|
||||
- 小结: chapter_array_and_linkedlist/summary.md
|
||||
- 栈与队列:
|
||||
- 栈(Stack): chapter_stack_and_queue/stack.md
|
||||
|
@ -149,6 +149,7 @@ nav:
|
|||
- 查找算法:
|
||||
- 线性查找: chapter_searching/linear_search.md
|
||||
- 二分查找: chapter_searching/binary_search.md
|
||||
- 哈希查找: chapter_searching/hashing_search.md
|
||||
- 小结: chapter_searching/summary.md
|
||||
- 参考文献:
|
||||
- chapter_reference/index.md
|
Loading…
Reference in a new issue