关闭

查找(三)哈希表查找

标签: 哈希查找
293人阅读 评论(0) 收藏 举报
分类:

概念部分不做介绍,具体见严蔚敏《数据结构》。

代码:

//HashSearch.c

#include <stdio.h>
#include <stdlib.h>

//--------------开放定址哈希表存储结构--------

typedef char KeyType;//定义关键字类型
typedef struct{
    KeyType key;
}ElemType;//定义元素类型
int hashsize[] = { 997,... };//哈希表容量递增表,一个合适的素数序列
typedef struct{
    ElemType *elem; //数据元素存储基址
    int count;  //当前数据元素个数
    int sizeindex;  //hashsize[sizeindex]为当前容量
}HashTable;

#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1

//此函数在开放定址哈希表中查找等于关键字key的记录
int SearchHash(HashTable H, KeyType key, int p, int c){
    //在开发定址哈希表H中查找关键字为key的元素。
    //若查找成功,以p指示待查数据元素在在表中的位置,并返回SUCCESS;
    //否则,以p指示插入位置,并返回UNSUCCESS。
    //c用来计冲突次数,其初值为0,供建表时参考

    p = Hash(key);  //求得哈希地址
    while (H.elem[p].key != NULLKEY && key != H.elem[p].key)//地址中有记录,并且关键字不相等
        collision(p, ++c);  //求得下一探查地址p
    if (key == H.elem[p].key)
        return SUCCESS;
    else
        return UNSUCCESS;

}

//data field
int c,p;

//此函数插入数据元素到哈希表
int InsertHash(HashTable H, ElemType e){
    //查找不成功时插入数据元素e到开放定址哈希表H中,并返回SUCCESS
    //若冲突次数过大。则重建哈希表
    c = 0;
    if (SearchHash(H, e.key, p, c))
        return DUPLICATE;//表中已有与e有相同关键字的元素
    else if (c < hashsize[H.sizeindex] / 2){//冲突次数为达到上限,(c的阈值可调)
        H.elem[p] = e;
        H.count++;
        return SUCCESS;
    }
    else{  //重建哈希表
        RecreateHashTable(H);
        return UNSUCCESS;
    }
}
0
0
查看评论

理解哈希表及其查找

以上讨论的查找方法,由于数据元素的存储位置与关键码之间不存在确定的关系,因此,查找时,需要进行一系列对关键码的查找比较,即“查找算法”是建立在比较的基础上的,查找效率由比较一次缩小的查找范围决定。理想的情况是依据关键码直接得到其对应的数据元素位置,即要求关键码与数据元素间存在一一对应关系,通过这个关...
  • zxh2075
  • zxh2075
  • 2016-10-12 13:37
  • 1376

利用哈希表实现数据查找

题目:现在有一个用来存放整数的Hash表,Hash表的存储单位称为桶,每个桶能放3个整数,当一个桶中要放的元素超过3个时,则要将新的元素存放在溢出桶中,每个溢出桶也能放3个元素,多个溢出桶使用链表串起来。此Hash表的基桶数目为素数P,Hash表的hash函数对P取模。 #include using...
  • yangshuangtao
  • yangshuangtao
  • 2015-08-13 12:35
  • 1443

散列表查找(哈希表)的基本操作 (完整代码)

表和二叉树的排序,是利用元素之间的关系,逐个查找,或按一定的规律查找。 而散列表(哈希表),元素之间没有关系,它是利用了元素与存储地址之间的关系。 说白了,就是利用散列函数建立 元素->地址 的映射,然后在我们建立的结构体中,利用数组存储 地址->元素 的关系,来了个数据,用散列函数...
  • fengyanglian
  • fengyanglian
  • 2015-11-05 16:22
  • 1605

查找三 哈希表的查找

要点 哈希表和哈希函数 在记录的存储位置和它的关键字之间是建立一个确定的对应关系(映射函数),使每个关键字和一个存储位置能唯一对应。这个映射函数称为哈希函数,根据这个原则建立的表称为哈希表(Hash Table),也叫散列表。 以上描述,如果通过数学形式来描述就是: 若查找关键字为 ...
  • stu059074244
  • stu059074244
  • 2017-09-01 09:53
  • 115

哈希表查找代码实现

前言博客编写人:Willam 博客编写时间:2017/3/29 博主邮箱:2930526477@qq.com(有志同道合之人,可以加qq交流交流编程心得)1、代码实现的介绍下面我将会实现哈希表的查找代码: 其中我会采取的散列构造函数为最常用的构造函数:除留取余数法 而解决冲突的方法采用以下三种,...
  • qq_35644234
  • qq_35644234
  • 2017-03-29 23:13
  • 781

三大查找算法总结:二分查找,分块查找和哈希表查找。

终于下定决心把查找和排序好好整一整,今天就弄了一个对分查找,也成为对半查找。原理十分简单,话不多说,直接上源代码。未完待续,持续更新中。。。 1、对半查找,要求输入有序序列。 // sort.cpp : 定义控制台应用程序的入口点。 // //-----------------------...
  • XIAXIA__
  • XIAXIA__
  • 2013-06-22 22:06
  • 2709

哈希表的应用之电话本

用哈希表编程实现一个电话本,电话本中记录的数据项为(姓名拼音,电话),例如(LiSi,17012345678)。   要求: 1、用面向对象的方法编程实现电话本类; 2、使用一维数组实现哈希表; 3、取姓名拼音中第一个字母在字母表中的序号作为哈希函数; 4、使用线性探测再散列的方法处理冲突...
  • warrles
  • warrles
  • 2017-06-25 11:00
  • 455

详解哈希表查找

哈希表查找 定义 基本概念 实现方法 1、定义 哈希表查找又叫散列表查找,通过查找关键字不需要比较就可以获得需要记录的存储位置,它是通过在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。即: —存储位置=f(关键字),其中f为哈希函...
  • xiaotan2011929
  • xiaotan2011929
  • 2017-03-12 22:32
  • 1434

哈希表中查找成功和不成功时的平均查找长度如何计算

Question1: 将关键字序列(7、8、30、11、18、9、14)散列存储到散列表中。散列表的存储空间是一个下标从0开始的一维数组,散列函数为: H(key) = (keyx3) MOD 7,处理冲突采用线性探测再散列法,要求装填(载)因子为0.7。 (1) 请画出所构造的散列表...
  • CCCSSSDNNN
  • CCCSSSDNNN
  • 2014-11-30 20:52
  • 1176

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

一、基本概念散列技术:在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。f:散列函数/哈希函数; 采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表。 关键字对应的记录存储位置称为散列地址。散列技术既是一种存...
  • wtyvhreal
  • wtyvhreal
  • 2015-06-10 22:09
  • 1101
    个人资料
    • 访问:192968次
    • 积分:4825
    • 等级:
    • 排名:第7060名
    • 原创:290篇
    • 转载:39篇
    • 译文:0篇
    • 评论:9条
    最新评论