根据数据元素的关键字和哈希函数建立哈希表并初始化哈希表,用开放定址法处理冲突,按屏幕输出的功能表选择所需的功能实现用哈希表对数据元素的插入,显示,查找,删除。

初始化哈希表时把elem[MAXSIZE]、elemflag[MAXSIZE]和count分别置0。创建哈希表时按哈希函数创建哈希表,输入数据元素的关键字时,以“0”结束输入且要求关键字为正整数,数据元素个数不允许超过表长MAXSIZE。

输出的形式:根据所选择的哈希表的功能输出相应提示语句和正确结果。

程序的功能:将一组个数不超过哈希表长度的数据元素,按其关键字和哈希函数存入哈希表中,如果产生冲突用开放定址法处理并找出相应的地址。能实现用哈希表对数据元素的插入,显示,查找,删除。

测试数据:maxsize=10

哈希函数:H(key)=key%7

处理冲突方法:开放定址法 Hi=(H(key)+di)%13   i=1,2,3,…,9

哈希表又称散列表。哈希表存储的基本思想是:以数据表中的每个记录的关键字 k为自变量,通过一种函数H(k)计算出函数值。把这个值解释为一块连续存储空间(即数组空间)的单元地址(即下标),将该记录存储到这个单元中。在此称该函数H为哈希函数或散列函数。按这种方法建立的表称为哈希表或散列表。

处理冲突的方法:

开放寻址法:Hi=(H(key) + di) MOD m, i=1,2,…, k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为增量序列,可有下列三种取法:

1.di=1,2,3,…, m-1,称线性探测再散列;

2.di=1^2, (-1)^2, 2^2,(-2)^2, (3)^2, …, ±(k)^2,(k<=m/2)称二次探测再散列;

3.di=伪随机数序列,称伪随机探测再散列。

再散列法:Hi=RHi(key), i=1,2,…,k. RHi均是不同的散列函数,即在同义词产生地址冲突时计算另一个散列函数地址,直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间;

链地址法(拉链法):将所有关键字为同义词的记录存储在同一线性链表中;

建立一个公共溢出区

#include <iostream>

using namespace std;

#include <math.h>

#include <stdio.h>

#include <stdlib.h>

#define MAXSIZE 10

#define SUCCESS 1

#define UNSUCCESS 0

typedef struct

{  int elem[MAXSIZE];

int elemflag[MAXSIZE];

int count;

}HashTable;

void InitialHash(HashTable &H)/*哈希表初始化*/

{     int i;

H.count=0;

for(i=0;i<MAXSIZE;i++)

{   H.elem[i]=0;

H.elemflag[i]=0;

}

}

int Hash(int kn) /*哈希函数H(key)=key MOD 7*/

{   return (kn%7);

}

int SearchHash(HashTable &H,int k) /*查找关键字为k的元素*/

{  int t,s;

s=t=Hash(k);

xun:     if(H.elem[t]==k&&H.elemflag[t]==1) return SUCCESS;

else  if(H.elem[t]!=k&&H.elemflag[t]==1)

{   t=(t+1)%MAXSIZE;

goto xun;

}

else return UNSUCCESS;

}

int InsertHash(HashTable &H,int e)/*插入元素e*/

{      int p;

p=Hash(e);

if(SearchHash(H,e) )

{     cout<<"已有此数!"<<endl;

return UNSUCCESS;

}

else

{  H.elemflag[p]=1;

H.elem[p]=e;

H.count++;

return SUCCESS;

}

}

void CreateHash(HashTable &H)/*创建哈希表*/

{  int s;

int e;

cout<<"请输入哈希表:(输入0结束!)"<<endl;

cin>>e;

while(e)

{   s=InsertHash(H,e);

if(!s)

{     cout<<"此数已存在!";

cin>>e;

}

else

cin>>e;

}

}

void PrintHash(HashTable H) /*显示元素及其位置*/

{  cout<<"哈希表地址:";

int i;

for(i=0;i<MAXSIZE;i++)

cout<<i<<"  ";

cout<<endl<<"关键字:     ";

for(i=0;i<MAXSIZE;i++)

cout<<H.elem[i]<<"  ";

cout<<endl<<"关键字标志:";

for(i=0;i<MAXSIZE;i++)

cout<<H.elemflag[i]<<"  ";

}

int DeleteHash(HashTable &H,int e) /*删除元素e*/

{  int i;

int a=0;

for(i=0;i<MAXSIZE;i++)

if(H.elem[i]==e&&H.elemflag[i]==1)

{   H.elemflag[i]=2;

H.count--;

H.elem[i]=0;

a++;

return SUCCESS;

}

if(!a)

{  cout<<"无此数!"<<endl;

return 0;//return UNSUCCESS;

}

return 0;

}

void main()

{  HashTable H;

int m,k,p;

int R;

do{cout<<endl<<"\t\t******************请选择功能********************"<<endl;

cout<<"\t\t\t1.初始化哈希表"<<endl<<"\t\t\t2.创建哈希表"<<endl<<"\t\t\t3.查找"

<<endl<<"\t\t\t4.插入"<<endl<<"\t\t\t5.删除"<<endl<<"\t\t\t6.输出哈希表:"<<endl<<"\t\t\t0.退出"<<endl;

cout<<"\t\t************************************************"<<endl;

cin>>m;

switch(m)

{     case 1: InitialHash(H);break;

case 2: CreateHash(H);break;

case 3: cout<<endl<<"请输入要查找的关键字:";

cin>>k;

p=SearchHash(H,k);

if(p) cout<<"查找成功!"<<endl;

else cout<<"查找失败!"<<endl;

break;

case 4: cout<<endl<<"请输入要插入的关键字:";

cin>>R;

p=InsertHash(H,R);

if(p) cout<<"插入成功!"<<endl;

else cout<<"插入失败!"<<endl;

break;

case 5: cout<<"请输出要删除的关键字:";

cin>>R;

p=DeleteHash(H,R);

if(p) cout<<"删除成功!"<<endl;

else  cout<<"删除失败!"<<endl;

break;

case 6: PrintHash(H);break;

case 0: break;

default: cout<<endl<<"选择错误!";break;

}

}while(m!=0);

}

线性探测再散列 建立HASH表的更多相关文章

  1. 哈希表---线性探测再散列(hash)

    //哈希表---线性探测再散列 #include <iostream> #include <string> #include <stdio.h> #include ...

  2. DS哈希查找--线性探测再散列

    题目描述 定义哈希函数为H(key) = key%11.输入表长(大于.等于11),输入关键字集合,用线性探测再散列构建哈希表,并查找给定关键字. --程序要求-- 若使用C++只能include一个 ...

  3. 哈希查找解决地址冲突的两种最常见方法(线性探测再散列,链地址法)C++实现

    #include<iostream>#include<iomanip>using namespace std; typedef struct Node{ int data; s ...

  4. JDK8;HashMap:再散列解决hash冲突 ,源码分析和分析思路

    JDK8中的HashMap相对JDK7中的HashMap做了些优化. 接下来先通过官方的英文注释探究新HashMap的散列怎么实现 先不给源码,因为直接看源码肯定会晕,那么我们先从简单的概念先讲起   ...

  5. 哈希表(散列表)—Hash表解决地址冲突 C语言实现

    哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.具体的介绍网上有很详 ...

  6. Python与数据结构[4] -> 散列表[2] -> 开放定址法与再散列的 Python 实现

     开放定址散列法和再散列 目录 开放定址法 再散列 代码实现 1 开放定址散列法 前面利用分离链接法解决了散列表插入冲突的问题,而除了分离链接法外,还可以使用开放定址法来解决散列表的冲突问题. 开放定 ...

  7. 《数据结构与算法分析——C语言描述》ADT实现(NO.05) : 散列(Hash)

    散列(Hash)是一种以常数复杂度实现查找功能的数据结构.它将一个关键词Key,通过某种映射(哈希函数)转化成索引值直接定位到相应位置. 实现散列有两个关键,一是哈希函数的选择,二是冲突的处理. 对于 ...

  8. oracle的散列聚簇表

    在簇表中,Oracle使用存储在索引中的键值来定位表中的行, 而在散列聚簇表中,使用了散列函数代替了簇索引,先通过内部函数或者自定义的函数进行散列计算,然后再将计算得到的码值用于定位表中的行. 创建散 ...

  9. Redis数据类型之散列类型hash

    在redis中用的最多的就是hash和string类型. 问题 假设有User对象以JSON序列化的形式存储到redis中, User对象有id.username.password.age.name等 ...

随机推荐

  1. iOS UITextField的returnkey点击事件

      关于隐藏软键盘,网上的办法良莠不齐,大多是通过实现UITextFieldDelegate来隐藏软键盘,该方法代码较多,且在文本框很多的时不好处理.我经过搜索与摸索,找到了最佳的处理办法.(引用的) ...

  2. HDU5008 Boring String Problem(后缀数组 + 二分 + 线段树)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5008 Description In this problem, you are given ...

  3. Codeforces 528D Fuzzy Search(FFT)

    题目 Source http://codeforces.com/problemset/problem/528/D Description Leonid works for a small and pr ...

  4. Shell 编程基础之 Until 练习

    一.语法 until [ condition ] # 和while相反,当 condition 条件成立时,就终止回圈, 否则就持续进行回圈的程序段 do #执行内容 done 二.练习 输入用户输入 ...

  5. IsPostback的原理

    ispostback:就是判断页面是首次加载的,还是数据回发(有get或者post请求过的)后的页面.上代码吧,直观点. 1.asp.net页面 <body> <form id=&q ...

  6. CF#335 Board Game

    Board Game time limit per test 2.5 seconds memory limit per test 256 megabytes input standard input ...

  7. 【原】iOS学习之XML与JSON两种数据结构比较和各自底层实现

    1.XML与JSON两种数据结构的优缺点 1> XML 优点:
 格式统一, 符合标准
 容易与其他系统进行远程交互, 数据共享比较方便 
 缺点: XML文件格式文件庞大, 格式复杂, 传输占 ...

  8. 几个Windows电脑小技巧

    1. 为cmd命令提示符设置默认的初始路径: 到开始菜单-附件-属性  里面有起始位置选项 其中%HOMEDRIVE%%HOMEPATH%就代表起始位置 如想每次键cmd进入命令提示符后的初始位置是 ...

  9. [NOIP2015]运输计划 D2 T3 LCA+二分答案+差分数组

    [NOIP2015]运输计划 D2 T3 Description 公元2044年,人类进入了宇宙纪元. L国有n个星球,还有n-1条双向航道,每条航道建立在两个星球之间,这n-1条航道连通了L国的所有 ...

  10. [转]redis-cluster研究和使用--待研究

    转自:http://hot66hot.iteye.com/blog/2050676 一:关于redis cluster 1:redis cluster的现状 reids-cluster计划在redis ...