分块查询算法(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








  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hill密码算法是一种基于线性代数的加密算法,它可以对一定长度的明文进行加密,得到与明文等长的密文。下面是一个简单的 Hill密码算法的实现示例,使用Java语言编写: ```java import java.util.Scanner; public class HillCipher { static int mod = 26; public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("Enter the plain text: "); String plainText = input.nextLine().toUpperCase().replaceAll("\\s", ""); System.out.print("Enter the key matrix: "); String keyString = input.nextLine().toUpperCase().replaceAll("\\s", ""); int[][] keyMatrix = getKeyMatrix(keyString); String cipherText = encrypt(plainText, keyMatrix); System.out.println("Cipher text: " + cipherText); } public static int[][] getKeyMatrix(String keyString) { int dimension = (int) Math.sqrt(keyString.length()); int[][] keyMatrix = new int[dimension][dimension]; int k = 0; for (int i = 0; i < dimension; i++) { for (int j = 0; j < dimension; j++) { keyMatrix[i][j] = (int) (keyString.charAt(k) - 'A'); k++; } } return keyMatrix; } public static String encrypt(String plainText, int[][] keyMatrix) { int dimension = keyMatrix.length; int len = plainText.length(); int[] plainTextVector = new int[len]; for (int i = 0; i < len; i++) { plainTextVector[i] = (int) (plainText.charAt(i) - 'A'); } int[][] plainTextMatrix = new int[len / dimension][dimension]; int k = 0; for (int i = 0; i < len / dimension; i++) { for (int j = 0; j < dimension; j++) { plainTextMatrix[i][j] = plainTextVector[k]; k++; } } int[][] cipherTextMatrix = new int[len / dimension][dimension]; for (int i = 0; i < len / dimension; i++) { for (int j = 0; j < dimension; j++) { int sum = 0; for (int s = 0; s < dimension; s++) { sum += keyMatrix[j][s] * plainTextMatrix[i][s]; } cipherTextMatrix[i][j] = sum % mod; } } StringBuilder cipherTextBuilder = new StringBuilder(); for (int i = 0; i < len / dimension; i++) { for (int j = 0; j < dimension; j++) { cipherTextBuilder.append((char) (cipherTextMatrix[i][j] + 'A')); } } return cipherTextBuilder.toString(); } } ``` 该示例中,程序首先从标准输入中读取明文和密钥矩阵,然后调用`encrypt`方法对明文进行加密,并输出密文。`getKeyMatrix`方法将密钥字符串转换成一个矩阵,`encrypt`方法对明文进行分块、矩阵乘法和模运算,得到密文矩阵,并将其转换成密文字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值