算法——散列表(最有用的基本数据结构之一)

你作为一个老板,一个卖东西要不断找价格表的销售员和一个一眼看到商品就能知道价格的销售员 你会要哪一个?

可以使用这样形式的数组来记录商品价格

[(eggs,2,49)(milk,1.49)(pear,0.79)],

将这些数组按商品名排序,再执行二分查找商品的价格。 这样查找价格的时间就是O(log n)

什么是散列函数? 输入能够映射到数字的函数。

散列函数需要满足的要求:

①必须是一致的。比如输入apple得到4,那么每次输入apple都是4

②将不同的输入映射到不同的数字。【最理想】

如果输入后都返回1,那这个散列函数就很烂  要有一个一一对应的关系,这样才非常容易分辨找到自己要找的数字

散列函数准确指出了价格的存储位置。 原因是:

①相同的输入总得到相同的索引。

②不同的输入映射到不同的索引。

③散列函数能够知道数组有多大,并且只会返回有效的索引。不会超出数组的索引范围。

散列表就像是python里的字典。包含键值对

如果像字典一样存储 如果开头都是A 就会有一个冲突问题

可以像这样子再加个链表,但速度又会慢上许多。

书上的扩展内容:如何避免散列表的最糟情况

①较低的填充因子 ②良好的散列函数

散列表的填装因子 = 散列表包含的元素数 / 位置总数

填充因子就是1/3     最佳情况为1  一一对应   位置越少填充因子越大

可以将数组增长一倍

hash()函数能将

所有元素插入这个新的散列表中。 这时候 填充因子就降低了,填充因子越低,发生冲突的可能性越大

如何设计散列表(举例)

散列函数设计: 例:将每个字符都映射到一个素数,a = 2,b = 3,c = 5,d = 7 ,e =11,g=17等等,

对于给定字符串,散列函数将每个字符对应的素数相加,再计算结果除以散列表长度的余数。

比如,散列表长度10,字符串bag,则索引就是(3+2+17)% 10 = 2

小结:

①一旦填装因子超过0.7,就应该调整列表长度

②散列表非常适合用于防止重复

原文地址:https://www.cnblogs.com/zhangshengchao/p/12650226.html

时间: 2024-08-01 02:21:31

算法——散列表(最有用的基本数据结构之一)的相关文章

算法——散列表

散列表 算法——散列表 散列表(hash table):键值(key_value)映射,Python提供的哈希列表实现为字典. 作用: 模拟映射关系 便于查找 避免重复 缓存/记住数据,以免服务器再通过处理来生成它们 # hash_table.py 哈希表 # 避免重复 def vote(li): voters = {} for i in li: if i not in voters: voters[i] = True else: print(i + ' has already voted.')

数据结构与算法——散列表类的C++实现(分离链接散列表)

散列表简介: 散列表的实现常被称为散列.散列是一种用于以常数平均时间执行插入.删除和查找的技术. 散列的基本思想: 理想的散列表数据结构只不过是一个包含一些项的具有固定大小的数组.(表的大小一般为素数) 设该数组的大小为TbaleSize,我们向该散列表中插入数据,首先我们将该数据用一个函数(散列函数)映射一个数值x(位于0到TbaleSize1-1之间):然后将该数据插入到散列表的第x的单元.(如果有多个数据映射到同一个数值,这个时候就会发生冲突) 散列函数介绍: 为了避免散列函数生成的值不是

数据结构和算法: 散列表

散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度.这个映射函数称做散列函数,存放记录的数组称做散列表 散列表的时间复杂度不是严格的O(1), 因为和多种因素有关, 比如散列函数, 还有就是如果采用链表法处理冲突, 那么最坏情况是所有数据都散列到一个链表中, 此时是O(n). hash函数有以下几种简单实现的方法 取余法 常见的对一个数进行取余操作

算法-散列表

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组就是散列表.散列表是算法上时间和空间做出权衡的例子,如果没有内存限制,我们可以直接将键作为数据的索引直接一次访问即可,如果没有时间限制我们直接通过之前的无序数组进行顺序查找即可.散列函数能够直接将关键字转化成索引,但是会出现相同索引的情况,这个时候我们需要处理冲突碰撞,我们会使用到拉链法和

数据结构之散列表总结

散列表的概念 注意:    ①由同一个散列函数.不同的解决冲突方法构造的散列表,其平均查找长度是不相同的.     ②散列表的平均查找长度不是结点个数n的函数,而是装填因子α(填入表中的记录个数/散列表的槽数    n/m).因此在设计散列表时可选择α以控制散列表的平均查找长度.(平均查找长度=总查找(插入)/记录个数)          通过链接法解决冲突:成功查找的期望查找长度O(1+a), 不成功查找的平均查找长度也为O(1+a).         开放寻址解决冲突:引入探查序列,对于a<

散列表(Hash Map)

今天第一次做Leetcode用到了散列表,之前学的数据结构的内容都忘了,正好趁热打铁补一补. 摘自其他博客的一个整合. 一.哈希表简介 数据结构的物理存储结构只有两种:顺序存储结构和链式存储结构(像栈,队列,树,图等是从逻辑结构去抽象的,映射到内存中,也这两种物理组织形式),在数组中根据下标查找某个元素,一次定位就可以达到,哈希表利用了这种特性,哈希表的主干就是数组. 比如我们要新增或查找某个元素,我们通过把当前元素的关键字 通过某个函数映射到数组中的某个位置,通过数组下标一次定位就可完成操作.

数据结构和算法篇——散列表

之前讲过博主在某网买了一个数据结构与算法的课程.本篇散列表是其中的三节.散列表应该是 Java 程序员常用并且最先碰到的一个数据结构了吧?Java 的 HashMap 就是对散列表的实现.可以说散列表算是一个比较基础.比较好理解(抛开需要缜密设计的哈希函数不说).比较好用(查询时间复杂度O(1))的一种数据结构.本篇在此分享这三节的总结笔记. 1)散列表开篇介绍:https://www.cnblogs.com/christmad/p/11519055.html 2)如何打造一个工业级的散列表:h

Python数据结构——散列表

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

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

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