Add the chapter of searching.

This commit is contained in:
krahets 2022-11-20 02:03:26 +08:00
parent 90634cef97
commit f6ad1411f4
5 changed files with 154 additions and 10 deletions

View file

@ -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/).

View 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);
}
}

View 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);
}
}

View 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);
}
}

View file

@ -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