哈希表(HashTable)

哈希表(HashTable)是一种高效的数据结构,通过哈希函数将关键码映射到数组中,实现快速查找。常见的冲突解决方法有开散列(拉链法)和闭散列(开放地址法)。哈希表的插入和查找操作时间复杂度为O(1),适用于大量数据的快速检索。哈希函数的选择对冲突的影响较大,良好的哈希函数能保证分布均匀。在字符串处理中,可以使用折叠法或ELFHash等方法。哈希表在解决特定问题如数据排序等方面有广泛应用。
摘要由CSDN通过智能技术生成

1. 哈希表综述:
哈希表(Hash Table)也叫散列表,是根据关键码值直接访问
就是一个把关键码映射到表中的一个位置来访问记录的过程
这个映射函数叫做哈希函数,用hash()表示,存放记录的数组叫做哈希表(一个数组)
哈希表是一种高效的数据结构,主要体现在数据的查找上,几乎可以看成常数时间
例如:对于排序算法,最低时间复杂度为O(nlogn),但是对于一些特殊情况可以更快,现有N个整数(N>10000)范围为0-10000,如何排序?
建立一个数组int num[10000],初始化为0,num[i]表示有多少个数等于i
这样每读入一个数x,num[x]++,最后num[0]-num[10000]依次取出这些数,复杂度为O(n),
这个思想就是hash:将每个对象对应道一个关键值,然后按关键值归类

2. 哈希表的冲突
处理哈希冲突的方法有:开散列和闭散列
1、开散列:也叫拉链法
通俗的说,就是既然元素a和元素b都该放在里面只好挤一挤了,即每个位置存放所有该存放在里面的元素。但是怎么把很多元素放在一个位置呢?只要在位置上放一个链表表头就可以了,该链表里包含所有放在该位置的元素,在实际应用中,往往不把链表做成传统的使用动态内存的结构,而是自己维护一个大数组,给链表元素分配数组下标,这样又方便又节省时间空间
2、闭散列法:也叫开放地址法:
通俗的讲,就是,既然a可以霸占b的位置,b也可以霸占c的位置,不严格按照关键值的hash码来选择位置,而是在位置被占用时按照某种方法另选一个位置,哈希表是将某个对象对应道一个关键值上,可是,不同的对象可能对应道一个相同的关键值,这就叫做哈希冲突。哈希表的大小一般选取p(p为小于表长的最大素数),如果出现两个不同的数对应到同一关键值,例如0和p
注意:可以降哈希表的每一个位置做成一个链表,插入到链表即可,这叫开放散列法
重要:进行哈希查找的时候,先找到每个对象对应的关键值,如果这个关键值有多个对象对应,然后,在沿着这个关键值的链表依次查找对象

3. 哈希表的插入和查找
哈希表的插入和查找几乎是一样的即:
1、计算哈希函数值,得到对应位置 hash(k)
2、从hash(k)开始,使用(如果需要)冲突解决策略定位包含关键字K的记录
3、如果需要插入,把数据插入即可
如果冲突可以忽略不计,两种操作的时间复杂度为O(1)

哈希函数的选取
怎样选取好的hash函数才可以使计

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值