题目:
问题 C: DS静态查找之顺序索引查找
时间限制: 1 Sec 内存限制: 128 MB
提交: 386 解决: 287
[提交][状态][讨论版]
题目描述
给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始
要求使用顺序索引查找算法,其中索引表查找和块内查找都采用不带哨兵、从头开始的顺序查找方法。
输入
第一行输入n,表示主表有n个数据
第二行输入n个数据,都是正整数,用空格隔开
第三行输入k,表示主表划分为k个块,k也是索引表的长度
第四行输入k个数据,表示索引表中每个块的最大值
第五行输入t,表示有t个要查找的数值
第六行起,输入t个数值,输入t行
输出
每行输出一个要查找的数值在队列的位置和查找次数,数据之间用短划线隔开,如果查找不成功,输出字符串error
样例输入
18
22 12 13 8 9 20 33 42 44 38 24 48 60 58 74 57 86 53
3
22 48 86
6
13
5
48
40
53
90
样例输出
3-4
error
12-8
error
18-9
error
代码块:
#include <iostream>
using namespace std;
class SSTable
{
int *elem;
int *intable;
int length1;
int length2;
public:
SSTable();
~SSTable();
void Search_Seq();
};
SSTable::SSTable()
{
cin>>length1;
elem = new int[length1];
for(int i=0; i<length1; i++)
cin>>elem[i];
cin>>length2;
intable = new int[length2];
for(int i=0; i<length2; i++)
cin>>intable[i];
}
SSTable::~SSTable()
{
delete []elem;
delete []intable;
}
void SSTable::Search_Seq()
{
int i, j, data;
int sum = 0;
cin>>data;
if(data<=intable[0])
{
i = 0;
j = length1/length2;
sum += 1;
}
else if(data>intable[length2-1])
{
cout<<"error"<<endl;
return;
}
else
{
for(int k=0; k<length2-1; k++)
{
if(data>intable[k] && data<=intable[k+1])
{
i = (k+1)*(length1/length2);
j = (k+2)*(length1/length2);
sum += k+2;
break;
}
}
}
int k = i;
sum += 1;
while(elem[k]!=data && k<j)
{
k++;
sum++;
}
if(k==j)
cout<<"error"<<endl;
else
cout<<k+1<<'-'<<sum<<endl;
}
int main(void)
{
SSTable myTable;
int t;
cin>>t;
while(t--)
myTable.Search_Seq();
return 0;
}