DS哈希查找--线性探测再散列
题目描述
定义哈希函数为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开始)
样例输入
样例输出
#include<iostream>
#include<string>
#include<queue>
using namespace std;
const int MaxLen = ;
class Map {
private:
bool vist[MaxLen];
int matrix[MaxLen][MaxLen];
int vexnum;
void BFS(int v);
public:
void setmatrix(int vnum, int mx[MaxLen][MaxLen]);
void BFSTraverse();
};
void Map::setmatrix(int vnum, int mx[MaxLen][MaxLen]){
int i, j;
vexnum = vnum;
for (i = ; i < MaxLen; i++)
for (j = ; j < MaxLen; j++)
matrix[i][j] = ;
for (i = ; i < vexnum; i++)
for (j = ; j < vexnum; j++)
matrix[i][j] = mx[i][j];
}
void Map::BFSTraverse(){
BFS();
}
void Map::BFS(int v){
int w, u;
int i, k;
int *adjvex = new int[vexnum];
queue<int> Q;
for (i = ; i < vexnum; i++)
vist[i] = false;
for (v = ; v < vexnum; ++v)
{
if (!vist[v])
{
vist[v] = true;
cout << v << " ";
Q.push(v);
while (!Q.empty())
{
u = Q.front();
Q.pop();
k = ;
for (i = ; i < vexnum; i++)
{
if (matrix[u][i] == )
adjvex[k++] = i;
}
i = ;
for (w = adjvex[i]; w >= ; w = adjvex[i++])
if (!vist[w])
{
vist[w] = true;
cout << w << " ";
Q.push(w);
}
}
}
}
}
int main(){
int t,key=;
cin >> t;
while(t--)
{
int m, n;
cin >> m >> n;
int *a = new int[m];
int *flag = new int[m];//用来标记这个位置有没有值
int i;
for (i = ; i < m; i++)
flag[i] = -;
for (i = ; i < n; i++)
{
int yu,x;
cin >> x;
yu = x % key;
if (flag[yu] == -)
{
a[yu] = x;
flag[yu] = ;
}
else
{
while ()
{
if (flag[yu] == -)//找到一个空位置
{
a[yu] = x;
flag[yu] = ;
break;
}
yu++;
yu = yu % m;
}
}
}
for (i = ; i < m - ; i++)
{
if (flag[i] == -)
cout << "NULL" << " ";
else
cout << a[i] << " ";
}
if (flag[i] == -)
cout << "NULL" << endl;
else
cout << a[i] << endl;
int k;
cin >> k;
while (k--)
{
int x,count = , loc;
cin >> x;
int yu = x % ;
int find = ;
while (true)
{
if (flag[yu] == -)
{
count++;
break;
}
if (a[yu] == x)
{
count++;
loc = yu;
find = ;
break;
}
count++;
yu++;
yu = yu % m;
}
if (find)
cout << find << " " << count << " " << loc+ << endl;
else
cout << find << " " << count << endl;
}
}
}
DS哈希查找--线性探测再散列的更多相关文章
- 哈希表---线性探测再散列(hash)
//哈希表---线性探测再散列 #include <iostream> #include <string> #include <stdio.h> #include ...
- 线性探测再散列 建立HASH表
根据数据元素的关键字和哈希函数建立哈希表并初始化哈希表,用开放定址法处理冲突,按屏幕输出的功能表选择所需的功能实现用哈希表对数据元素的插入,显示,查找,删除. 初始化哈希表时把elem[MAXSIZE ...
- 哈希查找解决地址冲突的两种最常见方法(线性探测再散列,链地址法)C++实现
#include<iostream>#include<iomanip>using namespace std; typedef struct Node{ int data; s ...
- Python与数据结构[4] -> 散列表[2] -> 开放定址法与再散列的 Python 实现
开放定址散列法和再散列 目录 开放定址法 再散列 代码实现 1 开放定址散列法 前面利用分离链接法解决了散列表插入冲突的问题,而除了分离链接法外,还可以使用开放定址法来解决散列表的冲突问题. 开放定 ...
- JDK8;HashMap:再散列解决hash冲突 ,源码分析和分析思路
JDK8中的HashMap相对JDK7中的HashMap做了些优化. 接下来先通过官方的英文注释探究新HashMap的散列怎么实现 先不给源码,因为直接看源码肯定会晕,那么我们先从简单的概念先讲起 ...
- 【hash】什么是hash,什么是哈希,什么是hash散列,什么是hash一致性算法【关于hash的详解】
什么是hash,什么是哈希,什么是hash散列,什么是hash一致性算法
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测).链地址法.再哈希.建立公共溢出区 标签: hashmaphashmap冲突解决冲突的方法冲突 2016-0 ...
- Hash冲突的线性探测开放地址法
在实际应用中,无论如何构造哈希函数,冲突是无法完全避免的. 开放地址法 这个方法的基本思想是:当发生地址冲突时,按照某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止.这个过程可用下式描述: ...
- Hash(散列函数)简单应用引出解决散列冲突的四种方法
商店允许顾客通过电话订购商品,并在几天后上门自取.商店的数据库使用客户的电话号码作为其检索的关键字(客户知道自己的电话号码,而且这些电话关键字几乎是唯一的).如何组织商店的数据库,以允许更加高效的进行 ...
随机推荐
- hdoj-1022(栈的模拟)
#include <iostream> #include <cstring> #include <algorithm> #include <stack> ...
- C语言--第六周作业评分和总结(5班)
作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1250 一.评分要求 要求1 完成PTA第六周所有题,若存在抄袭现象,倒扣此题 ...
- ODOO区分测试库和正式库的简单方法
ODOO区分测试库和正式库的简单方法.1. 打开 开发者模式,右上角能显示数据库名称,缺点是,太耗系统资源了,数据多的时候就明显感觉慢了.2. 安装社区的显示测试帐套的模块, 若是正式环境还是尽量少装 ...
- js获取元素得几种情况
HTML代码 <div class="divClass" name="myClass"> <input type="password ...
- Myelipse中xml约束文件的导入(以spring为例)
为了在电脑处于未联网状态下,beans.xml中书写标签具有提示功能,需要在电脑本地导入约束文件,下面上图 注意:将location后缀添加到key中beans的后面 注意:导入 context,ao ...
- python------模块定义、导入、优化 ------->sys模块,shutil模块
1.sys模块 import sys sys.argv #命令行参数List,第一个元素是程序本身路径sys.exit(n) #退出程序,正常退出时exit(0).sys.version #获取Pyt ...
- centos7安装部署mysql5.7服务器
因为自带源没有最新版的mysql,所以我们需要自己下载rpm包,先下载下面的rpm包源 https://repo.mysql.com//mysql57-community-release-el7-11 ...
- Python——psutil的使用(获取系统性能信息)
>>> import psutil #导入psutil >>> a=psutil.virtual_memory() >>> a.total #总虚 ...
- 我的vim(持续更新)
保存并退出:wq 退出但不保存修改:q! 不退出vi使用shell(bash)命令:!bash (如果想回到vi,bash下输入exit回车) 设置行号 :set nu 取消行号:set nonu 设 ...
- ClusterControl docker 环境搭建
ClusterControl 是一款比较强大的数据库管理平台,包含了丰富的数据库管理功能. 我们可以用来方便的进行数据管理 测试使用docker-compose 管理 环境准备 docker-comp ...