1. 程式人生 > >分塊查詢演算法(JAVA)

分塊查詢演算法(JAVA)

描述:

分塊查詢要求索引表是有序的,對塊內節點沒有排序要求,因此適合於節點動態變化的情況。

分塊查詢要求把一個大的線性表分解成若干塊,每塊中的節點可以任意存放,但塊與塊之間必須排序

步驟:

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