路漫漫-数据结构与算法邂逅Java
1.引入
这里以一个二分查找引入,详细去介绍数据结构与算法当中的注意事项及其基本知识的扫盲。
1.1二分查找相关问题
先直接给出一段二分的代码,看似简单的代码,也是很多人看过的第一个算法,但是你真的搞清楚了二分吗?二分的细节点有很多很多,如下来一一的去介绍。
public class BasicBanirySerch {public static int binarySearchBasic(int[] arr,int target){int length = arr.length;int i=0; int j=length-1; //i,j代表的是左边界和右边界while (i<=j){int m=(i+j)>>>1;if(target<arr[m]){j=m-1;} else if (arr[m]<target) {i=m+1;}else {return m; //找到了}}return -1; //未找到}public static void main(String[] args) {int[] arr=new int[]{1,3,5,7,9};System.out.println(binarySearchBasic(arr,5));}
}
争对上述代码如果说我提出以下问题,你能够正确的回答吗:
1.为什么是i<=j,而不是i<j呢?
由于i和j的指向的都是数组界内的元素,所以说i==的时候表示该元素可以进行比较,即二则指向的都是有效元素。
2.为什么写成(i+j)>>>1呢?
这和Java底层去存储01数据有着密切的关联即,Java最底层是将01数据的最高位做为符号位的,如果说i+j的值大于了数据类型表示的范围(比如说int 可以表示32位01数据),溢出了之后机会导致最高位为1,变成了负数。但是抓住了最底层的01数据都是一样的,而且无符号右移针对于二进制数来说就是除以2(0111(7)>>>1=0011(3)),所以说即使我i+j溢出了我无符号右移也能表示出二者的中间值。
3.都写成小于符号有
写成小于符号是为了符合人对于数组的正确思维,从左到右是递增的一个趋势,所以说我通过小于符号控制target是大于还是小于很符合思维,i,j也是同理。
二分查找改动版:
这里就是口述,理解了基本的i,j关系理解改动版本就是小问题了,让j=length,即j的含义是不属于边界内的元素,"指向的不是要查找的元素",那么此时结束条件就变成了i<j,以及如果说在左侧就是j=m,细品"指向的不是要查找的元素"即可。