【查找算法(五)】分块查找

算法简介
  要求是顺序表,分块查找又称索引顺序查找,它是顺序查找的一种改进方法。 
算法思想
将n个数据元素"按块有序"划分为m块(m ≤ n)。
每一块中的结点不必有序,但块与块之间必须"按块有序";
即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;
而第2块中任一元素又都必须小于第3块中的任一元素,……

在这里插入图片描述

算法流程
1、先选取各块中的最大关键字构成一个索引表;
2、查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;
3、在已确定的块中用顺序法进行查找。
复杂度分析
时间复杂度:O(log(m)+N/m)
Java版本实现
/** 
 * 分块查找 
 *  
 * @param index 
 *            索引表,其中放的是各块的最大值 
 * @param st 
 *            顺序表, 
 * @param key 
 *            要查找的值 
 * @param m 
 *            顺序表中各块的长度相等,为m 
 * @return 
 */  
public static int blockSearch(int[] index, int[] st, int key, int m) {  
    // 在序列st数组中,用分块查找方法查找关键字为key的记录  
    // 1.在index[ ] 中折半查找,确定要查找的key属于哪个块中  
    int i = binarySearch(index, key);  
    if (i >= 0) {  
        int j = i > 0 ? i * m : i;  
        int len = (i + 1) * m;  
        // 在确定的块中用顺序查找方法查找key  
        for (int k = j; k < len; k++) {  
            if (key == st[k]) {  
                System.out.println("查询成功");  
                return k;  
            }  
        }  
    }  
    System.out.println("查找失败");  
    return -1;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值