| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 数据结构——哈希 -> 正文阅读 |
|
[数据结构与算法]数据结构——哈希 |
在学习哈希之前,我们思考这样一个问题,在下面的数组中,我们想在第一时间内确定一个数是否在这个数组里面(以35为例),我们应该如何做? 大家的第一想法肯定是从前向后遍历一遍,但我们会发现从前向后遍历一遍的时间复杂度为O(n),这并不是我们想要的第一时间内找到,我们观察数组,发现,数据和数组下标(也就是存储位置)没有任何关系,如果数据和它的存储位置有一个对应的关系,我们就可以通过数据和对应关系直接找到这个数据的存储位置,再判断数组存储的这个数和我们想要的数(35)是否相等,就可以得出35在不在数组中。我们给出哈希的概念。 哈希:(哈希也叫散列,哈希表==散列表) 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。查找时,根据这个确定的对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。 这里我们把这种对应关系f称为散列函数,又称为哈希函数。按这个思想,采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表或者哈希表。那么关键字对应的记录存储位置我们称为散列地址。 继续以上面的那个数组为例,我们给出对应关系(也就是哈希函数):y=x%10。 y=存储位置,x=数据的关键字 例如:数据12,12%10=2,我们就将数据12存储在数组下标为2的位置; 数据21,21%10=1,我们就将数据21存储在数组下标为1的位置;.... 依次类推,我们得到以下数组: ?(这里我给到值比较特殊,正好每个数据都有对应的存储位置,要是两个数的散列地址相同,我们就称发生了哈希冲突,这个下边会继续讲解) 这样每个数据和存储它的位置都有关系了,我们要查35在不在这个数组中,35%10=5,我们看数组下标为5的位置,发现是45,45!=35,所以35不在这个数组中。 注意:哈希是一种存储方法,也是一种查找方法 接下来我们说,如何构造哈希函数,这里给出6种方法(这里最常用的是第4个方法,其他的方法有兴趣可以看看): 1.直接地址法:f(key)=a*key+b ?我们再说哈希冲突,我们给出概念: 哈希冲突:哈希冲突:不同数据的关键字通过哈希函数得到一个相同的地址,这时就发生冲突,这种冲突一般叫做哈希冲突(存放位置已经有值) 解决哈希冲突的4种方法(截图来源于教材): 1.开放地址法:
? 这里着重讲解链地址法,也是我们需要实现的代码: ? ?如上图,我们将散列地址相同的用单链表链接起来,接下来我们实现一下代码: 链地址法的有效节点和哈希表头需要单独设计。
可执行函数声明:
这里直接给出所有函数:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 9:30:06- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |