数据结构Hash--开放定址法

开放定址法是处理哈希表中冲突的一种方法,允许发生冲突的元素寻找空闲存储单元。它涉及线性探测、二次探测和伪随机探测等策略,确保找到可用位置。线性探测再散列的示例展示了如何在冲突发生时找到新的哈希地址。
摘要由CSDN通过智能技术生成

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数
开放定制法也是处理构造哈希表中关键字的哈希地址冲突的一种有效方法。
开放定址法就是从发生冲突的那个单元开始,按照一定的次序,从哈希表中查找出一个空闲的存储单元,把发生冲突的待插入元素存入到该空闲单元的一类处理冲突的方法。在开放定址法中,哈希表中的空闲单元(假定下标为i)不仅向哈希地址为i的同义词的元素开放,允许它们使用,也向发生冲突的其他元素开放,因它们 的哈希地址不为i,所以称之为非同义词元素。
总之,在开放定址法中,空闲单元不仅向同义词开放,也向发生冲突的非同义词开放,因此称之为开放定址法。
假设哈希表的地址集为0~n-1,冲突是指关键字得到的哈希地址为j(0<=j<=n-1)的位置上已经有关键字存在,则冲突处理就是为该关键字找到一个“空”的哈希地址。在处理冲突的过程中可能得到一个一个地址序列,Hi (i=1,2,3,4…k,),Hi介于0到n-1之间,即在处理哈希地址的冲突时,若得到另一个哈希地址H1仍然发生冲突,则再求下一个地址H2,若H2仍然冲突,则再求H3,以此类推,直至Hk不发生冲突为止,则Hk为记录在表中的地址。

开放定址法主要有三种方法,包括线性探测再散列(即线性探测法),二次探测再散列(即平方探测法)和伪随机探测再散列
这里代码实现的是其中的线性探测再散列:
例如在长度为11的哈希表中,已经填入关键字分别为17,60,29的记录(哈希函数为H(key) MOD 11),现有第四个记录,其关键字为38,由哈希函数得到的哈希地址为5,和关键字为60的哈希地址产生冲突;若用线性探测再散列的方法处理时,得到下一个地址为6,仍冲突;再求下一个地址7,仍然冲突;直到哈希地址为8的位置时,得到一个为“空”的位置,处理冲突的过程结束,并将38插入到哈希表中第8号位置。
这里写图片描述

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int KeyType;
typedef int ValueType;

enum Status
{
    EMPTY,//当前为空
    EXITS,//存在数
    DELETE,//删除了
};

typedef struct HashNode
{
    KeyType _key;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值