二分查找
二分查找也叫折半查找,针对有序数据,依赖数组结构来存储元素,时间复杂度O(n);
不适合数据量太大,对于1G的元素那么就需要1G的连续存储空间;
package com.zsl.datastructalgorithm.date20220703;
import com.zsl.datastructalgorithm.date20220627.InsertSort;
import java.util.Arrays;
/**
* 二分查找
*
* @author zsl
* @date 2022/7/3 8:28
* @email 249269610@qq.com
*/
public class BinarySearch {
public static void main(String[] args) {
int[] ints = new int[]{1, 5, 7, 54, 867, 765, 567, 34, 52, 23, 28, 97, 73};
InsertSort.sort(ints);
System.out.println(Arrays.toString(ints));
System.out.println(search(ints, 34));
System.out.println();
}
public static int search(int[] elements, int element) {
if (elements.length <= 0) return -1;
int left = 0;
int right = elements.length - 1;
int mid = (right - left) / 2 + left;;
// 二分查找元素
while (right > left) {
if (elements[mid] == element) {
break;
} else if (elements[mid] < element) {
left = mid + 1;
} else {
right = mid - 1;
}
mid = (right - left) / 2 + left;
}
int index = -1;
if (elements[mid] == element) {
index = mid;
}
return index;
}
}
常见变形问题(存在多个相同的值):
- 查找第一个值等于给定值的元素
- 查找最后一个值等于给定值的元素
- 查找第一个大于给定值的元素
- 查找最后一个等于给定值的元素
跳表
需要维护多级索引,通过索引达到快速定位到元素位置;保证元素有序, 解决链表查询问题;时间复杂度O(n*logn),空间复杂度O(n)。
主要解决了:范围查询,支持查询给定区间范围