数据结构——哈希表

哈希表是一种数据结构,通过关键码值映射到特定位置实现快速访问。通常使用O(1)复杂度进行插入、删除和查找操作。本文重点介绍了两种哈希冲突解决方法:1. 除留余数法,通过关键字对不超过表长的素数取模确定地址;2. 链地址法,将冲突的关键字放入同义词链表中。博客还探讨了如何选择合适的p值以及链地址法中指针数组的应用。
摘要由CSDN通过智能技术生成

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。它可以用O(1)的复杂度进行数据的插入删除和查找,但是 hash 表不保证表中数据的有序性,这样在 hash 表中查找最大数据或者最小数据的时间是 O(N) 。网上有很多关于怎么映射和处理冲突,我觉得掌握以下两种基本就可以了:

1.除留余数法:

取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即 H(key) = key MOD p,p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。

2.链地址法(拉链法):

当存储结构是链表时,多采用拉链法,用拉链法处理冲突的办法是:把具有相同散列地址的关键字(同义词)值放在同一个单链表中,称为同义词链表。有m个散列地址就有m个链表,同时用指针数组T[0..m-1]存放各个链表的头指针,凡是散列地址为i的记录都以结点方式插入到以T[i]为指针的单链表中。T中各分量的初值应为空指针。

这个博客写的很好:还有一些高级算法

除留余数法:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define hashsize 32
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值