Add the chapter of searching.
This commit is contained in:
		| @@ -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 | ||||
|  | ||||
|  | ||||
|  | ||||
| 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 | ||||
		Reference in New Issue
	
	Block a user