题目描述
给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始
要求使用顺序索引查找算法,其中索引表查找和块内查找都采用不带哨兵、从头开始的顺序查找方法。
输入
第一行输入n,表示主表有n个数据
第二行输入n个数据,都是正整数,用空格隔开
第三行输入k,表示主表划分为k个块,k也是索引表的长度
第四行输入k个数据,表示索引表中每个块的最大值
第五行输入t,表示有t个要查找的数值
第六行起,输入t个数值,输入t行
输出
每行输出一个要查找的数值在队列的位置和查找次数,数据之间用短划线隔开,如果查找不成功,输出字符串error
输入输出样例
输入样例1 <-复制
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
输出样例1
3-4
error
12-8
error
18-9
error
AC代码
#include<iostream>
using namespace std;
int n, k; // 数组长度和锁数
int q[100]; // 数组
int ci; // 计数器
struct node
{
int max, index; // 锁的最大值和位置
};
node suo[10]; // 锁数组
// 查找锁
void chasuo()
{
int i, j = 1;
suo[1].index = 1;
for (i = 2; i <= k; i++)
{
for (; j <= n; j++)
{
if (q[j] > suo[i - 1].max)
{
suo[i].index = j;
break;
}
}
}
}
// 查找数字
int zhao(int shu)
{
int i, j;
for (i = 1; i <= n; i++)
{
ci++;
if (shu <= suo[i].max)
for (j = suo[i].index; q[j] <= suo[i].max && j <= n; j++)
{
ci++;
if (q[j] == shu)
return j;
}
}
return 0;
}
int main()
{
cin >> n; // 读取数组长度n
int i;
for (i = 1; i <= n; i++)
cin >> q[i]; // 读取n个整数,保存到数组q中
cin >> k; // 读取锁数k
for (i = 1; i <= k; i++)
cin >> suo[i].max; // 读取k个整数,保存到suo结构体数组中的max字段中
chasuo(); // 调用chasuo函数,查找并保存锁的位置
int t;
cin >> t; // 读取查询次数t
while (t--)
{
int shu;
cin >> shu; // 读取要查询的数字shu
ci = 0; // 初始化计数器ci为0
int w = zhao(shu); // 调用zhao函数,查找数字shu的位置
if (w)
cout << w << "-" << ci << endl; // 如果找到了数字shu,则输出其位置w和计数器ci
else
cout << "error" << endl; // 如果没有找到数字shu,则输出错误信息"error"
}
}
该代码接收输入数据并执行以下操作:
- 读取数组长度n。
- 读取n个整数,保存到数组q中。
- 读取锁数k。
- 读取k个整数,保存到suo结构体数组中的max字段中。
- 调用chasuo函数,查找并保存每个锁的位置。
- 读取查询次数t。
- 循环t次执行以下操作:
- .读取要查询的数字shu。
- .初始化计数器ci为0。
- .调用zhao函数,查找数字shu的位置。
- .如果找到了数字shu,则输出其位置w和计数器ci。
- .如果没有找到数字shu,则输出错误信息"error"。
该代码的主要目的是实现对数组中数字的查找操作。它使用了一种优化的算法,在预处理阶段通过锁数k确定每个锁的最大值,并记录每个锁的位置。然后,在查询阶段,使用这些信息来加速查找过程。通过计数器ci记录比较次数,并在最后输出结果。
(by 归忆)