哈希表

20191211——java力扣 两数之和

删除回忆录丶 提交于 2019-12-12 12:33:39
两数之和 之前都是用python来完成的力扣上的题目,听一个师兄说还是用编译型语言来完成题目比较好,复习了一下java,然后用java来完成题目 第一个方法还是暴力破解法 遍历之后用一个变量存储差值,然后来遍历nums[j]有没有等于这个差值,然后返回 class Solution { public int [ ] twoSum ( int [ ] nums , int target ) { int [ ] result = new int [ 2 ] ; for ( int i = 0 ; i < nums . length ; i ++ ) { int dif = target - nums [ i ] ; for ( int j = i + 1 ; j < nums . length ; j ++ ) { if ( nums [ j ] == dif ) { result [ 0 ] = i ; result [ 1 ] = j ; } } } return result ; } } 第二个方法利用哈希表进行处理,会减少查询时间 基础中也学习到过哈希表,是一个map键值(key)-数值(value)对应类型存储数据的接口,数组中我们索引的是数组下标来对内容进行查询,但是在map中我们通过对象来进行索引,索引的对象叫做key,获取到的内容叫做value

来吧!一文彻底搞定哈希表!

泪湿孤枕 提交于 2019-12-12 01:09:59
哈希表是个啥? 小白 : 庆哥,什么是哈希表?这个哈希好熟悉,记得好像有HashMap和HashTable之类的吧,这是一样的嘛?😊 庆哥: 这个哈希确实经常见😂,足以说明它是个使用非常频繁的玩意儿,而且像你说的HashMap和HashTable之类的与哈希这个词肯定是有关系的,那哈希是个啥玩意啊,这个咱们还是得先来搞明白啥是个哈希表。😎 我们看看百科解释吧: 散列表 ( Hash table ,也叫 哈希表 ),是根据 键 (Key)而直接访问在内存存储位置的 数据结构 。也就是说,它通过计算一个关于键值的函数,将所需查询的数据 映射 到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做 散列函数 ,存放记录的数组称做 散列表 。 怎么样?看到这个,你知道哈希表是什么了嘛? 小白: 我之前是对哈希表一窍不通啊,不过看了这个百科的解释,我知道如下这些关于哈希表的简单知识点: 1、哈希表其实也叫散列表,两个是一个玩意,英文是Hash Table 2、哈希表是一个数据结构 这两个概念是比较清晰的,至于其他的说什么映射函数叫做散列函数,存放记录的数组叫做散列表这个就有点模糊了,尤其说存放记录的数组称为散列表,那意思是哈希表是个数组?🤣 庆哥: 首先你说的很清晰的两点说的是很准确的,哈希表也叫做散列表,这只不过是叫法而已,英文单词是Hash table

并发容器的原理,七大并发容器详解、及使用场景

我是研究僧i 提交于 2019-12-11 23:47:05
并发容器的由来 在Java并发编程中,经常听到Java集合类,同步容器、并发容器,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理清楚了,你才能真正掌握在高并发的环境下,正确使用好并发容器,我们先从Java集合类,同步容器谈起。 1.什么是同步容器 Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map,大家熟知的这些集合类ArrayList、LinkedList、HashMap这些容器都是非线程安全的。 如果有多个线程并发地访问这些容器时,就会出现问题。因此,在编写程序时,在多线程环境下必须要求程序员手动地在任何访问到这些容器的地方进行同步处理,这样导致在使用这些容器的时候非常地不方便。 所以,Java先提供了同步容器供用户使用。 同步容器可以简单地理解为通过synchronized来实现同步的容器 ,比如Vector、Hashtable以及SynchronizedList等容器。 2.同步容器,主要的分类: Vector Stack HashTable Collections.synchronized方法生成 同步容器面临的问题 可以通过查看Vector,Hashtable等这些同步容器的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来, 并在需要同步的方法上加上关键字synchronized。

并发容器的原理,七大并发容器详解、及使用场景

夙愿已清 提交于 2019-12-11 22:40:49
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 并发容器的由来 在Java并发编程中,经常听到Java集合类,同步容器、并发容器,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理清楚了,你才能真正掌握在高并发的环境下,正确使用好并发容器,我们先从Java集合类,同步容器谈起。 1.什么是同步容器 Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map,大家熟知的这些集合类ArrayList、LinkedList、HashMap这些容器都是非线程安全的。 如果有多个线程并发地访问这些容器时,就会出现问题。因此,在编写程序时,在多线程环境下必须要求程序员手动地在任何访问到这些容器的地方进行同步处理,这样导致在使用这些容器的时候非常地不方便。 所以,Java先提供了同步容器供用户使用。 同步容器可以简单地理解为通过synchronized来实现同步的容器 ,比如Vector、Hashtable以及SynchronizedList等容器。 2.同步容器,主要的分类: Vector Stack HashTable Collections.synchronized方法生成 同步容器面临的问题 可以通过查看Vector,Hashtable等这些同步容器的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,

Hash passward with salted value

回眸只為那壹抹淺笑 提交于 2019-12-11 17:41:02
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1 盐值哈希的基本概念: 哈希密码利用特定的哈希函数将明文密码转换为密文。然而,这样的密码也不是非常安全的,黑客可以通过字典、彩虹表(网上就可以免费下载)对这种密码进行暴力破解,所以单纯的哈希密码还不足以应付安全问题。所以需要加入盐值( salt value )。 带盐值的哈希密码,就是在原始密码的基础上添加一个“盐值”,然后对新生成的明文进行哈希,得到的密码密文,就是带盐值的哈希密码。 2 工作原理: 带盐值的哈希密码算法设计思想: 在首次创建密码和修改密码时: 1 )将用户提供的密码和系统生成的一个比较复杂的附加码(即盐值)进行结合,对结合的结果进行哈希运算; 2 )然后系统为该用户随机生成一个指定长度的字节序列,把这个序列和刚刚哈希运算的结果进行结合,再进行哈希运算; 3 )哈希结果与第二个盐值结合,得到最终的密文。存入数据库。 当用户登录时,相应的验证过程是: 1 )用户提供用户名和密码; 2 )系统通过用户名找到与之对应的 Hash 值和 Salt 值; 3 )系统将 Salt 值和用户提供的密码连接到一起; 4 )对连接后的值进行散列,得到 Hash' ; 5 )比较 Hash 和 Hash' 是否相等,相等则表示密码正确,否则表示密码错误。 参考资料 : http://blog.sina.com

查找3—散列表的查找

拜拜、爱过 提交于 2019-12-11 11:56:08
前言: 这是查找这个知识点的最后一个部分,个人感觉这部分真的很好理解,就简单的逻辑思维,不需要绕弯,基本上就可以解决大部分的题目。合理的应用查找的总体效率也是很高的 。主要说三个模块的事情: 构造方法 , 处理冲突方法 , 查找 。 那么引入一下,前面我们说了顺序表的查找、树表的查找,但是我们发现,就算再优化,它们的时间复杂度最小也是log 2 n级别的。那么我们肯定是希望能找到更优的算法,最好就是n(1)级别的,如果能利用公式直接的求解,那么不是直接就可以找到了,不需要依次比较了吗?所以就有了我们要说的散列表的查找(也叫哈希表)。 一、构造方法 来看看基本的概念: 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。 构造方法有很多, 数字分析法 、 平方取中法 、 折叠法 、 除留余数法 (这个是 最常用 的)。只需要思考一下就知道我们构造其实就是制定一个规则,使我们的元素可以按照这个规则查找到,当然

Bloom Filter布隆过滤器原理和实现(1)

若如初见. 提交于 2019-12-11 07:48:52
引子 《数学之美》介绍布隆过滤器非常经典: 在日常生活中,包括设计计算机软件时,经常要判断一个元素是否在一个集合中。比如: 在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断它是否在已知的字典中); 在FBI,一个嫌疑人的名字是否已经在嫌疑犯的名单上; 在网络爬虫里,一个网站是否已访问过; yahoo, gmail等邮箱垃圾邮件过滤功能,等等 ... 以上场景需要解决的共同问题是: 如何查看一件事物是否在有大量数据的集合里 。 通常的做法有以下几种思路: 数组、 链表、 树、平衡二叉树、Trie map (红黑树) 哈希表 上面这几种数据结构配合一些搜索算法是可以解决数据量不大的问题,但当集合里面的数据量非常大的时候,就会出现问题。比如:有500万条记录甚至1亿条记录?这个时候常规的数据结构的问题就凸显出来了。数组、链表、树等数据结构会存储元素的内容,一旦数据量过大,消耗的内存也会呈现线性增长,最终达到瓶颈。哈希表查询效率可以达到O(1)。但是哈希表需要消耗的内存依然很高。使用哈希表存储一亿 个垃圾 email 地址的消耗?哈希表的做法:首先,哈希函数将一个email地址映射成8字节信息指纹;考虑到哈希表存储效率通常小于50%(哈希冲突);因此消耗的内存:8 * 2 * 1亿 字节 = 1.6GB 内存。因此,存储几十亿个邮件地址就可能需要上百GB的内存

Redis数据库基础操作

冷暖自知 提交于 2019-12-11 00:07:06
MySQL和Redis的区别 """ redis: 内存数据库(读写快,IO操作少)、非关系型(操作数据方便) mysql: 硬盘数据库(数据持久化,IO操作多)、关系型(操作数据间关系) 大量访问的临时数据,才有redis数据库更优 """ redis和memcache的区别 """ redis: 操作字符串、列表、字典、无序集合、有序集合 | 支持数据持久化(数据丢失可以找回、可以将数据同步给mysql) | 高并发支持 并且redis数据库中的数据,在电脑重启的之后,数据不会丢失 memcache: 操作字符串 | 不支持数据持久化 | 并发量小 """ redis操作 """ 基础操作: 启动服务:redis-server & 连接数据库:redis-cli 连接指定数据库:redis-cli -h 127.0.0.1 -p 6379 -n 1 # redis:默认16个数据库,当不指定数据库的时候,一般会存在第0(1)个数据库中 # 当指定的数据库,在redis中没有时,默认将数据都放在第0个数据中 切换数据库:select 1---从当前的数据库切换到另外一个数据库中 数据操作:字符串、列表、字典、无序集合、有序(排序)集合 有序集合:游戏排行榜 """ Redis 字符串命令 下表列出了常用的 redis 字符串命令: 序号 命令及描述 1 [**SET key

JAVA常见面试题

烂漫一生 提交于 2019-12-10 22:24:12
集合和数组的比较 数组 初始化后长度不能改变,存储同一种类型的引用数据或者基本数据类型,查询方便效率高,内容可以重复,可以根据索引查找。 集合 可以改变集合的长度,集合里可以存储不同类型的数据。 简述List、Set、Collection、Map的区别和联系。 Collection接口每次存储的是单一的数据,无序。可以根据foreach或者迭代器遍历。 Map接口是以键值对形式存储数据的,key值不能相同,如果相同value会被覆盖。 List,Set继承了Collection接口。 List存储的数据可以重复是有序的。 Se存储的数据不能重复是无序的。 ArrayList和LinkedList的区别和联系。 ArrayList底层是通过数组实现的,可以扩展,查询数据效率高。可以通过索引查找数据,遍历可以通过 普通for循环,foreach,迭代器。 LinkedList底层是通过双向链表实现的,可以扩展,增删方便,查找效率不高。遍历可以用foreach,迭代器有新增的listiterator方法。 HashSet采用了哈希表作为存储结构,请说明哈希表的特点。 哈希表具有查找和增删都效率高的特点,通过数组+链表或者红黑树实现。 Vector和ArrayList的区别和联系。 Vector和ArrayList实现方法都相同,不过Vector线程安全,ArrayList线程不安全

javaoop集合Collection 介绍整理

丶灬走出姿态 提交于 2019-12-10 20:43:26
概念: 集合是长度可变的容器,可以存储不同类型的元素,只能存储引用数据类型 但是存整数是通过integer基本类型封装类进行存储的 java语言是面向对象的语言,为了方便对每一个对象操作,将这个对象存储到集合中 jdk把一套容器类,称为集合框架 java.util包下 集合分类 单列集合 Collection(value) List接口 (继承了collection接口):元素按进入先后有序保存,可以重复 (这个常用 比较重要) linkedList 接口实现类,链表结构,插入删除,没有同步,线程不安全 ArrayList 接口实现类,数组结构,随机访问,没有同步,线程不安全 Vector 接口实现类 数组结构 同步 线程安全 Stack 是Vector类的实现类 Set接口(继承了collection接口):仅接收一次,不可重复,并做内部排序 HashSet 使用hash表(数组)储存元素 允许null元素 线程不安全 LinkedHashSet链表维护元素的插入次序(底层是链表和哈希表结构) TreeSet 底层实现为二叉树,元素排好序 LinkedHashSet:底层是哈希表和链表结构,元素有序,元素唯一原理和hashset一致 线程不安全 双列集合 Map(Key-Value)双列集合 Map(元素:键值对,对键有唯一性约束,可以通过键获取对应的值 ) HashMap