B (1038) : DS哈希查找—二次探测再散列

2023-12-28 23:04

本文主要是介绍B (1038) : DS哈希查找—二次探测再散列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、题目描述
  • 二、输入与输出
    • 1.输入
    • 2.输出
  • 三、参考代码


一、题目描述

定义哈希函数为H(key) = key%11。输入表长(大于、等于11),输入关键字集合,用二次探测再散列构建哈希表,并查找给定关键字。


二、输入与输出

1.输入

在这里插入图片描述

3
11 8
18 25 11 19 20 3 10 13
7
17
26
2
0
25
24
11
11 6
9 23 26 10 16 18
9
10
24
16
13
6
4
8
10
24
11 3
0 3 28
14
27
27
21
14
22
24
7
7
28
16
1
25
1
3
19 17
27 28 26 25 6 11 18 22 29 20 0 19 14 13 10 23 15
9
16
5
21
14
26
18
10
21
8
11 7

2.输出

对每组测试数据,输出以下信息:

构造的哈希表信息,数组中没有关键字的位置输出NULL

对k个待查关键字,分别输出:

0或1(0—不成功,1—成功)、比较次数、查找成功的位置(从1开始)

11 NULL 13 25 3 NULL NULL 18 19 20 10
0 1
0 2
0 3
0 2
1 1 4
0 3
1 1 1
NULL 23 NULL NULL 26 16 NULL 18 NULL 9 10
1 1 11
0 1
1 1 6
0 1
0 1
0 3
0 1
1 1 11
0 1
0 NULL NULL 3 NULL NULL 28 NULL NULL NULL NULL
0 1
0 1
0 1
0 2
0 2
0 1
0 1
0 1
1 1 7
0 1
0 1
0 2
0 1
1 1 4

三、参考代码

#include <iostream>
#include <string>
#include<queue>
using namespace std;class HashList
{
public:int sum1, sum2;//sum1 表长  sum2 数据个数int* arr;HashList(){}HashList(int s1 ,int s2):sum1(s1),sum2(s2){arr = new int[s1];for (int i = 0; i < s1; i++){arr[i] = -1;}while (sum2--)//插入数据{int num;cin >> num;int di = 1;int index = num % 11;if (arr[index] == -1){arr[index] = num;continue;}while (1){int t1 = ((index + di * di) % sum1) % sum1;int t2 = ((index - di * di) % sum1) % sum1;while (t2 < 0){t2 += sum1;}//t2可能为负数,防止爆表if (arr[t1] == -1){arr[t1] = num;break;}else if (arr[t2] == -1){arr[t2] = num;break;}else{di++;}}}}void pri(){for (int i = 0; i < sum1; i++){if (arr[i] == -1){cout << "NULL";}else{cout << arr[i];}if (i == sum1 - 1){cout << endl;}else{cout << " ";}}}void FindNum(){int num;cin >> num;int findi = num % 11;int di = 1;int times = 1;if (arr[findi] == -1){cout << "0 1" << endl;}else if(arr[findi] == num){cout << "1 1 " << findi + 1 << endl;}else{while (1){times++;int t1 = ((findi + di * di) % sum1) % sum1;int t2 = ((findi - di * di) % sum1) % sum1;while (t2 < 0){t2 += sum1;}//t2可能为负数,防止爆表if (arr[t1] == num){cout << "1 " << times << " " << t1 + 1 << endl;break;}else if (arr[t1] == -1){cout << "0 " << times << endl;break;}times++;if (arr[t2] == num){cout << "1 " << times << " " << t2 + 1 << endl;break;}else if (arr[t2] == -1){cout << "0 " << times << endl;break;}di++;if (di > (sum1 / 2)){cout << "0 " << times << endl;break;}}}}
};int main()
{int sum;cin >> sum;while (sum--){int s1, s2;cin >> s1 >> s2;HashList h(s1, s2);h.pri();int s3;cin >> s3;while (s3--){h.FindNum();}}
}

这篇关于B (1038) : DS哈希查找—二次探测再散列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/547597

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

哈希表的底层实现(1)---C++版

目录 哈希表的基本原理 哈希表的优点 哈希表的缺点 应用场景 闭散列法 开散列法 开放定值法Open Addressing——线性探测的模拟实现 超大重点部分评析 链地址法Separate Chaining——哈希桶的模拟实现 哈希表(Hash Table)是一种数据结构,它通过将键(Key)映射到值(Value)的方式来实现快速的数据存储与查找。哈希表的核心概念是哈希

哈希表的封装和位图

文章目录 2 封装2.1 基础框架2.2 迭代器(1)2.3 迭代器(2) 3. 位图3.1 问题引入3.2 左移和右移?3.3 位图的实现3.4 位图的题目3.5 位图的应用 2 封装 2.1 基础框架 文章 有了前面map和set封装的经验,容易写出下面的代码 // UnorderedSet.h#pragma once#include "HashTable.h"

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

PHP: 深入了解一致性哈希

前言 随着memcache、redis以及其它一些内存K/V数据库的流行,一致性哈希也越来越被开发者所了解。因为这些内存K/V数据库大多不提供分布式支持(本文以redis为例),所以如果要提供多台redis server来提供服务的话,就需要解决如何将数据分散到redis server,并且在增减redis server时如何最大化的不令数据重新分布,这将是本文讨论的范畴。 取模算法 取模运

哈希表题总结

哈希表题总结 hot100两数之和字母异位词分组最长连续序列 hot100 两数之和 题目链接: 1.两数之和 代码: class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer,Integer> map = new HashMap<>();int n = nums.length;for

【吊打面试官系列-Redis面试题】说说 Redis 哈希槽的概念?

大家好,我是锋哥。今天分享关于 【说说 Redis 哈希槽的概念?】面试题,希望对大家有帮助; 说说 Redis 哈希槽的概念? Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽, 集群的每个节点负责一部分 hash 槽。