算法 - 查找 - 分块查找 (Block Search)

本文介绍如何使用C++实现通用的分块查找算法,包括整型查找、模板查找和自定义类型调用。分块查找适用于整体有序或分块有序的数据,先通过块索引快速定位,然后在子表内顺序查找。文章提供了模板函数,允许通过Lambda表达式处理自定义类型的关键字比较。
摘要由CSDN通过智能技术生成

算法 - 查找 - 分块查找 (Block Search)

返回分类:全部文章 >> 基础知识

返回上级:算法 - 查找与排序 (Searching and Sorting)

本文将用C++实现通用模板分块查找算法,复制代码直接可使用。

在查看本文之前,需要一些程序语言的基础。

还需要熟悉多种查找方法,在分块查找中最常用的:



1 分块查找简述 (Introduction)

分块查找,也叫索引顺序查找,其时间复杂度与查找块和查找元素所用查找方法有关。

  • 一般情况,都是 O(n) 或 O(log2n) ;

分块查找的输入数据包含:

  • 需要查找的表;

  • 块索引表,即将表分成几个子表,每一个子表最大关键字的元素对应子表第一个元素在整个表中的位置。

其需要查找的表必须整体有序或分块有序。

分块有序,即除首个子表外,其余每一个子表中所有关键字都必须大于它上一个子表的最大关键字。

如果表整体有序,不一定需要传入块索引表,可以在算法中动态建立,而只需传入块数量或每个块的元素数量。

假设表中有 n 个元素,分了 m 个块:

  • (1)对 m 个块进行查找(任意查找方式),查找元素是否在块中;

  • (2)如果找到了块,再对块顺序查找(如果块内有序,可以使用其它查找方法);

  • (3)没有找到块,或没有找到元素返回-1。

通常情况下:

  • 返回值,代表下标;

  • 返回-1,代表没有找到关键字;

之后的程序,我们以数组列表形式描述。

注意:代码全部使用std::vector<MyType>作为数组列表,如果你用指针数组MyType*,还需传入数组大小size


2 整型查找 (Interger Search)

一般举例中,查找最基本的元素本身就是整型。

// Author: https://blog.csdn.net/DarkRabbit
// Block Search

// 块映射结构
struct BlockSearchPair
{
   
    int maxKey;
    int startIndex;

    BlockSearchPair()
    {
   
        maxKey = -1;
        startIndex = -1;
    }

    BlockSearchPair(int fst, int snd)
    {
   
        maxKey = fst;
        startIndex = snd;
    }
};

// 整型无序表,块有序 - 分块查找
// params:
//      list:       查找的无序表
//      keyMap:     索引表,{子表最大关键字, 子表第一个元素下标}
//      element:    查找的元素
// return:
//      int:        找到的下标,-1为表中没有
int BlockSearch(const std::vector<int>& list,
                std::vector<BlockSearchPair>& keyMap,
                const int& element)
{
   
    if (list.empty())
    {
   
        return -
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值