7、散列表

一、什么是散列表?

问题:现在我们需要为一家超市建立一个结账系统,我们应该考虑用哪一种数据结构?

思考:由于结账系统多用于查询,我们可以考虑使用数组。在数组中需要同时储存商品名和对应的价格,我们可以再数组中内嵌子数组,把一个商品名和对应价格同时保存在一个子数组中,最后对所有数组排序。查询是速度为O(log2n)。

反思:①数组无法储存具有映射关系的数据;②超市中的商品成千上万,即使查询速度为对数速度,当记录的项目多时查询起来也非常耗时。

针对反思中的两点,我们想:如果有一种数据结构,能够储存具有映射关系的数据,而且无论项目有多少,其查询数据的速度都是1该有多好。散列表就是实现了这种功能的数据结构。它能够储存具有映射关系的数据,而且查询速度永远是1.

二、散列函数

在数组中,利用索引来查找数据这一操作是瞬间完成的事情。散列函数能够把一个数据转化成一个具体的数字,而这个数字就是储存数据的数组中的索引,这样我们就可以把数据保存在数组中索引的位置了。查找数据时只要用散列函数得出索引,查找的速度就永远是1了。

所以,散列表是散列函数与数组相互配合工作的:散列函数转化数据,数组储存数据。

这样看来,散列函数必须足够强大,能够把数据转换成互不相同的数字。

三、散列表与数组、链表

散列表是我们在数组、链表之后学习的第一种有额外逻辑的数据结构:数组、链表都是把数据直接映射到内存里,而散列表是使用散列函数确定数据的储存位置。

散列表是一种会被我们广泛引用的数据结构,一般一门语言中通常都提供了散列表的实现,在python中的散列表是字典。

四、散列表的应用

1、用于具有映射关系和快速查找的应用,如电话簿、商品价格列表、DNS解析表;

2、用于防止重复的应用,如投票系统。

五、冲突

冲突:给两个键分配的相同的储存位置;

原因:散列函数不够完美,不能做到对不同数据生成不同的数字;

解决方法:在分配到相同的同一位置,用链表储存数据。

原文地址:https://www.cnblogs.com/lqxing1994/p/9254429.html

时间: 2024-10-05 02:55:46

7、散列表的相关文章

闭散列表的查找、插入和删除操作的完整C代码

/*闭散列表的建立.查找.插入.删除*/ #include <stdio.h> #define NIL -1 //假设关键字为非负整数 #define DEL -2 typedef int KeyType; KeyType HashTable[13]; //便于验证算法,关键字个数假定为不超过13,哈希表长定为13 //关键字插入函数 void InsertHashTable(KeyType k) { for(int i=0; i<13; i++) if( NIL == HashTabl

哈希表/散列表

哈希表/散列表,是根据关键字(key)直接访问在内存存储位置的数据结构. 构造哈希表的常用方法: 直接地址法---取关键字的某个线性函数为散列地址,Hash(Key) = Key或Hash(key) = A*Key + B, A,B为常数. 除留余数法---取关键值被某个不大于散列表长m的数p除后的所得的余数为散列地址. Hash(key) = key % p. 若采用直接地址法(Hash(Key) = Key)存在一定的缺陷. 当Key值特别大时,而Key之前的数很少,就会造成空间浪费.大多时

Python数据结构——散列表

散列表的实现常常叫做散列(hashing).散列仅支持INSERT,SEARCH和DELETE操作,都是在常数平均时间执行的.需要元素间任何排序信息的操作将不会得到有效的支持. 散列表是普通数组概念的推广.如果空间允许,可以提供一个数组,为每个可能的关键字保留一个位置,就可以运用直接寻址技术. 当实际存储的关键字比可能的关键字总数较小时,采用散列表就比较直接寻址更为有效.在散列表中,不是直接把关键字用作数组下标,而是根据关键字计算出下标,这种 关键字与下标之间的映射就叫做散列函数. 1.散列函数

散列表的实现

一,线性探測法 核心:冲突的时候线性的向下寻找可用空间; 缺点:对同一散列地址的争夺现象会出现堆积; 二,二次探測法 核心:冲突的时候探測以下的+_k^2; 缺点:不易探測到整个散列表的全部空间: 三,链地址法 同一地址放置一条链

散列表

散列表的基本思想通过键来直接计算出数据的存放地址,而避免了数组或者其他数据结构的逐个比较查找. 可以在常数时间内实现查找.插入和删除操作,代价是不支持任何有关排序的操作. 键到地址的映射,称作散列函数.散列函数需要满足两个要求:计算简单:冲突少. 不同的情况,可以有不同的散列函数,在此不对散列函数做过多介绍. 冲突:相同的键,通过散列函数,被映射到了相同的地址.下面主要介绍下解决冲突的一些简单方法. 分离链表法:把散列到同一个地址的数据保存在一个链表中.在查询数据时,先通过散列函数求出链表地址,

散列表(数据结构学习笔记)

散列 散列表的一般实现叫散列.是一种以常数平均时间执行插入.删除.查找的技术.理想的散列表结构是一个包含关键字具有固定大小的数组.典型情况是,一个关键字就是一个带有相关值的字符串.把表大小记MaxSize,通常使表在0-MaxSize之间变化.每个关键字都被映射到0-MaxSize之间的某个单元中.这个映射关系就是散列函数.理想情况函数保证任何关键字都映射到不同单元里,实践是不可能的.因数组有限大小,而关键字可无限多.因此要找德散列函数尽可能的使关键字均匀的分布在单元中.如图 git在0号单元,

十三、散列表(哈希表)

散列表 散列表插入分两步: 1. 根据散列函数找到索引 2. 处理索引冲突情况:拉链法和线性探测法 散列表是时间上和空间上作出权衡的一个例子.散列表采用函数映射找索引,查找很快,但是键的顺序信息不会保存(HashSet HashMap的本质) 散列函数 对于每种类型的键我们都学要一个与之对应的散列函数 正整数散列: 常用取余散列:k%M 浮点数散列: 例如0-1之间可以乘以一个M得到0-M-1之前的索引值,但是高位影响比低位大(0.12的1比2的影响更大,不符合均匀性),所以可以将键表示为二进制

算法导论 第十章 基本数据类型 &amp; 第十一章 散列表(python)

更多的理论细节可以用<数据结构>严蔚敏 看几遍,数据结构很重要是实现算法的很大一部分 下面主要谈谈python什么实现 10.1 栈和队列 栈:后进先出LIFO 队列:先进先出FIFO python 中使用list实现在这些功能 栈:压栈 append() 退栈   pop() 队列:   入队 append() 出队 pop(0) 栈: >>> stack = list() >>> stack.append(3) >>> stack.ap

大话数据结构—散列表查找(哈希表)

一.基本概念 散列技术:在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key). f:散列函数/哈希函数: 采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表. 关键字对应的记录存储位置称为散列地址. 散列技术既是一种存储方法,也是一种查找方法. 散列技术适合求解问题是查找与给定值相等的记录.查找速度快. 散列技术不适合范围查找,不适合查找同样关键字的记录,不适合获取记录的排序,最值. 冲突:关键字key1不等于k

算法导论-散列表(Hash Table)

目录 引言 直接寻址 散列寻址 散列函数 除法散列 乘法散列 全域散列 完全散列 碰撞处理方法 链表法 开放寻址法 线性探查 二次探查 双重散列 随机散列 再散列问题 完整源码(C++) 参考资料 内容 1.引言 如果想在一个n个元素的列表中,查询元素x是否存在于列表中,首先想到的就是从头到尾遍历一遍列表,逐个进行比较,这种方法效率是Θ(n):当然,如果列表是已经排好序的话,可以采用二分查找算法进行查找,这时效率提升到Θ(logn);  本文中,我们介绍散列表(HashTable),能使查找效率