注:在分几块方面是分奇数偶数进行处理
Description |
编程实现分块查找。具体为,创建一个一维数组,指定该一维数组的大小n,输入数组的n个元素(该n个数据为递增),将该n个元素在逻辑上分为3块,并定义相应块的结构(每块数据的最大值,每块数据的起始地址,每块数据的结束地址)。输入要查找的数值kval,利用分块查找其关键字等于 kval 的数据元素,若找到,则函数值为该元素在表中的位置(1-n),否则为0,并输出结果。 具体例子:如数组{42,63,82,89,111,146,219,254,325,336,348,795,876,951,998}分3块后各个数据块的信息如下 key=111 ,start=0 ,end=4 key=336 ,start=5 ,end=9 key=998 ,start=10 ,end=14 此时如果查询219,则首先确定其在第2块内,然后在该块内顺序查找得到其位置。 Input |
Sample Input |
15 42 63 82 89 111 146 219 254 325 336 348 795 876 951 998 219 |
Sample Output |
7 |
Hint |
#include <bits/stdc++.h>
using namespace std;
typedef struct
{ // 可定义多种不同类型的数据类型
int key;
} Elem;
typedef struct
{
Elem *R; // 数组表基址一般下标为0不存值
int len; // 长度
Elem *index;
} Stable;
void initST(Stable &ST)
{ // 线性初始化
ST.R = new Elem[1005];
ST.index = new Elem[1005];
}
int dx;
void creat_ST(Stable &ST, int n)
{ // 创建线性数组
ST.len = n;
if (n % 3 == 0)
{//根据奇数偶数分3块
dx = n / 3;
}
else
{
dx = n / 3 + 1;
}
for (int i = 0; i < dx * 3; i++)
{//初始化
ST.R[i].key = 0;
}
for (int i = 0; i < ST.len; i++)
{
cin >> ST.R[i].key;
}
int max;
for (int i = 0; i < 3; i++)
{//查找每一块最大值并记录
max = ST.R[i * dx].key;
for (int j = i * dx + 1; j < dx * (i + 1); j++)
{
if (max < ST.R[j].key)
{
max = ST.R[j].key;
}
}
ST.index[i].key = max;
}
}
int serch_index(Stable ST, int k)
{//因题目要求三块比较少没有采用循环处理
if (k <= ST.index[0].key)
{//判断属于那一块进入块中查找
for (int j = 0; j < dx; j++)
{
if (k == ST.R[j].key)
{
return j;
}
}
}
else if (k > ST.index[0].key && k <= ST.index[1].key)
{
for (int j = dx; j < dx * 2; j++)
{
if (k == ST.R[j].key)
{
return j;
}
}
}
else if (k > ST.index[1].key && k <= ST.index[2].key)
{
for (int j = dx * 2; j < dx * 3; j++)
{
if (k == ST.R[j].key)
{
return j;
}
}
}
}
int main()
{
Stable ST;
initST(ST);
int n, key, num;
cin >> n;
creat_ST(ST, n);
cin >> key;
num = serch_index(ST, key) + 1;
cout << num;
return 0;
}