哈希查找解决地址冲突的两种最常见方法(线性探测再散列,链地址法)C++实现
#include<iostream>
#include<iomanip>
using namespace std;
typedef struct Node
{
int data;
struct Node *next;
}node;
int len,num,M,numbers,i=0,mod,count=0;
int *a;
node **p,*s;
float ASL=0,ASL1=0;
int ListLength(node * head)
{
int length=0;
node *p;
p=head;
while(p)
{
length++;
p=p->next;
}
return length;
}
void Insert(node * &head,node * s)
{
node *p;
p=head;
while(p->next)
{
p=p->next;
}
p->next=s;
}
void Print(node * head)
{
node *p;
p=head;
while(p)
{
cout<<"->"<<p->data;
p=p->next;
}
}
void f1()
{
cout<<"Input HashTable address length:";
cin>>len;
cout<<"Input the value of M in Hash function H(k)=k%M:";
cin>>M;
a=new int[len];
cout<<"Input the number of data to be hashed into the hash table:";
cin>>numbers;
for(i=0;i<len;i++)
{
a[i]=-1;
}
cout<<"please input the keys:";
for(i=1;i<=numbers;i++)
{
cin>>num;
mod=num%M;
if(a[mod]==-1)
{
a[mod]=num;
ASL+=1;
}
else
{
while(a[(++mod)%len]!=-1)
{
count++;
}
a[mod]=num;
ASL+=(count+2);
}
}
for(i=0;i<len;i++)
{
count=0;
if(a[i]==-1)
ASL1+=0;
else
{
int j=i;
while(a[(++j)%len]!=-1)
{
count++;
}
ASL1+=(count+1);
}
}
cout<<"the hash table is as followed:"<<endl<<endl;
cout<<"HashAddress";
for(i=0;i<len;i++)
{
cout<<setw(4)<<i;
}
cout<<endl;
cout<<" Key ";
for(i=0;i<len;i++)
{
if(a[i]==-1)
cout<<setw(4)<<'\0';
else
cout<<setw(4)<<a[i];
}
cout<<endl<<endl;
cout<<"Hash search successfully using linear detection method to resolve conflicts and the average search length ASL is:";
cout<<(float)ASL/numbers<<endl;
cout<<"Hash search unsuccessfully using linear detection method to resolve conflicts and the average search length ASL is:";
cout<<(float)ASL1/len<<endl;
}
void f2()
{
cout<<"input HashTable address length:";
cin>>len;
p=new node*[len];
cout<<"Input the value of M in Hash function H(k)=k%M:";
cin>>M;
cout<<"Input the number of key to be hashed into the hash table:";
cin>>numbers;
for(i=0;i<len;i++)
{
p[i]=NULL;
}
cout<<"please input the keys:";
for(i=0;i<numbers;i++)
{
cin>>num;
mod=num%M;
if(p[mod]==NULL)
{
p[mod]=new node;
p[mod]->data=num;
p[mod]->next=NULL;
ASL+=1;
}
else
{
s=new node;
s->data=num;
s->next=NULL;
Insert(p[mod],s);
ASL+=ListLength(p[mod]);
}
}
for(i=0;i<len;i++)
{
if(p[i]==NULL)
ASL1+=0;
else
ASL1+=ListLength(p[i]);
}
cout<<"the hash table is as followed:"<<endl<<endl;
for(i=0;i<len;i++)
{
cout<<setiosflags(ios::left)<<setw(3)<<i;
if(p[i]==NULL)
cout<<'^'<<endl;
else
{
Print(p[i]);
cout<<endl;
}
}
cout<<endl;
cout<<"Hash search successfully using chain address method to resolve conflicts and the average search length ASL is:";
cout<<(float)ASL/numbers<<endl;
cout<<"Hash search unsuccessfully using chain address method to resolve conflicts and the average search length ASL is:";
cout<<(float)ASL1/len<<endl;
}
void main()
{
int choice;
cout<<"1.Linear detection and re hash "<<endl;
cout<<"2.separate chaining "<<endl;
cout<<"please choose a method to solve the address conflict:";
cin>>choice;
system("cls");
switch(choice)
{
case 1:f1();break;
case 2:f2();break;
default:cout<<"input error!"<<endl;break;
}
}
若有不足欢迎指正;若有疑问鄙人也乐于解答,欢迎留言或QQ加群!
欢迎加入QQ群:735472015,群内有VC,MFC,win32API,批处理,python学习资料干货喔
题目描述 定义哈希函数为H(key) = key%11.输入表长(大于.等于11),输入关键字集合,用线性探测再散列构建哈希表,并查找给定关键字. --程序要求-- 若使用C++只能include一个 ... //哈希表---线性探测再散列 #include <iostream> #include <string> #include <stdio.h> #include ... JDK8中的HashMap相对JDK7中的HashMap做了些优化. 接下来先通过官方的英文注释探究新HashMap的散列怎么实现 先不给源码,因为直接看源码肯定会晕,那么我们先从简单的概念先讲起 ... GET和POST两种基本请求方法的区别 GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过req ... 原文地址:GET和POST两种基本请求方法的区别 原文如下: GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL ... 在网页制作中,细边框这个制作方法是必不可少的.这里介绍2种常见的表格细边框制作方法,均通过XHTML验证. <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ... 之前在一些开发者平台使用网页调用API时,一再提到两种请求方法GET和POST,所以就去了解了下.那么这又不得不提到HTTP了! 一.什么是 HTTP? 超文本传输协议(HTTP)的设计目的是保证客户 ... 1,整理了一下怎么修改linux 两种时间的方法. 硬件时间:hwclock 或者clock,设置的方法是 hwclock --set --date="05/12/2018 12:30:50 ... (一)线性探测法 线性探测法是最简单的处理冲突的方法. (1)插入元素:插入元素时,如果发生冲突,算法将从该槽位向后遍历哈希表,直到找到表中的下一个空槽,并将该值放入到空槽当中. (2)查找元素:查找 ... 原文:http://blog.csdn.net/panpan639944806/article/details/20135311 有两种可能: 1.未加头文件 #include <stdio.h ... 1. 查看信息 1.1 查看磁盘信息 在linux中如果需要查看磁盘信息,需要使用df和du命令. df: 列出文件系统中整个磁盘的使用量 du:评估文件系统中磁盘的使用量,经常用来推算目录所占的容量 ... 重视Code Review 极致--目标是成为优秀的开发者 Data tells a story!(数据会讲故事) 分析过程对于建模非常的重要,可以帮助我们减少实际上不相关的特征被错误的加入到模型中, ... 接着之前讲解的基础内容,应该对小程序有了一点了解.想深入了解的话,需要自己实际操作一遍比较好.首先了解官方给的组件,API等这样等顺序来比较好一些.下面贴两张demo图,demo的项目结构是设置的两个 ... 若要进行形状保护,需要能看到“开发工具”选项卡.默认情况下,该选项卡是隐藏的. 查看“开发工具”选项卡 单击“文件”选项卡. 单击“选项”. 单击“高级”,然后向下滚动到“常规”部分. 选择“以开发人 ... 今天创建了一个新的ASPNET MVC 项目部署到本地, 生成成功后在浏览器中输入URL却发现报这个错 参照下面的文章我给IIS_IUSRS和IUSR(我比较懒直接everyone)赋予虚拟目录读写权 ... <html> <head> <title>漂浮广告</title> <body> <div id="codefans_net ... 只要是使用git操作,不管是同步,拉去,克隆,vscode总让我们输入用户名及密码,是一件很繁琐的事情 我们打开终端,会看到cmd定位在我们仓库位置,我们只要添加:git config --globa ... 一.环境需求 主机A: zabbix-server 主机B: zabbix-agent/mysql从 二.主机B操作 1.添加监控脚本 vim /data/zabbix/mysql_slave_che ... No way is impossible to courage. 勇敢面前没有通不过的路. Without faith and courage, nothing is possible. With t ...哈希查找解决地址冲突的两种最常见方法(线性探测再散列,链地址法)C++实现的更多相关文章
随机推荐