哈希表

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

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

重复的DNA序列[哈希表] LeetCode.187

回眸只為那壹抹淺笑 提交于 2019-11-28 04:13:32
所有 DNA 由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。 编写一个函数来查找 DNA 分子中所有出现超多一次的10个字母长的序列(子串)。 示例: 输入: s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" 输出: ["AAAAACCCCC", "CCCCCAAAAA"] 思路: 设置一个hash表,存储已经出现过的十位字串; 遍历字符串,截取十位字串,并更新哈希表; 如果字串已经在hash表中,且只出现过一次的时候便将其加入到答案数组(只一次时加入,二次就不加了,为了防止重复) 代码如下: vector<string> findRepeatedDnaSequences(string s) { unordered_map<string,int> hash; string st;vector<string>ans; for(int i = 0 ; i < s.size();i++){ st = s.substr(i,10); if(1==hash[st]++ )ans.push_back(st); } sort(ans.begin(),ans.end()); return ans; } 来源:力扣(LeetCode) 链接: https:/

redis 哈希 数据类型

早过忘川 提交于 2019-11-28 03:27:23
哈希 hset 设置哈希表字段 hset 8000 ename tom hset 8000 job salesman hget 8000 ename "tom" hget 获取哈希表字段值 hmget 获取多个哈希表字段值 hgetall 获取所有哈希表字段值 hmset 设置哈希表多个字段 hmset 8000 ename tom job salesman deptno hkeys 获得所有哈希表字段名 hkeys 9000 "ename" "job" hvals 获得所有哈希表字段值 1) "tom" 2) "salesman" hlen 获取字段数量      hlen 9000 2 hexists 判断哈希表是否存在某个字段   hexists 8000 job 1存在 0 不存在 hdel 删除哈希表的字段 hdel 8000 job hincrby : 让哈希表某个字段值 加上 指定的整数值 (可以加负数) hincrby 8000 deptno 10 hincrbyfloat : 让哈希表某个字段值 加上 指定的浮点数 (可以加负数) hincrby 8000 deptno 10.5 来源: https://www.cnblogs.com/ericblog1992/p/11389025.html

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为基础

redis(一)redis内存模型

六眼飞鱼酱① 提交于 2019-11-27 23:55:15
本文转载自: https://www.cnblogs.com/kismetv/p/8654978.html#t1 redis内存统计 在客户端通过redis-cli连接服务器后(后面如无特殊说明,客户端一律使用redis-cli),通过info命令可以查看内存使用情况: 127.0.0.1:6379> info memory # Memory used_memory:2132344 used_memory_human:2.03M used_memory_rss:5607424 used_memory_rss_human:5.35M used_memory_peak:2275152 used_memory_peak_human:2.17M used_memory_peak_perc:93.72% used_memory_overhead:2075094 used_memory_startup:791264 used_memory_dataset:57250 used_memory_dataset_perc:4.27% allocator_allocated:2134144 allocator_active:2404352 allocator_resident:5029888 total_system_memory:1745100800 total_system_memory

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)    二叉树

算法实战(一)两数之和

旧城冷巷雨未停 提交于 2019-11-27 18:37:53
一.前言   一直以来,算法学来学去,但是真正解题的时候,却运用不上来,在项目conding的时候,也不会想到。归根结底还是缺乏了必要的练习,现在开始刷leetcode,从头开始,坚持每天一题。 二.题目   题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。      你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。   示例:给定 nums = [2, 7, 11, 15], target = 9,因为 nums[0] + nums[1] = 2 + 7 = 9,所以返回 [0, 1] 三.解题思路   1.常见思路:这个题的最容易想到的就是暴力解法,两层循环,第一层中依次取出数组中的每个元素,第二层中依次取出第一层数组元素之后的元素,然后两个数相加与目标值target进行对比。代码如下: 1 class Solution { 2 public int[] twoSum(int[] nums, int target) { 3 for(int i = 0; i < nums.length; i++){ 4 for(int j = i + 1; j < nums.length; j++){ 5 if(nums[i] + nums[j] == target){ 6

Two Sum

别说谁变了你拦得住时间么 提交于 2019-11-27 18:35:49
题目链接 【英文版】 https://leetcode.com/problems/two-sum/ 【中文版】 https://leetcode-cn.com/problems/two-sum/ 题目 给定一个整数数组 \(nums\) 和一个目标值 \(target\) ,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 :type nums: List[int] :type target: int :rtype: List[int] 示例 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 解法 暴力搜索 遍历 \(nums\) 中的每一个元素 \(x\) ,查找 \(nums\) 中另一个元素 \(j\) 使得 \(x+j=target\) ★ 时间复杂度: \(O(n^2)\)   对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 ★ 空间复杂度: \(O(1)\) Brute Force -python-1 ```python class Solution(object): def twoSum(self, nums, target)

拼写单词[哈希表]----leetcode5048

假如想象 提交于 2019-11-27 18:23:58
给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars 。 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。 注意:每次拼写时, chars 中的每个字母都只能用一次。 返回词汇表 words 中你掌握的所有单词的 长度之和。 示例 1: 输入:words = ["cat","bt","hat","tree"], chars = "atach" 输出:6 解释: 可以形成字符串 "cat" 和 "hat",所以答案是 3 + 3 = 6。 示例 2: 输入:words = ["hello","world","leetcode"], chars = "welldonehoneyr" 输出:10 解释: 可以形成字符串 "hello" 和 "world",所以答案是 5 + 5 = 10。 提示 1 <= words.length <= 1000 1 <= words[i].length, chars.length <= 100 所有字符串中都仅包含小写英文字母 来源: https://www.cnblogs.com/zhangxiaomao/p/11372076.html

JUC基本使用——并发集合和同步工具类

╄→尐↘猪︶ㄣ 提交于 2019-11-27 16:21:33
并发集合 普通的集合中有List(ArrayList|LinkedList)、Set(HashSet|TreeSet)和Map(HashMap|TreeMap)集合,这些集合只适合在单线程情况下使用。 在Collecionts工具类中有synchronized开头方法可以把单线程集合转成支持并发的集合,但是效率不高,很少使用。 为了更好的实现集合的高并发访问处理,JUC创建了一组新的集合工具类,其使用和一般的集合一样,使用方法参照 “Java之集合” 的分类。 1. List和Set集合 CopyOnWriteArrayList相当于线程安全的ArrayList,实现了List接口,支持高并发 CopyOnWriteArraySet相当于线程安全的HashSet,它继承了AbstractSet类,内部是通过CopyOnWriteArrayList实现的,所以是有序的 set 集合 2.Map集合 ConcurrentHashMap是线程安全的哈希表(相当于线程安全的HashMap);它继承于AbstractMap类,并且实现ConcurrentMap接口。 该集合在jdk1.7之前是采用的分段锁机制,将哈希表分为16段,每段是一个锁,每个段又都是哈希表,写入扩容锁定,读取共享,类似于读写锁机制。 在jdk1.8之后,取消分段锁,改用CAS无锁算法,提高写入小路,另外put方法有锁