算法 - 查找 - 分块查找 (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.youkuaiyun.com/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 -