1.什么是散列表?

散列表(HashTable,也叫哈希表):由数组扩展而来,是根据键(Key)直接访问在内存存储位置的数据结构。

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

图示:

2.什么是散列函数?

2.1概念解释

散列函数其实就是一个数学算法,把无穷的区间内的数据,经过散列函数计算后,均匀分到一个有限区间内。 散列表中有两个关键的概念,一个是散列函数(或者哈希函数),一个就是下面的散列冲突(或者哈希冲突)。

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

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

图示:

2.2 常见散列函数(哈希函数)

2.2.1直接定址法 

2.2.2除留余数法 

2.2.3数字分析法 

2.2.4平方取中法 

2.2.5折叠法(叠加法) 

2.2.6随机数法 

构造哈希函数的方法很多,实际工作中要根据不同的情况选择合适的方法,总的原则是尽可能少的产生冲突。通常考虑的因素有关键字的长度和分布情况、哈希值的范围等。

        当关键字是整数类型时就可以用除留余数法;如果关键字是小数类型,选择随机数法会比较好。

3.什么是散列冲突?以及如何避免冲突?

3.1概念理解

散列函数总是将不同的键映射到数组的不同位置,但是实际上,几乎不可能编写出这样的散列函数。

举例说:有一个数组,它包含26个位置,即是26个英文字母的顺序。你可以使用简单的散列函数,按字母表顺序分配数组的位置。如果你要将苹果的价格存储到散列表中,自然是第一个位置(Apple),把香蕉的价格存储到其中,自然是第二个位置(Banner),看着很顺利,但是当我们存储梨(Ayocados)时,分配的位置又是第一的位置,这很显然和苹果冲突了,这就是冲突

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

3.2 如何避免散列冲突?

(1)较低的填装因子

填装因子计算公式:填装因子=散列表中的元素数 / 位置总数

比如:数组有五个位置,已占用的有两个位置,那么填装因子=2/5=0.4

如果填装因子等于1,就是刚好装满,如果大于1,意味着数量超过了数组的位置数,你就需要添加位置(调整长度)。填装因子越低,发生冲突的可能性越小,散列表的性能越高。一个不错的经验规则是:一旦填装因子大于0.7,就应该调整散列表的长度。

(2)良好的散列函数

良好的散列函数让数组中的值呈均匀分布,映射的范围尽可能大。糟糕的散列函数让值扎堆,导致大量的冲突。

良好的散列函数有哪些?

*开放地址法:

key哈希后,发现该地值已被占用,可对该地址不断加1,直到遇到一个空的地址。

*再哈希法:

发生“碰撞”后,可对key的一部份再进行哈希处理。

*链地址法(拉链法​​​​​​​):

链地址法是通过将key映射在同一地址上的value,做成一个链表,这是常用的方法。

4.应用场景有哪些?

4.1.将散列表用于查找

散列表适用于模拟映射关系,可以用查找。比如手机查找电话的案例,根据姓名映射电话号码来查找电话;还有根据域名映射IP来查找网站等

4.2防止重复

比如投票的案例:哪些人投过票,防止重复投票,就可以利用散列表。首先创建一个散列表,用于记录已投票的人,有人来投票时,检查他是否在散列表中,如果在里面返回true;否则返回false。

4.3将散列表用于缓存

缓存是一种常用的的加速方式,所有大型网站都是用缓存,而缓存的数据则存储在散列表中。当你访问网站时,他首先检查散列表中是否存储了该页面,存储的有就发送缓存中的数据,没有才让服务器做处理。

参考网址:散列表、散列函数和散列冲突 - 龙福 - 博客园

散列表、散列函数和散列冲突以及应用场景(一文看懂)相关推荐

  1. angular 字符串转换成数字_一文看懂Python列表、元组和字符串操作

    好文推荐,转自CSDN,原作星辰StarDust,感觉写的比自己清晰-大江狗荐语. 序列 序列是具有索引和切片能力的集合. 列表.元组和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力 ...

  2. 考研数据结构之查找(9.8)——练习题之使用散列函数H(k)= 3k mod 11并采用链地址法处理冲突并构造散列表及设计散列表的完整算法(C表示)

    题目 使用散列函数: H(k)= 3*k mod 11 并采用链地址法处理冲突.试对关键字序列(22, 41, 53, 46, 30, 13, 01, 67)构造散列表,求等概率情况下查找成功的平均查 ...

  3. 散列表(二):冲突处理的方法之链地址法的实现

    首先需要澄清的一点是,这里讲的是hash table ,即数据项所存储的表要用数组来实现. 一.链地址法 这种基本思想:将所有哈希地址为i 的元素构成一个称为同义词链的链表,并将链表的头指针存在哈希表 ...

  4. 手机导航列表页面瀑布流图片无限加载代码_搭建内容管理系统CMS(3):从原理、需求到设计,一文看懂动态化页面...

    Sue前面分享的两篇文章,介绍了内容管理系统(CMS)关于内容生产和内容过滤的部分.那么被生产出来并通过过滤的内容,如何呈现给我们的内容消费者呢? 我们都知道,在客户端上的开发实现,版本一旦发布了出去 ...

  5. c 提取引号中间的字符串_Python | 一文看懂Python列表、元组和字符串操作

    好文推荐,转自CSDN,原作星辰StarDust 序列 序列是具有索引和切片能力的集合. 列表.元组和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力. 列表.元组.字符串都属于序列 ...

  6. 一文看懂Python(一)-----列表和元组篇

    一.列表 1.1 创建一个列表 member = ['胖虎','大熊','小夫','小叮当','小妹妹'] member 1.2 创建一个混合列表 mix = [1,'胖虎','3.14',[1,2, ...

  7. angular 字符串转换成数字_Python | 一文看懂Python列表、元组和字符串操作

    好文推荐,转自CSDN,原作星辰StarDust 序列 序列是具有索引和切片能力的集合. 列表.元组和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力. 列表.元组.字符串都属于序列 ...

  8. python元组和列表的联系_Python | 一文看懂Python列表、元组和字符串操作

    好文推荐,转自CSDN,原作星辰StarDust 序列序列是具有索引和切片能力的集合. 列表.元组和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力. 列表.元组.字符串都属于序列 1 ...

  9. 散列表(哈希表)(散列函数构造、处理冲突、查找)

    本文转载自: [1]https://blog.csdn.net/qq_22238021/article/details/78258605 [2]https://blog.csdn.net/duan19 ...

最新文章

  1. “一线城市,年薪30万+,我却裸辞回老家”一个前程序员的 10 年职业思考
  2. 外企员工职场跃迁:他们将目光转向杭州 转向云计算
  3. 树莓派4视频输出接口_树莓派第四代来啦!4G内存、支持双屏4K输出和H265硬解
  4. 巨杉数据库 CTO 王涛:区块链+数据库,底层技术融合是否带来更大爆发?
  5. Spark一些组件的定义
  6. MANet:盲图像超分辨率中空间变异核估计的互仿射网络(ICCV 2021)
  7. 【Shell脚本】TDS离线备份还原
  8. CTCS列控系统原理--详细学习笔记
  9. 天擎终端安全管理系统未授权访问SQL注入漏洞
  10. 世界上最复杂的函数_世界上最伟大的10个公式,其中一个人尽皆知
  11. 学编程有什么用?零基础小白可以学吗?
  12. vue的过渡动画(有vue的动画库和ui库的介绍)
  13. 高颜值无线蓝牙耳机,南卡N2S芯片强劲音质好,还能当充电宝用
  14. iOS 直播类,交友类,陪玩类 app 上架攻略
  15. 教你 IntelliJ IDEA 永久激活,建议收藏!(转)
  16. 第四天:关看门狗、设置栈、控制icache、重定位、链接脚本
  17. 如何用最低的成本成就最高流量系列 各种线上推广手段的投入产出比数字公布(IreSearch.cn/龚文祥)(推荐帖)
  18. 《Adobe Fireworks CS6中文版经典教程》——第1课 了解工作区1.1熟悉Adobe Fireworks...
  19. 痞子衡嵌入式:微处理器CPU性能测试基准(Dhrystone)
  20. Spring官网下载SpringFramework

热门文章

  1. lvds单8转双8芯片_LVDS驱动芯片
  2. 老版三星笔记本识别不到U盘启动解决办法
  3. lyx安装(需先安装texlive)2021-03-14
  4. seetaface6 GPU版本windows编译
  5. kurento和打洞的服务器的安装及部署
  6. 重庆华侨城携手T.M.D PCP 发财潮流文化节2.0国庆重磅来袭
  7. joycon手柄拆解_任天堂Switch手柄腕带勿装反 取下需技巧
  8. AI大事件 | Geoffrey Hinton决定抛弃反向传播,预期策略梯度算法
  9. 利用Google Chrome滚动截屏,截取整个网页
  10. 单源最短路径(1):Dijkstra算法