| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 哈希算法与哈希冲突 -> 正文阅读 |
|
[数据结构与算法]哈希算法与哈希冲突 |
哈希算法哈希算法为了是快速读写指定位置的数据,类似于字典索引的策略,通过哈希函数的计算,将某一指定的数据存储到指定的位置,为的是快速定位数据的存储位置。常见的哈希函数有:除法哈希算法、乘法哈希算法、平方取中法、随机数哈希算法。 除法哈希算法计算方式:
这里的x就是待存储数据的键值,m往往选择为存储空间的个数,直接取余计算存储位置。例如,我们在7个位置中存储3,11,8,6这几个数字 根据计算,3 % 7 = 3, 11 % 7 = 4, 8 % 7 = 1, 6 % 7 = 6 注意:m为了避免计算出现冲突,往往选择质数。 乘法哈希算法计算方式: 这里的x是待存储数据的键值,m往往选择为存储空间的个数,先把x乘以一个大于0小于1的常数(小数)然后取结果的小数部分,乘以m后下取整。 例如m = 10, x = 8 注意:这种算法下,对m没有特别的要求,N常常取0.618 平方取中算法计算方式:
这里的x是待存储数据的键值,n表示取中间n位作为哈希值。 例如,123,234,245几个数进行平方取中法, 取平方值的千位和百位作为哈希值 随机数哈希算法将待存储数据的键值作为随机函数的种子,计算随机数,作为哈希值。此类适用于长度不等,没有规则可言的键值。 哈希冲突哈希函数是用来将数据和存储地址进行映射的方法,但是不可避免的是不同的数据映射到了相同的存储位置,这种情况下就称为出现了 开放定址法开放定址法当出现哈希冲突时,进行连续的地址探测,直到找到空位置进行存储。 当出现哈希冲突时,从计算结果的位置开始依次向后探测,直到找到空位置。
例如我们存储3,11,8,6,15,1. 哈希函数为h(x) = x % 7, 其中8和15和1的哈希值都是1 3,11,8,6依次存储到了3,4,1,6的位置,当15出现时,1的位置被8占用了,向后探查发现2的位置是空的,将其存储到2的位置。 1出现的时候,1,2,3,4均被占用,只能存储到5号位置。 当出现哈希冲突时,从计算结果的位置开始按平方次位置向后探测,直到找到空位置。
依次探查key + 1, key + 4, key +9 ··· 的位置,找到空位置就进行存储
想要均匀的散列,Q(x) 的值要与m互质。 链地址法链地址法通过哈希数组和链表组成,数组存储头指针,链表存储真实数据 这里也同样要求哈希函数选择的准确,否则容易导致退化,成了链表的顺序查询的问题。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 8:24:31- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |