(萌O(∩_∩)O)哈希知识点小结

噶呜~先来了解一下什么是哈希吧?

当我们要在一堆东西中找到想要的那一个东西,我们常常通过比较来找,理想的情况是不经过任何比较,一次就能找到,怎么才能做到这样呢?那就在记录的储存位置和他的关键字之间建立一个确定的对应关系,我们称这种对应关系为哈希函数~小盆友们应该对哈希有了一个初步的印象了吧?其实,哈希函数就是一个映像,设定很灵活,只要使任何关键字由这个哈希函数所得的哈希函数值都落在一定范围内即可。当然,不同的关键字可能得到同一哈希地址,这就出现了所谓的冲突,至于怎么解决这种冲突,稍后就会了解到。

如何构造哈希函数呢?

1.直接定址法:取关键字或关键字的某个线性函数值为哈希地址,这种方法所得的地址集合和关键自己和大小相同,因此,对不同的关键字不会发生冲突,但实际应用中使用很少。

2.除法散列法最直观的一种,公式:index = value % 16,学过汇编的都知道,求模数其实是通过一个除法运算得到的,所以叫“除法散列法”。

3.平方散列法求index是非常频繁的操作,而乘法的运算要比除法来得省时(对现在的CPU来说,估计我们感觉不出来),所以我们考虑把除法换成乘法和一个位移操作。公式:index = (value * value) >> 28   右移,除以2^28。记法:左移变大,是乘。右移变小,是除。如果数值分配比较均匀的话这种方法能得到不错的结果,但我上面画的那个图的各个元素的值算出来的index都 是0——非常失败。也许你 还有个问题,value如果很大,value * value不会溢出吗?答案是会的,但我们这个乘法不关心溢出,因为我们根本不是为了获取相乘结果,而是为了获取index。

4.斐波那契(Fibonacci)散列法,平方散列法的缺点是显而易见的,所以我们能不能找出一个理想的乘数,而不是拿value本身当作乘数呢?答案是肯定的。

1,对于16位整数而言,这个乘数是40503

2,对于32位整数而言,这个乘数是2654435769

3,对于64位整数而言,这个乘数是11400714819323198485

这几个“理想乘数”是如何得出来的呢?这跟一个法则有关,叫黄金分割法则,而描述黄金分割法则的最经典表达式无疑就是著名的斐波那契数列,即如此形 式的序列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,…。另外,斐波那契数列的值和太阳系八大行星的轨道半径的比例出奇吻合。对我们常见的32位整数而言,公式:index = (value * 2654435769) >> 28.

暂时就写这么多了,有不足的还望各位大神多多补充~!

处理冲突的方法:

(1)线性再散列法,简单的按顺序遍历hash表,寻找下一个可用的槽;

(2)非线性再散列法,计算一个新的hash值;

(3)链地址法。

前两种看文字小盆友们应该都能明白了吧?重点讲讲第三种链地址法:

链地址法解决冲突的做法是:如果哈希表空间为 0 ~ m - 1 ,设置一个由 m 个指针分量组成的一维数组 ST[ m ], 凡哈希地址为 i 的数据元素都插入到头指针为 ST[ i ] 的链表中。这种方法有点近似于邻接表的基本思想,且这种方法适合于冲突比较严重的情况。

例: 设有 8 个元素 { a,b,c,d,e,f,g,h } ,采用某种哈希函数得到的地址分别为: {0 , 2 , 4 , 1 , 0 , 8 , 7 , 2} ,当哈希表长度为 10 时,采用链地址法解决冲突的哈希表如下图所示。

大家发现萌点所在了吗?orz~~只是小小总结一下,还有很多不足,多多包涵

(萌O(∩_∩)O)哈希知识点小结,布布扣,bubuko.com

时间: 2024-08-04 17:14:40

(萌O(∩_∩)O)哈希知识点小结的相关文章

PHP自定义框架部分知识点小结(一)

PHP自定义框架部分知识点小结(一) 网络上有大量优秀的MVC框架可供使用,但自定义框架并不是为了开发一个全面的.终极的MVC框架解决方案,而是将它看作是一个很好的从内部学习PHP的机会,在此过程中,将会学习面向对象编程和MVC设计模式,并学习到开发中的一些注意事项. Web MVC的流程体现如下图: 一个典型的Web MVC流程: Controller截获用户发出的请求: Controller调用对应的Model: Model调用DAO(基于PDO操作数据库的封装类)完成状态的读写操作: Co

oracle事务知识点小结

DML语句流程 1 获取事务锁和ITL2 锁定候选行3 生成redo4 生成undo5 生成redo record写入log buffer并更改数据块 事务提交1 分配SCN2 更新事务表,将事务槽状态改为0x093 回收undo块4 创建commit redo record5 将redo从log buffer刷新6 释放表锁和行锁 锁一个事务由1个TX和若干TM组成,而回滚savepoint不会释放TX锁: ITL通过XID指向事务槽,进而指向undo记录,其UBA也指向undo记录:两者区别

MySQL 视图知识点小结

视图本身是一个虚拟表,不存放任何数据.在使用SQL语句访问视图的时候,它返回的数据是MySQL从其他表中生成的.视图和表在同一个命名空间, MySQL在很多地方对于视图和表是同样对待的.不过视图和表也有不同.例如,不能在视图上创建触发器,也不能用DROP TABLE命令删除视图. 视图的实现算法: 合并算法:merge 临时表算法:tmptable 可更新视图(updatable view):可以通过更新视图来更新视图涉及的相关表. 如果视图定义中包含了group by .union.聚合函数.

SpringBoot 系列教程之事务隔离级别知识点小结

SpringBoot 系列教程之事务隔离级别知识点小结 上一篇博文介绍了声明式事务@Transactional的简单使用姿势,最文章的最后给出了这个注解的多个属性,本文将着重放在事务隔离级别的知识点上,并通过实例演示不同的事务隔离级别下,脏读.不可重复读.幻读的具体场景 I. 基础知识 在进入正文之前,先介绍一下事务隔离级别的一些基础知识点,详细内容,推荐参考博文 mysql 之锁与事务 1. 基本概念 以下基本概念源于个人理解之后,通过简单的 case 进行描述,如有问题,欢迎拍砖 更新丢失

【SpringBoot MQ 系列】RabbitMq 核心知识点小结

[MQ 系列]RabbitMq 核心知识点小结 以下内容,部分取材于官方教程,部分来源网络博主的分享,如有兴趣了解更多详细的知识点,可以在本文最后的文章列表中获取原地址 RabbitMQ 是一个基于 AMQP 协议实现的企业级消息系统,想要顺畅的玩耍的前提是得先了解它,本文将主要介绍 rabbitmq 的一些基本知识点 特点 基本概念 消息投递消费的几种姿势 事务 集群 I. 基本知识点 它是采用 Erlang 语言实现的 AMQP(Advanced Message Queued Protoco

小知识点--小结

一 OC 小结 1 什么是 OC 语言? OC 语言即面向对象语言,它扩展了 ANSI C 语言,将 SmallTalk 式的消息传递机制加入到 ANSI C 中.它是苹果 OS 和 iOS 以及相关的 API,Cocoa 和 Cocoa Touch 的主要编程语言. 2 OC 语言的特点: 支持 C 语言语法,是 ANSI-C 语言的一个超集,是一种高效的编程语言. 是 C 语言面向对象的扩展,完全支持面向对象的特性. 简洁易读的编程风格,使编程和阅读更加清晰. 兼容性好,可以在项目中直接导入

C++ 面向对象 知识点 小结

[摘要] 面向对象主要的知识点有,面向对象的基本概念,结构和类的区分,多态及各种构造函数.要求掌握 1.面向对象的基本原则(封装.继承.多态),面向对象的基本概念(类.对象.继承).2.类和结构体在访问控制上的差异.3.成员变量在静态成员变量的4个特性.引用成员变量必须采用的初始化方式.静态常量成员变量的初始化特点以及成员变量在初始化列表初始化顺序上的特点. 4. string与stack的四个初始化函数的书写. 5. 友元函数的尺度以及实现. 6.异常的2个例题要求熟练掌握. 7. 深拷贝与浅

互联网服务器的实现过程需要考虑哪些安全问题 & 加解密及哈希知识点

http://www.cnblogs.com/charlesblc/p/6341265.html 其中的一篇. 参考 https://zhuanlan.zhihu.com/p/20336461?refer=auxten 网络编程(四):互联网中TCP Socket服务器的实现过程需要考虑哪些安全问题? 在Internet环境下,安全问题我主要分为如下几类: 信息传输过程中被黑客窃取 服务器自身的安全 服务端数据的安全 首先,如果能用https,就尽量用https,能用nginx等常见服务器,就用

C++ 指针与引用 知识点 小结

[摘要] 指针可以指向变量.数组.字符串.函数.甚至结构体.即指针可以指向不同数据对象.指针问题 包括 常量指针.数组指针.函数指针.this指针.指针传值.指向指针的指针 等.主要知识点包括:1.指针与引用在概念上的三个区别及其在const.sizeof.自增运算上的差异:2.熟记经典swap函数的指针实现与引用实现,并能反映输出错误的两个函数的思想弊端:3.熟记GetMem函数的错误形式以及错误产生的原因:4.比较数组.指针与静态变量作为函数返回值的差异:5.str.*str以及&str三者