散列表查找的一个实例

这里解决冲突的方法是开放地址法:“开放地址指的是表中尚未被占用的地址,开放地址法就是当冲突发生时候,形成一个地址序列,沿着这个序列逐个进行探测,直到找到一个空的开放地址,将发生冲突的关键字存放到该地址中去,即Hi=(H(key)+di)%m,i=1,2,..k(k<=m),其中H(key)为散列函数,m为散列表长,di为增量序列。

例题:选取散列函数H(K)=(3K)%11,用开放地址处理冲突,d1=H(K);di=(di+(7K)%10+1)%11(i=2,3,..),试着在HT[0,..10]的散列地址空间对关键字{22,41,53,46,30,13,1,67}构造散列表,并求出在等概率下查找成功的平均长度,并设计构造散列表的完整算法程序。

测试数据:{22,41,53,46,30,13,1,67}

输出:i=0 22 i=1 13 i=2 41 i=3 1 i=4 30 i=5 53 i=6 46 i=10 67

cs=18   ASL=2.25

1算法思想:构造散列表是根据散列表函数核处理冲突的方法,将不同关键字的记录存储到不同的散列表地址的过程,所以主要操作是运用散列函数求出散列地址,如果冲突解决冲突,确保不同关键字的记录存储到不同的散列地址。

2.数据结构和散列函数及冲突解决方法选:取散列函数H(K)=(3K)%11,用开放地址处理冲突,d1=H(K);di=(di+(7K)%10+1)%11(i=2,3,..)

3.模块划分 (1)散列空间数组的初始化InitHash;(2)散列函数Hash  (3)插入函数InsertHash  (4)查找函数SearchHash  (5)主函数

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define n 8
 4 #define  m 11
 5 void InitHash(int HT[])
 6 {
 7 /*对存储记录的散列表数组用整数0初始化*/
 8 int i;
 9 for(i=0;i<m;i++)
10     HT[i]=0;
11 }
12 int Hash(int key)
13 {
14     /*散列函数*/
15     return (3*key)%m;
16 }
17 void InsertHash(int HT[],int key)
18 {
19     /*插入函数,将key插入散列表HT中*/
20     int d,s1,d1,h,temp;
21     h=Hash(key);/*调用散列函数计算散列地址*/
22     s1=d1=h;/*保留散列地址,以备解决冲突时使用*/
23     if(HT[h])/*判断是否冲突,如果冲突,用开放地址法第一次解决冲突*/
24         h=(d1+s1)%m;
25     d=d1;
26     while(HT[h])
27     {
28         /*解决第二次及以后冲突*/
29         temp=d;
30         d=(temp+(7*key)%10+1)%m;/*计算di(i=2,3..)*/
31         h=(s1+d)%m;
32     }
33     HT[h]=key;
34
35 }
36 int searchHash(int HT[],int key)
37 {
38     /*在散列表中查找key,如果找到,返回比较次数,否则返回-1*/
39     int d,s1,d1,h,temp,sum;
40     h=Hash(key);
41     s1=h;d1=s1;d=d1;
42     if(HT[h]==key) return 1;
43     else{
44         h=(d1+s1)%m;
45         if(HT[h]==key)return 2;
46        sum=1;
47        while(HT[h])
48        {
49            if(HT[h]==key)return ++sum;
50            else{
51             sum++;temp=d;
52             d=(temp+(7*key)%10+1)%m;
53             h=(s1+d)%m;
54            }
55        }
56     }
57     return -1;
58 }
59 int main()
60 {
61    // printf("Hello world!\n");
62    /*输出每个记录在散列表中的位置,并计算出总的查找次数和平均查找长度*/
63    int x[n]={22,41,53,46,30,13,1,67};
64    int ht[m],sum,i;
65    double cs;
66    InitHash(ht);
67    for(i=0;i<n;i++)
68        InsertHash(ht,x[i]);
69    for(i=0;i<m;i++)
70     if(ht[i]!=0)
71     printf("i=%d %d ",i,ht[i]);
72
73     printf("\n");
74     cs=0;
75     for(i=0;i<n;i++){
76         sum=searchHash(ht,x[i]);
77         if(sum!=-1)
78             cs+=sum;
79     }
80     printf("cs=%f\n",cs);
81     printf("ASL=%f\n",(cs)/n);
82     return 0;
83 }

读书笔记= =

时间: 2024-10-10 10:17:48

散列表查找的一个实例的相关文章

大话数据结构—散列表查找(哈希表)

一.基本概念 散列技术:在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key). f:散列函数/哈希函数: 采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表. 关键字对应的记录存储位置称为散列地址. 散列技术既是一种存储方法,也是一种查找方法. 散列技术适合求解问题是查找与给定值相等的记录.查找速度快. 散列技术不适合范围查找,不适合查找同样关键字的记录,不适合获取记录的排序,最值. 冲突:关键字key1不等于k

数据结构复习之散列表查找(哈希表)

一.散列表相关概念 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key).公式如下: 存储位置 = f(关键字) 这里把这种对应关系f称为散列函数,又称为哈希(Hash)函数.按这个思想,采用散列技术将记录存在在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表.那么,关键字对应的记录存储位置称为散列地址. 散列技术既是一种存储方法也是一种查找方法.散列技术的记录之间不存在什么逻辑关系,它只与关键字有关,因此,散列主要是面向查

数据结构之散列表查找

数据结构之--散列表查找 定义:通过某个函数f,使得 ?    ?    ?存储位置=f(关键字) ?    ?    ?这样我们可以通过查找关键字不需要比较久可以获得需要记录的存储位置.这就是一种新的存储技术--散列技术. ?    ?    ?散列技术在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key).查找时根据这个确定的对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上. ?    ? 

查找 之 散列表查找(哈希表)

基础概念 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key).这里对应关系f称为散列函数,又称为哈希(Hash)函数. 采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table). 散列技术既是一种存储方法,也是一种查找方法. 散列技术最适合的求解问题是查找与给定值相等的记录.不适合一对多的查找,也不适合范围查找. 散列技术中的两个关键问题: 设计一个简单.均匀.存储利用率高的散列函数

数据结构—散列表查找(哈希)

顺序表查找某个关键字的记录时,要从表头开始,挨个的比较a[i]与key的值时"="还是"≠",直到相等才返回i,表示查找成功,例如我们可以通过a[i]与key相比结果的 大或者小来进行折半查找到序列的下标:再通过顺序存储的存储位置计算法:LOC (ai)=LOC(a1)+(i-1)×c,得到内存地址,此时发现为了查找到结果,""比较"都是不可避免的,但是真的有必要吗?能否直接通过关键字Key找到记录的内存地址呢?答案是有的! 散列表概念

查找五:散列表查找

1 //散列表 2 #include<iostream> 3 using namespace std; 4 #define NULLKEY -32768 5 #define HASHSIZE 12 //定义散列表长度为12 6 7 struct HashTable 8 { 9 int *elem; //数据元素存储基址 10 int count; //当前数组元素个数 11 }; 12 13 int m = 0; //散列表长度 14 15 //初始化散列表 16 bool InitHashT

8.4散列表查找

散列存储中使用的函数H(key)称为散列函数或哈希函数,它实现关键字到存储地址的映射(或称转换). 删除.插入都很不方便 查找最方便O(1) C++实现散列表查找 1 #include "Hash.h" 2 #include "Hashnode.h" 3 4 template<class T> 5 int Hash<T>::myhash(int key)//求余 6 { 7 return key%n; 8 } 9 10 template<

9-12-哈希查找表/散列表-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第9章  查找 - 哈希查找表/散列表 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Base.c        相关测试数据下载  链接? 数据包      

python 散列表查找

class HashTable: def __init__(self, size): self.elem = [None for i in range(size)] self.count = size # def hash(self, key): return key % self.count # def insert_hash(self, key): address = self.hash(key) # while self.elem[address]: # address = (addres