哈希查找【数据结构】

DS哈希查找—线性探测再散列

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

输入
测试次数t
每组测试数据为:
哈希表长m、关键字个数n
n个关键字
查找次数k
k个待查关键字

输出
对每组测试数据,输出以下信息:
构造的哈希表信息,数组中没有关键字的位置输出NULL
对k个待查关键字,分别输出:0或1(0—不成功,1—成功)、比较次数、查找成功的位置(从1开始)

输入样例1
1
12 10
22 19 21 8 9 30 33 4 15 14
4
22
56
30
17

输出样例1
22 30 33 14 4 15 NULL NULL 19 8 21 9
1 1 1
0 6
1 6 2
0 1

#include<bits/stdc++.h>
using namespace std;
//构建哈希表
void hashBuild(int x,int a[],int m)
{int index=x%11;if(!a[index]) a[index]=x;else{//线性探测再散列int d=1;while(a[(index+d)%m]&&d<m) d++;a[(index+d)%m]=x;}
}
int main()
{int t;cin>>t;for(int i=0;i<t;i++){int m,n;cin>>m>>n;int a[m];memset(a,0,sizeof(a));for(int j=0;j<n;j++){int x;cin>>x;//构建哈希表hashBuild(x,a,m);}for(int i=0;i<m;i++){if(i==0) (a[i])?cout<<a[i]:cout<<"NULL";else (a[i])?cout<<" "<<a[i]:cout<<" NULL";}cout<<endl;int k;cin>>k;for(int j=0;j<k;j++){int x;cin>>x;int time=0;int loc=-1;int index=x%11;//查找一次就成功if(a[index]==x){cout<<"1 1 "<<index+1<<endl;continue;}int d=0;while(a[(index+d)%m]!=x&&a[(index+d)%m]&&d<m) d++;//查找失败if(d==m||!a[(index+d)%m]){cout<<"0 "<<d+1<<endl;continue;}else cout<<"1 "<<d+1<<" "<<(index+d)%m+1<<endl;}}return 0;
}

DS哈希查找—二次探测再散列

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

输入
测试次数t
每组测试数据格式如下:
哈希表长m、关键字个数n
n个关键字
查找次数k
k个待查关键字

输出
对每组测试数据,输出以下信息:
构造的哈希表信息,数组中没有关键字的位置输出NULL
对k个待查关键字,分别输出:
0或1(0—不成功,1—成功)、比较次数、查找成功的位置(从1开始)

输入样例1
1
12 10
22 19 21 8 9 30 33 4 41 13
4
22
15
30
41

输出样例1
22 9 13 NULL 4 41 NULL 30 19 8 21 33
1 1 1
0 3
1 3 8
1 6 6

#include<bits/stdc++.h>
using namespace std;
//构建哈希表
void hashBuild(int x,int a[],int m)
{int index=x%11;if(!a[index]) a[index]=x;else{//二次探测再散列int d=1;while((((index+d)%m)>=0&&a[(index+d)%m])||((index+d)%m<0&&a[((index+d+m)%m)])&&d<m){if(d>0) d=-d;else d=pow(sqrt(-d)+1,2);}((index+d)%m>=0)?a[((index+d)%m)]=x:a[(index+d+m)%m]=x;}
}
int main()
{int t;cin>>t;for(int i=0;i<t;i++){int m,n;cin>>m>>n;int a[m];memset(a,0,sizeof(a));for(int j=0;j<n;j++){int x;cin>>x;hashBuild(x,a,m);}for(int i=0;i<m;i++){if(i==0) (a[i])?cout<<a[i]:cout<<"NULL";else (a[i])?cout<<" "<<a[i]:cout<<" NULL";}cout<<endl;int k;cin>>k;for(int j=0;j<k;j++){int x;cin>>x;int index=x%11;//一次就找到if(a[index]==x){cout<<"1 1 "<<index+1<<endl;continue;}int d=0;while((((index+d)%m)>=0&&a[(index+d)%m]&&a[(index+d)%m]!=x)||((index+d)%m<0&&a[((index+d+m)%m)]&&a[((index+d+m)%m)]!=x)&&d<m){if(d>0) d=-d;else d=pow(sqrt(-d)+1,2);}int time;if(d>=0) time=sqrt(d)*2;else time=sqrt(-d)*2+1;//找不到if(d==m||!a[(index+d)%m]){cout<<"0 "<<time<<endl;continue;}else cout<<"1 "<<time<<" "<<(index+d)%m+1<<endl;}}return 0;
}

DS哈希查找–链地址法(表头插入)

题目描述
给出一个数据序列,建立哈希表,采用求余法作为哈希函数,模数为11,哈希冲突用链地址法和表头插入
如果首次查找失败,就把数据插入到相应的位置中
实现哈希查找功能

输入
第一行输入n,表示有n个数据
第二行输入n个数据,都是自然数且互不相同,数据之间用空格隔开
第三行输入t,表示要查找t个数据
从第四行起,每行输入一个要查找的数据,都是正整数

输出
每行输出对应数据的查找结果

输入样例1
6
11 23 39 48 75 62
6
39
52
52
63
63
52

输出样例1
6 1
error
8 1
error
8 1
8 2

提示
注意,当两次输入要相同的查找数据,如果第一次查找不成功就会执行插入,那么第二次查找必然成功,且查找次数为1次(因为做表头插入)
例如示例数据中输入两次52,第一次查找失败就把52插入到位置8,第二次查找就成功了,所以第一次输出error,第二次就输出8 1
为什么第三次输入52会输出8 2

#include<bits/stdc++.h>
using namespace std;
struct node
{int value;node* next=NULL;
};
//构建哈希数组+链表
//数组的头节点是空的
void buildNode(node* a[],int x)
{int index=x%11;if(!a[index]){a[index]=new node;}node* newNode=new node;newNode->value=x;newNode->next=a[index]->next;a[index]->next=newNode;
}
//查找
int find(node* a[],int x)
{int index=x%11;if(!a[index]) return -1;node* now=a[index];int time=-1;while(now){time++;if(now->value==x) return time;now=now->next;}return -1;
}
int main()
{int n;cin>>n;node* a[11];memset(a,NULL,sizeof(a));for(int i=0;i<n;i++){int x;cin>>x;buildNode(a,x);}int t;cin>>t;for(int i=0;i<t;i++){int x;cin>>x;if(find(a,x)==-1){cout<<"error"<<endl;buildNode(a,x);continue;}cout<<x%11<<" "<<find(a,x)<<endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/597704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据StarRocks(四) :常用命令

这次主要介绍生产工作中Starrocks时的常用命令 4.1 连接StarRocks 4.1.1 Linux命令行连接 [roothadoop1011 fe]# yum install mysql -y [roothadoop1011 fe]# mysql -h hadoop101 -uroot -P9030 -p4.1.2 Windows客户端 DBeaver 连接 4.2 常用命令 4.2.1 查看状态 1. 查看f…

C/C++汇编学习(四)——编写不同的C++程序并分析其汇编输出

我们可以从一个简单的C代码示例开始&#xff0c;然后生成其对应的汇编代码并进行解析。这个过程不仅展示了C代码如何被转换成汇编语言&#xff0c;而且还帮助理解编译器是如何处理代码的。 案例一 C 代码示例 让我们使用一个简单的C代码示例&#xff1a;一个计算两个数之和的…

Linux 命令汇总

Linux 命令 1.查找命令 find /home/gitlab-runner/videofusionbe/api/logs/ -name ‘04-08.log’ -print 2.更换用户命令 Sudo - gitlab-runner 3.使用停止现有项目 sh rsbc.sh stop 4.启动现有项目 sh rsbc.sh start 5.启动日志 tail -f Web.log.2022-04-21.log 6.…

【Java项目】实战CRUD的功能整理(持续更新)

目录 前言1. MybatisPlus功能2. Excel处理3. 其他 前言 在实战中学习&#xff0c;整理每个功能细节以及各个函数的使用 对于Java的细节可看我之前的专栏&#xff1a;Java专栏 1. MybatisPlus功能 完整的CRUD可看我之前的文章&#xff1a; Springboot整合MybatisPlus的基本…

linux安装nodejs

一&#xff0c;yum安装 yum -y install nodejs 二&#xff0c;下载安装包安装 官网下载地址&#xff1a;Download | Node.js 建议安装低版本的&#xff0c;安装高版本的会有很多依赖&#xff0c;处理起来非常麻烦&#xff0c;还浪费时间 [rootmaster1 local]# wget https://…

【ArcGIS微课1000例】0086:基于七普人口数据的人口密度分析与制图

本文基于七普人口数据(省份、地级市、县区三级)进行人口密度计算分析与制图。 文章目录 一、人口密度介绍二、数据准备三、密度计算1. 投影转换2. 密度计算四、密度制图四、注意事项一、人口密度介绍 人口密度(density of population)是单位土地面积上的人口数量。通常使用的计…

C++类成员的访问控制

前言 本篇文章介绍C类成员的访问控制 关键字 C的类成员通过使用三个关键字来对成员的访问进行控制&#xff0c;并且只有这三个关键字&#xff1a; publicprivateprotected 使用场景 上面的三个关键字会扮演两种角色&#xff0c;也就是说会有两种使用的地方&#xff1a; …

【数值分析】插值法,lagrange插值,牛顿插值

1. 插值法介绍 插值法是一种通过已知数据点来估计未知数据点的方法。它通过构建一个函数或曲线&#xff0c;使其经过已知数据点&#xff0c;从而在数据点之间进行估计或预测。插值法的基本思想是假设已知数据点之间存在某种规律或趋势&#xff0c;并利用这种规律来推断未知数据…

全解析阿里云Alibaba Cloud Linux镜像操作系统

Alibaba Cloud Linux是基于龙蜥社区OpenAnolis龙蜥操作系统Anolis OS的阿里云发行版&#xff0c;针对阿里云服务器ECS做了大量深度优化&#xff0c;Alibaba Cloud Linux由阿里云官方免费提供长期支持和维护LTS&#xff0c;Alibaba Cloud Linux完全兼容CentOS/RHEL生态和操作方式…

conda环境下Could not create share link解决方法

1 问题描述 在运行chatglm-6B项目时&#xff0c;运行python web_demo.py&#xff0c;出现如下错误&#xff1a; (chatglm) [rootlocalhost ChatGLM2-6B]# python web_demo.py Loading checkpoint shards: 100%|██████████████████████████████…

SwiftUI之深入解析如何创建一个灵活的选择器

一、前言 在 Dribbble 上找到的设计的 SwiftUI 实现时&#xff0c;可以尝试通过一些酷炫的筛选器扩展该项目以缩小结果列表。筛选视图将由两个独立的筛选选项组成&#xff0c;两者都有一些可选项可供选择。但是&#xff0c;在使用 UIKit 时&#xff0c;总是将这种类型的视图实…

Anaconda下调用ArcGIS的arcpy工具包

1.从64位切换到32位开发模式: set CONDA_FORCE_32BIT1 2. 创建2.7的环境 conda create -n py27 python2.7 3.将ArcGIS的目录C:\Python27\ArcGIS10.1\Lib\site-packages\Desktop10.1.pth直接拷贝到Anaconda3的目录里&#xff08;C:\Users\xxx\Anaconda3\Lib\site-packages&a…

RK3568 学习笔记 : ubuntu 20.04 下 Linux-SDK 镜像烧写

前言 开发板&#xff1a;【正点原子】ATK-DLRK3568 开发板&#xff0c;编译完 Linux-SDK 后&#xff0c;生成了相关的镜像文件&#xff0c;本篇记录一下 镜像烧写&#xff0c;当前编译环境在 VMware 虚拟机中&#xff0c;虚拟机系统是 ubuntu 20.04 此次烧写还算顺利&#xff…

Callback Hook

一、Callback Hook 函数名&#xff1a;useCallback 用于得到一个固定引用值的函数&#xff0c;通常用它进行性能优化。 useCallback: 该函数只需要传入两个参数&#xff1a;一个回调函数和一个依赖数组即可。 1.函数&#xff0c;useCallback会固定该函数的引用&#xff0c;…

[USACO04OPEN] The Cow Lineup

题目描述 约翰的 N &#xff08; 1 ≤ N ≤ 100000 &#xff09; N &#xff08; 1 \leq N \leq 100000 &#xff09; N&#xff08;1≤N≤100000&#xff09; 只奶牛站成了一列。每只奶牛都写有一个号牌&#xff0c;表示她的品种&#xff0c;号牌上的号码在 1 … K &#x…

【C++】知识点汇总(上)

C知识点复习上 一、C 概述1. 基本数据类型2. 变量定义和访问3. 常量与约束访问 二、程序控制结构详解与示例1. 表达式2. 选择控制2.1 if 语句2.2 switch 语句 3. 循环控制3.1 for 循环3.2 while 循环3.3 do-while 循环 4. goto 语句5. 控制语句的嵌套 三、函数1. 函数的定义和调…

搜索二维矩阵 II(LeetCode 240)

1.问题描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10…

快速、准确地检测和分类病毒序列分析工具 ViralCC的介绍和详细使用方法,fudai shiyong ijaoben

介绍 viralcc是一个基因组病毒分析工具&#xff0c;可以用于快速、准确地检测和分类病毒序列。 github&#xff1a;dyxstat/ViralCC: ViralCC: leveraging metagenomic proximity-ligation to retrieve complete viral genomes (github.com) Instruction of reproducing resul…

ubuntu的boot分区被删除恢复

在鼓捣黑苹果的时候&#xff0c;误删了ubuntu的boot分区&#xff0c;进系统的时候出现emergency mode&#xff0c;那么现在来讲讲怎么恢复 首先做一个ubuntu的启动盘&#xff0c;然后进入启动盘的系统选择试用 呼出命令行&#xff0c;然后添加一个源 sudo add-apt-repository…

207.【2023年华为OD机试真题(C卷)】小朋友来自多少小区(贪心算法实现-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-小朋友来自多少小区二.解题思路三.题解代码Pyt…