DS哈希查找—线性探测再散列
时间限制: 1 Sec 内存限制: 128 MB
题目描述
定义哈希函数为H(key) = key%11。输入表长(大于、等于11),输入关键字集合,用线性探测再散列构建哈希表,并查找给定关键字。
--程序要求-- 若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio 程序中若include多过一个头文件,不看代码,作0分处理 不允许使用第三方对象或函数实现本题的要求
输入
测试次数t
每组测试数据为:
哈希表长m、关键字个数n
n个关键字
查找次数k
k个待查关键字
输出
对每组测试数据,输出以下信息:
构造的哈希表信息,数组中没有关键字的位置输出NULL
对k个待查关键字,分别输出:0或1(0—不成功,1—成功)、比较次数、查找成功的位置(从1开始)
样例输入
1 2 3 4 5 6 7 8 | 1 12 10 22 19 21 8 9 30 33 4 15 14 4 22 56 30 17 |
样例输出
1 2 3 4 5 | 22 30 33 14 4 15 NULL NULL 19 8 21 9 1 1 1 0 6 1 6 2 0 1 |
提示
解决方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | #include <iostream> #include <vector> class HashTable { public: explicit HashTable(size_t size) : hash_(size, -1) {} void setFromCin() { size_t length; std::cin >> length; for (int i = 0; i < length; ++i) { int number, index = 0; std::cin >> number; while (hash_[number % P + index] != -1) { index += 1; if (number % P + index == hash_.size()) { index = - (number % P); } } hash_[number % P + index] = number; } std::cout << hash_.front(); for (int i = 1; i < hash_.size(); ++i) { if (hash_[i] == -1) { std::cout << " NULL"; } else { std::cout << ' ' << hash_[i]; } } std::cout << std::endl; } void searchAndPrint(int data) { int result = 1, count = 1, index = 0; while (hash_[data % P + index] != data) { if (count == hash_.size() || hash_[data % P + index] == -1) { result = 0; break; } index += 1; count += 1; if (data % P + index == hash_.size()) { index = - (data % P); } } std::cout << result << ' ' << count; if (result == 1) { int position = data % P + index + 1; std::cout << ' ' << position; } std::cout << std::endl; } private: static const int P = 11; std::vector<int> hash_; }; int main() { size_t ctrl; std::cin >> ctrl; while (ctrl--) { size_t size; std::cin >> size; class HashTable hashTable(size); hashTable.setFromCin(); int time; std::cin >> time; while (time--) { int number; std::cin >> number; hashTable.searchAndPrint(number); } } return 0; } |