分塊查詢演算法(JAVA)
阿新 • • 發佈:2019-02-20
描述:
分塊查詢要求索引表是有序的,對塊內節點沒有排序要求,因此適合於節點動態變化的情況。
分塊查詢要求把一個大的線性表分解成若干塊,每塊中的節點可以任意存放,但塊與塊之間必須排序
步驟:
step1 先選取各塊中的最大關鍵字構成一個索引表;
step2 查詢分兩個部分:先對索引表進行二分查詢或順序查詢,以確定待查記錄在哪一塊中;
step3 然後,在已確定的塊中用順序法進行查詢。
索引表的長度最佳為資料總長度開根號;
package cn.ljonah.search; import java.util.ArrayList; /** * @Descript:分塊查詢 * * @author LJonah 2018年3月12日 */ public class BlockSearch { private int[] index;//建立索引 private ArrayList[] list; /** * @Descript:初始化索引 * * @author LJonah 2018年3月12日 * @param index */ public BlockSearch(int[] index){ if(null != index && index.length!=0){ this.index = index; this.list = new ArrayList[index.length]; for (int i = 0;i < list.length;i++) { list[i] = new ArrayList();//初始化容器 } }else{ throw new Error("index cannot be null or empty"); } } /** * @Descript:插入索引 * * @author LJonah 2018年3月12日 * @param value */ public void insert(int value){ int i = binarySearch(value); list[i].add(value); } /** * @Descript:二分法查詢 * * @author LJonah 2018年3月12日 * @param value * @return */ private int binarySearch(int value){ int start = 0,end =index.length;int mid = -1; while(start<=end){ mid=(start+end)/2; if(index[mid]>value){ end = mid -1; }else{ //如果相等,也插入後面 start = mid+1; } } return start; } /** * @Descript:查詢元素 * * @author LJonah 2018年3月12日 * @param data * @return */ public boolean search(int data) { int i=binarySearch(data); for(int j=0;j<list[i].size();j++) { if(data==(int)list[i].get(j)) { System.out.println(String.format("查詢元素為第: %d塊 第%d個 元素", i+1,j+1)); return true; } } return false; } /** * @Descript:列印每塊的元素 * * @author LJonah 2018年3月12日 */ public void printAll(){ for (int i = 0; i < list.length; i++) { ArrayList l = list[i]; System.out.println("ArrayList["+i+"]:"); for (int j = 0; j < l.size(); j++) { System.out.println(l.get(j)+" "); } } } /** * @Descript:測試 * * @author LJonah 2018年3月12日 * @param args */ public static void main(String[] args) { int []index={10,20,30}; BlockSearch blocksearch=new BlockSearch(index); blocksearch.insert(1); blocksearch.insert(11); blocksearch.insert(21); blocksearch.insert(2); blocksearch.insert(12); blocksearch.insert(22); blocksearch.insert(5); blocksearch.insert(15); blocksearch.insert(25); blocksearch.printAll(); System.out.println("查詢值15 結果"+blocksearch.search(15)); System.out.println("查詢值29 結果"+blocksearch.search(29)); } }
測試結果:
ArrayList[0]:
1
2
5
ArrayList[1]:
11
12
15
ArrayList[2]:
21
22
25
查詢元素為第: 2塊 第3個 元素
查詢值15 結果true
查詢值29 結果false