哈希表

LeetCode01: 两数之和

混江龙づ霸主 提交于 2020-01-31 05:59:35
题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 解题思路: 方法1: 暴力法 遍历每个元素 x,并查找是否存在一个值与target−x 相等的目标元素。 class Solution { public int[] twoSum(int[] nums, int target) { for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { if (nums[j] == target - nums[i]) { return new int[] { i, j }; } } } throw new IllegalArgumentException("No two sum solution"); } } 复杂度分析: 时间复杂度: O(n²) 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n)的时间

哈希表空间换时间原理

删除回忆录丶 提交于 2020-01-31 04:13:55
哈希表原理不再冗述,以下只记录关键原理。 哈希表的长度一般是定长的,在存储数据之前我们应该知道我们存储的数据规模是多大,应该尽可能地避免频繁地让哈希表扩容。但是如果设计的太大,那么就会浪费空间,因为我们跟不用不到那么大的空间来存储我们当前的数据规模;如果设计的太小,那么就会很容易发生哈希冲突,体现不出哈希表的效率。所以,我们设计的哈希表的大小,必须要做到尽可能地减小哈希冲突,并且也要尽可能地不浪费空间,选择合适的哈希表的大小是提升哈希表性能的关键。 简而言之,哈希表的效率关键在于采用的哈希算法和哈希冲突。哈希冲突越低,效率越高。为了降低哈希冲突,需要采用大于实际存储数据数量的哈希表,这就是空间换时间的原理。 哈希表在STL中采用桶节点作为内存模型。 来源: CSDN 作者: 初夏微凉夜 链接: https://blog.csdn.net/u010810750/article/details/104119273

哈希表

妖精的绣舞 提交于 2020-01-31 03:11:49
一:什么是哈希表 哈希表是基于数组来实现的一种数据结构,提高了快速的插入和查找操作 二:哈希化 1.直接将关键字作为索引(关键字是数字类型) 2.将单词转换成索引(关键字是string类型) 2.1将字母转换成ASCII码,然后进行相加 存在风险: 比如: key1=abc , ,key2=bbb ;key1和key2通过将字母转化成ascii码后相加的值相等 2.2幂的连乘 1 27^2 + 2 27^1 + 3*27^0 … (27代表26个字母加一个空格 , 1代表第一个字母,2代表第二个字母…) 存在风险: 1.数组索引太大,造成空间浪费 ; 2.索引越界(大于int / long类型的界限) 2.3压缩可选值 把幂连乘的结果对数组长度取模,再把取模后的结果当成索引存进数组中 使用BigInteger类型代替int/long类型,避免幂连乘的结果越界 存在风险: 1.取模后会出现重复值,导致存进去数组的数据被覆盖掉 ; 三:压缩后任然可能出现的问题 冲突: 不能保证每个单词都映射到数组的空白单元 解决办法: 1.开放地址法 2.链地址法 四:代码实现 1.关键字作为索引 1.1创建JavaBean public class Person { private int id ; private String name ; public Person ( int id ,

哈希表之开放地址法

ⅰ亾dé卋堺 提交于 2020-01-31 01:04:29
作用: 解决因为幂连乘之后的压缩可选值二产生的索引冲突问题. 一:什么是开放地址法 当冲突发生的时候,通过查找数组的一个空位,并将数值填充进去,而不再是使用哈希函数得到的数组下标,就叫做开放地址法 二:代码实现 1.创建JavaBean类 public class Person { private String key ; private String name ; public Person ( String key , String name ) { this . key = key ; this . name = name ; } public String getKey ( ) { return key ; } public void setKey ( String key ) { this . key = key ; } public String getName ( ) { return name ; } public void setName ( String name ) { this . name = name ; } } 2.HashTable,使用开放地址法插入数据/查找数据/删除数据 import java . math . BigInteger ; public class HashTable { //数组 private Person [ ] arr ;

布隆过滤器

十年热恋 提交于 2020-01-30 14:50:10
不同的数据结构有不同的适用场景和优缺点,你需要仔细权衡自己的需求之后妥善适用它们,布隆过滤器就是践行这句话的代表。 什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。 相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。 实现原理 HashMap 的问题 讲述布隆过滤器的原理之前,我们先思考一下,通常你判断某个元素是否存在用的是什么?应该蛮多人回答 HashMap 吧,确实可以将值映射到 HashMap 的 Key,然后可以在 O(1) 的时间复杂度内返回结果,效率奇高。但是 HashMap 的实现也有缺点,例如存储容量占比高,考虑到负载因子的存在,通常空间是不能被用满的,而一旦你的值很多例如上亿的时候,那 HashMap 占据的内存大小就变得很可观了。 还比如说你的数据集存储在远程服务器上,本地服务接受输入,而数据集非常大不可能一次性读进内存构建 HashMap 的时候,也会存在问题。 布隆过滤器数据结构 布隆过滤器是一个 bit 向量或者说 bit 数组,长这样: image 如果我们要映射一个值到布隆过滤器中

哈希表

岁酱吖の 提交于 2020-01-30 01:56:50
哈希表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。   对哈希表的使用者一一人来说,这是一瞬间的事。哈希表运算得非常快,在计算机程序中,如果需要在一秒种内查找上千条记录通常使用哈希表(例如拼写检查器)哈希表的速度明显比树快,树的操作通常需要O(N)的时间级。哈希表不仅速度快,编程实现也相对容易。   哈希表也有一些缺点它是基于数组的,数组创建后难于扩展某些哈希表被基本填满时,性能下降得非常严重,所以程序虽必须要清楚表中将要存储多少数据(或者准备好定期地把数据转移到更大的哈希表中,这是个费时的过程)。   而且,也没有一种简便的方法可以以任何一种顺序〔例如从小到大〕遍历表中数据项。如果需要这种能力,就只能选择其他数据结构。 然而如果不需要有序遍历数据,井且可以提前预测数据量的大小。那么哈希表在速度和易用性方面是无与伦比的。 哈希表算法-哈希表的概念及作用   一般的线性表,树中,记录在结构中的相对位置是随机的,即和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较。这一类查找方法建立在“比较“的基础上,查找的效率依赖于查找过程中所进行的比较次数。  

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

≯℡__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、平方取中法