From f6ad1411f451b0ac68059b00dacc078522d7292f Mon Sep 17 00:00:00 2001 From: krahets Date: Sun, 20 Nov 2022 02:03:26 +0800 Subject: [PATCH] Add the chapter of searching. --- README.md | 3 +- .../java/chapter_searching/binary_search.java | 52 +++++++++++++++++++ .../chapter_searching/hashing_search.java | 45 ++++++++++++++++ .../java/chapter_searching/linear_search.java | 45 ++++++++++++++++ mkdocs.yml | 19 +++---- 5 files changed, 154 insertions(+), 10 deletions(-) create mode 100644 codes/java/chapter_searching/binary_search.java create mode 100644 codes/java/chapter_searching/hashing_search.java create mode 100644 codes/java/chapter_searching/linear_search.java diff --git a/README.md b/README.md index 3a84b09c6..d36e38183 100644 --- a/README.md +++ b/README.md @@ -35,9 +35,10 @@ For full documentation visit [mkdocs.org](https://www.mkdocs.org). | 更新:二叉搜索树 | 2022-11-14 | | 更新:首页介绍 | 2022-11-15 | | 更新:关于本书
新增:如何使用本书
新增:一起参与创作 | 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/). diff --git a/codes/java/chapter_searching/binary_search.java b/codes/java/chapter_searching/binary_search.java new file mode 100644 index 000000000..c80db3c9b --- /dev/null +++ b/codes/java/chapter_searching/binary_search.java @@ -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); + } +} diff --git a/codes/java/chapter_searching/hashing_search.java b/codes/java/chapter_searching/hashing_search.java new file mode 100644 index 000000000..51f396eaa --- /dev/null +++ b/codes/java/chapter_searching/hashing_search.java @@ -0,0 +1,45 @@ +package chapter_searching; + +import include.*; +import java.util.*; + +public class hashing_search { + /* 哈希查找(数组) */ + static int hashingSearch(Map map, int target) { + // 哈希表的 key: 目标元素,value: 索引 + // 若哈希表中无此 key ,返回 -1 + return map.getOrDefault(target, -1); + } + + /* 哈希查找(链表) */ + static ListNode hashingSearch1(Map 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 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 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); + } +} diff --git a/codes/java/chapter_searching/linear_search.java b/codes/java/chapter_searching/linear_search.java new file mode 100644 index 000000000..7a68003c5 --- /dev/null +++ b/codes/java/chapter_searching/linear_search.java @@ -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); + } +} diff --git a/mkdocs.yml b/mkdocs.yml index 19b353865..902fb206b 100644 --- a/mkdocs.yml +++ b/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 \ No newline at end of file