哈希查找

数据结构之查找-哈希查找

≯℡__Kan透↙ 提交于 2020-01-30 01:51:45
目录 哈希法(计算式查找) 哈希函数的构造方法 处理冲突的方法 哈希表的查找过程 哈希法(计算式查找) 哈希法 又称散列法、杂凑发、关键字地址计算法,相应的表成为哈希表、散列表等。 哈希法的基本思想 :首先在元素的关键字k和元素的存储位置p之间建立一个对应关系H,是的p=H(k),H成为哈希函数。 五个因素 :①计算哈希函数所需的时间。②关键字长度。③哈希表的大小。④关键字分布情况。⑤记录查找的频率。 哈希函数的构造方法 构造哈希函数原则 :一是函数本身便于计算;二是计算出来的地址分布均匀。 1、 数字分析法 :事先要知道关键字集合,并且每个关键字的位数比哈希表的地址为数多时,可以从关键字中选出分布均匀的若干位构成哈希地址。 2、 平方取中法 :当无法确定关键字中那几位分布较均匀时,可以先求出关键字的平方值,然后取平方值中间的几位作为哈希地址。 3、 分段叠加法 :按哈希表地址为数将关键字分成位数相等的几部分,然后将这几部分相加,舍弃最高进位后的结果就是该关键字的哈希地址。 4、 除留余数法 :假设哈希表的长度为m,p为小于等于m的最大素数,则哈希函数为其中,%的模p为取余运算。 5、 伪随机数法 :采用一个为随机函数作为哈希函数,即H(key)=random(key) 处理冲突的方法 通过构造性能良好的哈希函数,可以减少冲突,但一般不节能完全避免冲突

哈希的原理和代价

纵饮孤独 提交于 2020-01-30 00:58:45
总结一句话,Hash是一种典型的空间换时间,代价就是需要使用更大的空间,除了要储存源数据外还要额外的储存,hash关系的数据! 【转】 哈希表和哈希函数是大学数据结构中的课程,实际开发中我们经常用到Hashtable这种结构,当遇到键-值对存储,采用Hashtable比ArrayList查找的性能高。为什么呢?我们在享受高性能的同时,需要付出什么代价(这几天看红顶商人胡雪岩,经典台词:在你享受这之前,必须受别人吃不了的苦,忍受别人受不了的屈辱),那么使用Hashtable是否就是一桩无本万利的买卖呢?就此疑问,做以下分析,希望能抛砖引玉。 1)hash它为什么对于键-值查找性能高 学 过数据结构的,都应该晓得,线性表和树中,记录在结构中的相对位置是随机的,记录和关键字之间不存在明确的关系,因此在查找记录的时候,需要进行一系列的 关键字比较,这种查找方式建立在比较的基础之上,在java中(Array,ArrayList,List)这些集合结构采用了上面的存储方式。 比如,现在我们有一个班同学的数据,包括姓名,性别,年龄,学号等。假如数据有 姓名 性别 年龄 学号 张三 男 15 1 李四 女 14 2 王五 男 14 3 假如,我们按照姓名来查找,假设查找函数FindByName(string name); 1)查找“张三” 只需在第一行匹配一次。 2)查找"王五" 在第一行匹配

哈希的原理和代价<转>

本秂侑毒 提交于 2020-01-30 00:55:59
哈希表和哈希函数是大学数据结构中的课程,实际开发中我们经常用到Hashtable这种结构,当遇到键-值对存储,采用Hashtable比ArrayList查找的性能高。为什么呢?我们在享受高性能的同时,需要付出什么代价(这几天看红顶商人胡雪岩,经典台词: 在你享受这之前,必须受别人吃不了的苦,忍受别人受不了的屈辱 ),那么使用Hashtable是否就是一桩无本万利的买卖呢?就此疑问,做以下分析,希望能抛砖引玉。 1)hash它为什么对于键-值查找性能高 学过数据结构的,都应该晓得,线性表和树中,记录在结构中的相对位置是随机的,记录和关键字之间不存在明确的关系,因此在查找记录的时候,需要进行一系列的关键字比较,这种查找方式建立在比较的基础之上,在.net中(Array,ArrayList,List)这些集合结构采用了上面的存储方式。 比如,现在我们有一个班同学的数据,包括姓名,性别,年龄,学号等。假如数据有 姓名 性别 年龄 学号 张三 男 15 1 李四 女 14 2 王五 男 14 3 假如,我们按照姓名来查找,假设查找函数FindByName(string name); 1)查找“张三” 只需在第一行匹配一次。 2)查找"王五" 在第一行匹配,失败, 在第二行匹配,失败, 在第三行匹配,成功 上面两种情况,分别分析了最好的情况,和最坏的情况,那么平均查找次数应该为 (1+3)/2

算法09 五大查找之:哈希查找

牧云@^-^@ 提交于 2020-01-30 00:34:04
前面的几篇文章分别总结了: 顺序查找 、 二分查找 、 索引查找 、 二叉排序树 。这一篇文章要总结的是五大查找的最后一个:哈希查找(也称为散列查找)。提起哈希,我的第一印象就是java中的Hashtable类,它是由 key/value 的键值对组成的集合,它就是应用了哈希技术。 那什么是哈希查找呢?在弄清楚什么是哈希查找之前,我们要弄清楚哈希技术,哈希技术是在记录的存储位置和记录的 key 之间建立一个确定的映射 f(),使得每个 key 对应一个存储位置 f(key)。若查找集合中存在这个记录,则必定在 f(key) 的位置上。哈希技术既是一种存储方法,也是一种查找方法。 六种哈希函数 f(key) 的构造方法: 1、直接定址法 哈希地址:f(key) = a*key+b (a,b为常数) 这种方法的优点是:简单,均匀,不会产生冲突。但是需要事先知道 key 的分布情况,适合查找表较小并且连续的情况。 2、数字分析法 比如我们的11位手机号码“136xxxx5889”,其中前三位是接入号,一般对应不同运营公司的子品牌,如130是联通如意通,136是移动神州行等等。中间四位表示归属地。最后四位才是用户号。 若我们现在要存储某家公司员工登记表,如果用手机号码作为 key,那么极有可能前7位都是相同的,所以我们选择最后四位作为 f(key) 就是不错的选择。 3、平方取中法

Java--集合框架之Map接口

别等时光非礼了梦想. 提交于 2020-01-29 13:44:26
Java集合框架总图 Map接口和具体实现类 Java集合总体分为两个根接口,Map和Collection,其中Collection是单列集合,Map是双列集合。 Map与List、Set接口不同,它并不继承自Collection,它是由一系列键值对组成的集合,提供了key到value的映射。在Map中一个key对应一个value,所以key的存储不可重复,但value可以。 哈希结构——通过关键码找到值的数据结构 哈希函数——建立关键字和值的映射关系 注:好的哈希函数能使值均匀的分步在哈希结构中 生成哈希函数的两种方式 (1)直接寻址法:f(x)=kx+b(k和b是常数) (2)除留余数法:f(x)=x mod m (m<p)(m小于哈希长度p) 哈希冲突的两种解决方式 (1)链地址法:当发生哈希冲突时,将哈希到对应位置的值连接在该位置的数据后面。 (2)线性探测法 Map接口常用方法 int size ( ) ; //map集合中存储的键值对的个数 boolean isEmpty ( ) ; //判断map集合是否为空 true:空 false:不为空 boolean containsKey ( Object key ) //判断集合中是否存在该键key boolean containsValue ( Object value ) ; ////判断集合中是否存在该值value

Lua性能优化技巧[三 关于表]

本秂侑毒 提交于 2020-01-28 00:27:18
原作者 Roberto Ierusalimschy 翻译 hillin 翻译版权所有©2011 hillinworks,转载需征得译者允许。 目录 一 前言 二 基本事实 三 关于表 四 关于字符串 五 削减、重用与回收 六 最后的提示 一般情况下,你不需要知道Lua实现表的细节,就可以使用它。实际上,Lua花了很多功夫来隐藏内部的实现细节。但是,实现细节揭示了表操作的性能开销情况。因此,要优化使用表的程序(这里特指Lua程序),了解一些表的实现细节是很有好处的。 Lua的表的实现使用了一些很聪明的算法。每个Lua表的内部包含两个部分:数组部分和哈希部分。数组部分以从1到一个特定的n之间的整数作为键来保存元素(我们稍后即将讨论这个n是如何计算出来的)。所有其他元素(包括在上述范围之外的整数键)都被存放在哈希部分里。 正如其名,哈希部分使用哈希算法来保存和查找键。它使用被称为开放地址表的实现方式,意思是说所有的元素都保存在哈希数组中。用一个哈希函数来获取一个键对应的索引;如果存在冲突的话(意即,如果两个键产生了同一个哈希值),这些键将会被放入一个链表,其中每个元素对应一个数组项。当Lua需要向表中添加一个新的键,但哈希数组已满时,Lua将会重新哈希。重新哈希的第一步是决定新的数组部分和哈希部分的大小。因此,Lua遍历所有的元素,计数并对其进行归类,然后为数组部分选择一个大小

哈希表

南笙酒味 提交于 2020-01-27 07:30:50
一.符号表问题 1.一个表里面放着n条记录,(记录x:x通常是一个指向实际数据的指针) 2.在每个记录中,存在一个记录的键,还存在一些卫星数据(属于键的附加数据) 3.排序是对记录进行排序,而不是关键字 4.对表进行操作:添加记录,删除记录,查找具有特定键的记录 二.直接映射表(数组) 1.适用于关键字的全域(可能存储的关键字)较小的情况 2.数组的每个位置对应全域中的一个关键字,关键字k的元素被存放在槽k中 3.缺陷:如果关键字只有几千,而关键字的全域需64位来表示,导致大量空槽 1 class direct_address_table: 2 '''直接寻址表''' 3 def __init__(self, T=[], size=0): 4 if len(T) == 0: 5 self.T = [None for i in range(size)] 6 else: 7 self.T = T 8 self.size = size 9 '''对于节点''' 10 def search(self, k): 11 return self.T[k] 12 13 def insert(self, x): 14 self.T[x.key] = x 15 16 def delete(self, x): 17 self.T[x.key] = None 18 19 class Node: 20

HashMap以及源码详解

天涯浪子 提交于 2020-01-23 10:28:30
HashMap实现接口以及继承类 实现了Map,Cloneable,Serializable接口,继承自AbstractMap类。 允许 null 值和 null 键,无序,不允许重复的集合 HashMap底层结构 HashMap底层接口是哈希表,也就是所谓的散列表。 简单介绍一下散列表,散列表的出现是为了解决链表和数组的缺陷,链表增删快,查询慢,数组查询快,增删慢。而散列表基于数组和列表进行演变,使得查询和增删的速度都非常快。 散列表的结构如下。 hashMap中的散列表是用数组+链表+红黑树去实现的 。 好的散列方式,会把数据散列到不同的位置,哪怕散列到同一个位置(这就是所谓的 哈希冲突 ),我们可以把它链起来变成链表(Java采用 链地址法 ),只要这个链表足够的短,我们就可以最快的查询数据,因为遍历两三个节点的时间非常短,近似于O(1)。 当链表足够长( 链表长度 >= 8)并且,节点足够多(节点数 >= 64)的时候,我们就把当前的链表变成红黑树。 (为什么节点 >=8 才变成红黑树,<=6变成链表? 因为根据泊松分布,当节点树大于等于 8 的时候,红黑树查询会比链表查询要快,而当节点数小于等于 6 的时候,会链表查询回避红黑树要快。7的时候是相当。) HashMap常用方法以及源码解析 简单介绍以下变量以及初始值: HashMap的最大容量(MAXIMUM

校招面试,关于hashTree

二次信任 提交于 2020-01-16 14:23:26
新手小白 今天在面试的时候,面试官问了hashmap和hashtable和hashtree的区别,我只了解过hashmap’和hashtable的区别和底层实现,对hashtree的底层实属没用过和没了解过,借这个机会,学习下hashtree的基本知识。 哈希树是一种树形数据结构,每个叶节点均以数据块的哈希作为标签,而非叶节点则以其子节点标签的加密哈希作为标签。 优点: 哈希树是一个单向增加的结构,即随着所需要存储的数据量增加而增大。即使数据量减少到原来的数量,但是哈希树的总节点数不会减少。这样做的目的是为了避免结构的调整带来的额外消耗。所以它的结构相当简单且稳定。结构不易被数据量的改变而改变。 查找速度很快:哈希树层级最多能增加到10。因此最多只需要十次取余和比较操作,就可以知道这个对象是否存在。这个在算法逻辑上决定了哈希树的优越性。 缺点: 可能和tree等数据结构来比对,数据没有排序性。 来源: CSDN 作者: 清风一曲 链接: https://blog.csdn.net/weixin_42374301/article/details/104001629

查找三 哈希表的查找

馋奶兔 提交于 2020-01-16 10:45:59
目录 要点 哈希表和哈希函数 在记录的存储位置和它的关键字之间是建立一个确定的对应关系(映射函数),使每个关键字和一个存储位置能 唯一对应 。这个映射函数称为 哈希函数 ,根据这个原则建立的表称为 哈希表(Hash Table) ,也叫 散列表 。 以上描述,如果通过数学形式来描述就是: 若查找关键字为 key ,则其值存放在 f(key) 的存储位置上。由此, 不需比较便可直接取得所查记录 。 注:哈希查找与线性表查找和树表查找最大的区别在于,不用数值比较。 冲突 若 key1 ≠ key2 ,而 f(key1) = f(key2),这种情况称为 冲突 (Collision)。 根据哈希函数f(key)和处理冲突的方法将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这一映射过程称为 构造哈希表 。 构造哈希表这个场景就像汽车找停车位,如果车位被人占了,只能找空的地方停。 构造哈希表 由以上内容可知,哈希查找本身其实不费吹灰之力,问题的关键在于如何构造哈希表和处理冲突。 常见的构造哈希表的方法有 5 种: (1)直接定址法 说白了,就是小学时学过的 一元一次方程 。 即 f(key) = a * key + b。其中,a和b 是常数。 (2)数字分析法 假设关键字是R进制数(如十进制)。并且哈希表中