哈希查找

HashMap和Hashtable的详细区别

淺唱寂寞╮ 提交于 2019-11-28 18:10:43
HashMap和Hashtable的详细区别 一、简述: 1.安全性 Hashtable是线程安全,HashMap是非线程安全。 HashMap的性能会高于Hashtable,我们平时使用时若无特殊需求建议使用HashMap,在多线程环境下若使用HashMap需要使用 Collections.synchronizedMap() 方法来获取一个线程安全的集合( Collections.synchronizedMap() 实现原理是Collections定义了一个 SynchronizedMap 的内部类,这个类实现了Map接口,在调用方法时使 用synchronized 来保证线程同步 2.是否可以使用null作为key HashMap可以使用null作为key,不过建议还是尽量避免这样使用。HashMap以null作为key时,总是存储在table数组的第一个节点上。而Hashtable则不允许null作为key 3.继承了什么,实现了什么 HashMap继承了AbstractMap,HashTable继承Dictionary抽象类,两者均实现Map接口 4.默认容量及如何扩容 HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。 HashMap扩容时是当前容量翻倍即: capacity * 2 ,Hashtable扩容时是容量翻倍

哈希(散列)详解

半城伤御伤魂 提交于 2019-11-28 16:08:35
散列表(也叫哈希表),是根据关键字值而直接进行访问的数据结构。 通过把关键字值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 散列函数的构造方法: (1)直接定址法 (2)除留余数法 (3)平方取中法 (4)折叠法 (5)数值分析法 本文采用除留余数法构造散列函数。 H(K) = (H(k) + i) % m; 其中i = 1, 2, …, m为哈希表大小。 构造散列函数的目的是减少冲突,但要完全避免冲突是不可能的,只能尽可能减少冲突。 处理冲突的方法: (1)开放定址法 (2)二次探测法 (3)链地址法(拉链法) 开放地址法: 线性探查法:H(K) = (H(k) + i) %d 每次+1,一次循环查找。缺点:容易造成聚集现象 平法探查法:H(K) = (H(k) + ) %d 每次加 ,避免了线性探查的聚集现象,缺点:不能探查到散列表的所有单元,但知道可以探查到散列表的一半单元。 根据原始数组建立一个哈希表,哈希表也为一个数组,且要求哈希表有固定大小。 本文采用 开放定址法处理冲突 ,线性探查法。 当由H(k)算出的位置不为空时,则通过已经构造的散列函数来寻找新的空位置。 从H(k)开始往后逐个搜索空位置,如果后面没有空位置,则从头开始搜索,直到搜索到空位置,或者回到H(k)停止搜索。(回到H(k)则说明搜索失败) 举例

程序员,你应该知道的数据结构之哈希表

我怕爱的太早我们不能终老 提交于 2019-11-28 06:28:31
哈希表简介 哈希表也叫散列表,哈希表是一种数据结构,它提供了快速的插入操作和查找操作,无论哈希表总中有多少条数据,插入和查找的时间复杂度都是为O(1),因为哈希表的查找速度非常快,所以在很多程序中都有使用哈希表,例如拼音检查器。 哈希表也有自己的缺点,哈希表是基于数组的,我们知道数组创建后扩容成本比较高,所以当哈希表被填满时,性能下降的比较严重。 哈希表采用的是一种转换思想,其中一个中要的概念是如何将 键 或者 关键字 转换成数组下标?在哈希表中,这个过程有哈希函数来完成,但是并不是每个 键 或者 关键字 都需要通过哈希函数来将其转换成数组下标,有些 键 或者 关键字 可以直接作为数组的下标。我们先来通过一个例子来理解这句话。 我们上学的时候,大家都会有一个学号 1-n号 中的一个号码,如果我们用哈希表来存放班级里面学生信息的话,我们利用学号作为 键 或者 关键字 ,这个 键 或者 关键字 就可以直接作为数据的下标,不需要通过哈希函数进行转化。如果我们需要安装学生姓名作为 键 或者 关键字 ,这时候我们就需要哈希函数来帮我们转换成数组的下标。 哈希函数 哈希函数的作用是帮我们把非int的 键 或者 关键字 转化成int,可以用来做数组的下标。比如我们上面说的将学生的姓名作为 键 或者 关键字 ,这是就需要哈希函数来完成,下图是哈希函数的转换示意图。 哈希函数的写法有很多中

常见的查找算法(七):哈希查找

倖福魔咒の 提交于 2019-11-28 05:58:16
散列表 ( Hash table ,也叫 哈希表 ),是根据 键 (Key)而直接访问在内存存储位置的 数据结构 。也就是说,它通过计算一个关于键值的函数,将所需查询的数据 映射 到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做 散列函数 ,存放记录的数组称做 散列表 。 散列函数 的规则是:通过某种转换关系,使关键字适度的分散到指定大小的的顺序结构中,越分散,则以后查找的时间复杂度越小,空间复杂度越高。 直接定址法 :取关键字或关键字的某个线性函数值为散列地址。即 hash(k) = k 或 hash(k) = a · k + b,其中a、b 为常数(这种散列函数叫做自身函数) 数字分析法 :假设关键字是以 r 为基的数,并且哈希表中可能出现的关键字都是事先知道的,则可取关键字的若干数位组成哈希地址。 平方取中法 :取关键字平方后的中间几位为哈希地址。通常在选定哈希函数时不一定能知道关键字的全部情况,取其中的哪几位也不一定合适,而一个数平方后的中间几位数和数的每一位都相关,由此使随机分布的关键字得到的哈希地址也是随机的。取的位数由表长决定。 折叠法 :将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址。 随机数法 除留余数法 :取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即 hash(k) =

hash

流过昼夜 提交于 2019-11-28 01:35:33
Hash 1. 什么是 hash 压缩映射 优点:哈希表使用了适度的时间和空间来在这两个极端之间找到了平衡。 2. 相关概念 散列表=哈希表; 散列函数=哈希函数; 3. 单向 它是一种单向函数是“非对称”的,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。 4. 哈希查找的两个步骤 [1] 使用哈希函数将被查找的键转换为数组的索引。 [2] 处理哈希碰撞冲突。 5. 常用的希哈函数 ( 博客: https://blog.csdn.net/tanggao1314/article/details/51457585 ) [1] 直接定址法:线性函数。 优点:简单。 缺点:造成空间大量的浪费。 [2] 数字分析法:分析关键字集中的全体,并从中提取分布均匀的若干位或它们的组合作为地址。 适用范围:所有关键字值已知。 [3] 折叠法:移位叠加/边界叠加。 适用范围:关键字的数字位数特别多。 [4] 平方取中法( 常用 ):这个方法是先取关键字的平方,然后根据可使用空间的大小,选取平方数是中间几位为哈希地址。 优点:扩大差别。 适用范围:关键字中的每一位都有某些数字重复出现频度很高的现象。 [5] 除留余数法:理论研究表明,除数最好为素数。 6. 哈希冲突解决办法 [1] 开放定址法(再散列法):当关键字key的哈希地址p=H(key)出现冲突时,以p为基础

HashMap实现原理及源码分析

假装没事ソ 提交于 2019-11-27 22:54:39
  哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现在各类的面试题中,重要性可见一斑。本文会对java集合框架中的对应实现HashMap的实现原理进行讲解,然后会对JDK7的HashMap源码进行分析。 目录     一、 什么是哈希表   二、 HashMap实现原理   三、 为何HashMap的数组长度一定是2的次幂?   四、 重写equals方法需同时重写hashCode方法   五、 总结 一、什么是哈希表   在讨论哈希表之前,我们先大概了解下其他数据结构在新增,查找等基础操作执行性能    数组 :采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n)    线性链表 :对于链表的新增,删除等操作(在找到指定操作位置后),仅需处理结点间的引用即可,时间复杂度为O(1),而查找操作需要遍历链表逐一进行比对,复杂度为O(n)    二叉树

20190815-阿里天猫淘宝数据库部门-一面

别等时光非礼了梦想. 提交于 2019-11-27 10:56:32
1.从100万条数据中找出最小的100条数据 top-k算法:可用大顶堆实现 2.内存中栈和堆的区别? 3.进程池的作用? 4.二叉查找树的实现,查找时间复杂度是多少? 5.两个有序数组的合并(时间复杂度是多少?) 6.数据库索引都有哪些?主键索引底层是怎么实现的? 7.哈希表是怎么实现的?解决哈希冲突的方式? 链表法怎么实现哈希查找?如果链表很长怎么办? 开放地址法怎么确定地址以及怎么实现哈希查找? 使用多个哈希函数法怎么确定映射地址?怎么实现哈希查找? 8.编程题 最短路径算法:Dijkstra算法 快速排序算法 两个有序数组的合并 二叉查找树的查找和插入 来源: https://www.cnblogs.com/hy4201/p/11360686.html

Redis相关面试题

你。 提交于 2019-11-26 18:17:05
1 、 Redis 和 memched 有什么区别?为什么单线程的 Redis 比多线程的 Memched 效率要高? 区别: 数据支持类型: Redis: String(字符串):key-value 类型 Hash(哈希):字典(hashmap) Redis的哈希结构可以使你像在数据库中更新一个属性一样只修改某一项属性值 List(列表):实现消息队列 Set(集合):利用唯一性 Sorted Set(有序集合):可以进行排序 可以实现数据持久化 Bitmaps(位图) HyperLogLog、Geo(地理信息定位) Memched:简单的key/value数据类型 数据持久性: Redis:Redis通过RDB(Redis DataBase)与AOF(Append Only File)持久化,可以将内存中的数据保存到硬盘中,然后重启之后在读取数据。 这里说明一下RDB和AOF的原理: RDB:是在达到指定的时间或者操作次数后,自动将在内存中的数据写入磁盘(数据恢复时一致性和完整性较差,因为也许最后一次备份前就宕机了,适合数据量较大的数据恢复时候使用) AOF:是日志形式,当数据写入内存中的时候,在日志文件下记录下所有写操作。(数据量较大时,数据的恢复缓慢) 注意:如果不需要持久化的功能,可以关闭。如果想要达到持久化的效果,建议两者都使用(RDB,AOF) Memched

python hash 哈希值

て烟熏妆下的殇ゞ 提交于 2019-11-26 17:28:52
自增知识点 1,哈希 什么是可哈希(hashable)? 简要的说可哈希的数据类型,即不可变的数据结构(字符串str、元组tuple、对象集objects)。   哈希有啥作用? 它是一个将大体量数据转化为很小数据的过程,甚至可以仅仅是一个数字,以便我们可以用在固定的时间复杂度下查询它,所以,哈希对高效的算法和数据结构很重要。 什么是不可哈希(unhashable)? 同理,不可哈希的数据类型,即可变的数据结构 (字典dict,列表list,集合set) hash(object) hash() 用于获取取一个对象(字符串或者数值等)的哈希值。返回对象的哈希值。 Hash算法(含python实现) 简介 哈希(hash)也翻译作散列。Hash算法,是将一个不定长的输入,通过散列函数变换成一个定长的输出,即散列值。 这种散列变换是一种单向运算,具有不可逆性即不能根据散列值还原出输入信息,因此严格意义上讲Hash算法是一种消息摘要算法,不是一种加密算法。常见的hash算法有:SM3、MD5、SHA-1等 。 应用 Hash主要应用在数据结构以及密码学领域。 在不同的应用场景下,hash函数的选择也会有所侧重。比如在管理数据结构时,主要要考虑运算的快速性,并且要保证hash均匀分布;而应用在密码学中就要优先考虑抗碰撞性,避免出现两段不同明文hash值相同的情况发生。 2.1