- 分块查找简介
- 实现(java)
- 时间复杂度
1.分块查找简介
分块查找, 按块有序查找, 块间有序, 块内不必有序. 创建索引表, 先查找索引表找到块, 再块内查找元素
2.实现(java)
public class BlockSearch {
public static void main(String[] args) {
int[] arr = {40, 35, 5, 63, 21, 82, 96, 77, 52, 19};
int index = search(arr, 82);
if(-1 != index) {
System.out.println("查询成功, 元素位于数组第" + (index + 1) + "位");
}else {
System.out.println("查询失败");
}
}
static class Block {
public int index;
public int start;
public int length;
public int max;
}
public static int search(int[] arr, int key) {
Block[] blocks = new Block[4];
createIndex(arr, blocks);
int index = 0;
for(int i = 0; i < blocks.length; i++) {
if(key <= blocks[i].max) {
index = i;
break;
}
}
int start = blocks[index].start;
int end = blocks[index].start + blocks[index].length;
for(int i = start; i < end; i++) {
if(key == arr[i]) {
return i;
}
}
return -1;
}
public static void createIndex(int[] arr, Block[] blocks) {
int[][] blockArr = new int[4][];
for(int i = 0; i < arr.length; i++) {
int index = arr[i] / 30;
blockArr[index] = appendItem(blockArr[index], arr[i]);
}
int k = 0;
for(int i = 0; i < blockArr.length; i++) {
blocks[i] = new Block();
blocks[i].index = i;
blocks[i].length = blockArr[i].length;
if(i != 0) {
blocks[i].start = blocks[i - 1].start + blocks[i - 1].length;
}else {
blocks[i].start = 0;
}
int max = blockArr[i][0];
for(int j = 0; j < blockArr[i].length; j++) {
if(max < blockArr[i][j]) {
max = blockArr[i][j];
}
arr[k++] = blockArr[i][j];
}
blocks[i].max = max;
}
}
public static int[] appendItem(int[] blockArr, int item) {
if(blockArr == null) {
return new int[]{item};
}
int[] tmpArr = Arrays.copyOf(blockArr, blockArr.length + 1);
tmpArr[tmpArr.length - 1] = item;
return tmpArr;
}
}
3.时间复杂度
时间复杂度为O(log2n)