修炼内功---数据结构与算法21---散列表、散列函数和散列冲突

散列表(HashTable,也叫哈希表),是根据键(Key)直接访问在内存存储位置的数据结构

原理:通过散列函数(也叫哈希函数)将元素的键映射为数组下标(转化后的值叫做散列值或哈希值),然后在对应下标位置存储记录值。当我们按照键值查询元素时,就是用同样的散列函数,将键值转化数组下标,从对应的数组下标的位置取数据:

  • 散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来

  • 可以说,如果没有数组,就没有散列表

  • 而 PHP 的关联数组干脆就是基于散列表实现

散列技术既是一种存储方法,也是一种查找方法。与之前的查找方法不同的是散列技术的记录之间不存在逻辑关系,因此主要是面向查找的数据结构。最适合求解的问题是查找给定值相等的记录。

散列表中有两个关键的概念,一个是散列函数(或者哈希函数),一个是散列冲突(或者哈希冲突)。

散列函数用于将键值经过处理后转化为散列值。具有以下特性:

散列函数计算得到的散列值是非负整数
如果 key1 == key2,则 hash(key1) == hash(key2)
如果 key1 != key2,则 hash(key1) != hash(key2)

所谓散列冲突,简单来说,指的是 key1 != key2 的情况下,通过散列函数处理,hash(key1) == hash(key2),这个时候,我们说发生了散列冲突。设计再好的散列函数也无法避免散列冲突,原因是散列值是非负整数,总量是有限的,但是现实世界中要处理的键值是无限的,将无限的数据映射到有限的集合,肯定避免不了冲突。

事实上,如果不考虑散列冲突,散列表的查找效率是非常高的,时间复杂度是 O(1),比二分查找效率还要高,但是因为无法避免散列冲突,所以散列表查找的时间复杂度取决于散列冲突,最坏的情况可能是 O(n),退化为顺序查找。这种情况在散列函数设计不合理的情况下更糟。

我们会在明天的分享中为大家展示如何设计合理的散列函数及如何避免散列冲突。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值