哈希表

hashCode及HashMap中的hash()函数

夙愿已清 提交于 2019-12-01 05:42:16
hashCode及HashMap中的hash()函数 一、hashcode是什么 要理解hashcode首先要理解hash表这个概念 1. 哈希表 hash表也称散列表(Hash table),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。 简单理解就是:在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。 具有快速查找和插入操作的优点 2. hashcode hashcode 通过hash函数计算得到,hashcode就是在hash表中有对应的位置 每个对象都有hashcode,通过将对象的物理地址转换为一个整数,将整数通过hash计算就可以得到hashcode 二、hashcode的作用 HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址的 对于容器类设计 基本上都会涉及到hashCode。在Java中也一样

Redis 命令-哈希(Hash)

China☆狼群 提交于 2019-12-01 05:08:05
Redis 哈希(Hash) Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。 Redis 中每个 hash 可以存储 2 32 - 1 键值对(40多亿)。 注:未避免大key,最多不要超过5000个键值对。 实例 127.0.0.1:6379> HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000 OK 127.0.0.1:6379> HGETALL runoobkey 1) "name" 2) "redis tutorial" 3) "description" 4) "redis basic commands for caching" 5) "likes" 6) "20" 7) "visitors" 8) "23000" 在以上实例中,我们设置了 redis 的一些描述信息(name, description, likes, visitors) 到哈希表的 runoobkey 中。 Redis hash 基本命令 1. HDEL key field1 [field2] 删除一个或多个哈希表字段 2. HEXISTS key field

算法与数据结构9 - 哈希表

房东的猫 提交于 2019-12-01 04:38:18
哈希表   数据成员(Data Member)   操作(Operations)   哈希(Hash)   冲突(Collisions)   解决方案(Resolution) 哈希表起源:   数组查找:线性增加,时间复杂度是O(n)   我们可以通过数组索引,直接访问块(Block),这种方法的访问时间是常数   数组:     牺牲空间换取时间 ——‘holes’会吃掉很多存储空间     依赖于元素之间的顺序,元素之间的顺序将会转化为数据存储在内存空间上的顺序 来源: https://www.cnblogs.com/lvxiaoning/p/11654543.html

Map 接口有哪些类

跟風遠走 提交于 2019-12-01 04:30:00
Map接口 Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value; Map中的键值对以Entry类型的对象实例形式存在; 建(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个建最多只能映射到一个值。 Map支持泛型,形式如:Map<K,V> Map中使用put(K key,V value)方法添加 Map接口中定义的常用方法 具体使用在实现类中讨论 int size();//获取Map集合大小(即元素数量) boolean isEmpty();//判断是否为空 boolean containsKey(Object key);//判断是否包含某个键 boolean containsValue(Object value);//判断是否包含某个值 V get(Object key);//获取某个键对应的值 V put(K key, V value);//添加键值对(K,V) V remove(Object key);//移除某个键对应的键值对 void putAll(Map<? extends K, ? extends V> m);//添加另一个Map集合 void clear();//清空所有键值对 Set<K> keySet();//获取键的集合 Collection<V>

redis源码分析3---结构体---字典

被刻印的时光 ゝ 提交于 2019-12-01 03:23:28
redis源码分析3---结构体---字典 字典,简单来说就是一种用于保存键值对的抽象数据结构; 注意,字典中每个键都是独一无二的;在redis中,内部的redis的数据库就是使用字典作为底层实现的; 1 字典的实现 在redis中,字典是使用哈希表作为底层实现的,一个hash表里面可以有多个hash表节点,而每个hash表节点就保存了字典中的一个键值对; hash表定义 table属性是一个数组,数组中的每个元素都是一个指向dictEntry结构的指针,每个dictEntry结构保存着一个键值对; 一个空的hash表: hash表节点 key保存键值对中的键,v为值,union表示三个钟选择一个,next是指向另一个hash表节点的指针,这个指针可以将多个hash值相同的键值对连接在一起,以此来解决冲突的问题; 比如 字典结构 总的来说,没有rehash的字节结构图如下 2 hash算法 当要将一个新的键值对添加到字典里面时,程序需要先根据键值对的键计算出hash值和索引值,然后再根据索引值,将包含新建支队的hash表节点放到哈市表数组的制定索引上面。 3 解决冲突 在hash表中不可避免的会出现冲突,当有两个或者两个以上的键被分配到了hash表数组的同一个索引上面时,就说发生了冲突; 在redis中使用链地址法来解决键冲突;就是我们在前面的结构中定义的next指针实现的; 4

SGI-STL简记(八)-哈希关联容器(hash、hash_set、hash_map、hash_multiset、hash_multimap)

て烟熏妆下的殇ゞ 提交于 2019-12-01 02:04:48
stl_hash_fun.h : hash:模板函数对象类类型,一般作为hash_set、hash_map、hash_multiset、hash_multimap容器的默认哈希函数,目前提供了多个特化版本,并重载实现operator(),参数类型有char、unsigned char、char*、int等 内置可转化为整型的数据类型的版本;除const char*和char*使用了__stl_hash_string计算哈希值,其余的则直接返回参数value值作为哈希值;哈希值返回值类型为size_t; __stl_hash_string:遍历各个字符串元素,累积遍历计算哈希值,计算方式为h=0;h=5*h+*s,*s为遍历字符串相应元素,h即为最后的哈希值,类型为unsigned long; 对于其他的hash模板实例实现,如basic_string<_CharT,_Traits,_Alloc>、crope、wrope或者是用户自定义的hash模板函数对象实现; stl_hashtable.h : _Hashtable_node:哈希表节点模板类; 数据成员: _M_next:指向下一个哈希表节点的指针; _M_val:保存当前哈希表节点的值(哈希值); _Hashtable_iterator/_Hashtable_const_iterator:哈希表迭代器模板类,模板参数_Val

数据库索引

给你一囗甜甜゛ 提交于 2019-11-30 19:51:53
我们通过一个简单的例子来开始教程,解释为什么我们需要数据库索引。假设我们有一个数据库表 Employee, 这个表有三个字段(列)分别是 Employee_Name、Employee_Age 和Employee_Address。假设表Employee 有上千行数据。 现在假设我们要从这个表中查找出所有名字是‘Jesus’的雇员信息。我们决定使用下面的查询语句: SELECT * FROM Employee WHERE Employee_Name = 'Jesus' 如果表中没有所以会发生什么? 一旦我们运行这个查询,在查找名字为Jesus的雇员的过程中,究竟会发生什么?数据库不得不Employee表中的每一行并确定雇员的名字(Employee_Name)是否为 ‘Jesus’。由于我们想要得到每一个名字为Jesus的雇员信息,在查询到第一个符合条件的行后,不能停止查询,因为可能还有其他符合条件的行。所以,必须一行一行的查找直到最后一行-这就意味数据库不得不检查上千行数据才能找到所以名字为Jesus的雇员。这就是所谓的全表扫描。 数据库索引是怎样提升性能的? 你可能会想为如此简单的事情做全表扫描效率欠佳-数据库是不是应该更聪明一点呢?这就像用人眼从头到尾浏览整张表-很慢也不优雅(原文:not at all sleek,不知如何翻译才好)。但是,你可以能根据文章标题已经猜到

夯实Java基础系列19:一文搞懂Java集合类框架,以及常见面试题

牧云@^-^@ 提交于 2019-11-30 19:04:41
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: www.how2playlife.com 本文参考 https://www.cnblogs.com/chenssy/p/3495238.html 在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影! java中集合大家族的成员实在是太丰富了,有常用的ArrayList、HashMap、HashSet,也有不常用的Stack、Queue,有线程安全的Vector、HashTable,也有线程不安全的LinkedList、TreeMap等等! 上面的图展示了整个集合大家族的成员以及他们之间的关系。下面就上面的各个接口、基类做一些简单的介绍(主要介绍各个集合的特点。区别)。 下面几张图更清晰地介绍了结合类接口间的关系: Collections和Collection。 Arrays和Collections。 Collection的子接口 map的实现类 Collection接口 Collection接口是最基本的集合接口,它不提供直接的实现,Java

[一本通学习笔记] 字符串哈希

☆樱花仙子☆ 提交于 2019-11-30 16:33:00
做字符串哈希我们通常要选定一个模数和一个基底。这样我们就可以快速处理出一个字符串的hash,并且可以做到log时间内求出一个子串的Hash。 哈希表虽然好写并且跑得快但心里总有点发虚。 #10034. 「一本通 2.1 例 2」图书管理 题目很裸,注意getline(cin,...)的使用。 #include <bits/stdc++.h> using namespace std; #define modulo 10000007 #define base 131 int buck[10000009]; int getHash(string s) { int res = 0; for(int i=0;i<s.length();i++) res = ((res*base)+s[i])%modulo; return res; } int main() { ios::sync_with_stdio(false); int n; cin>>n; string tmp; getline(cin,tmp); for(int i=1;i<=n;i++) { getline(cin,tmp); if(tmp[0]=='a') buck[getHash(tmp.substr(4,tmp.length()-4))]=1; else cout<<(buck[getHash(tmp.substr(5,tmp

好程序员大数据学习路线分享什么是Hash表

爷,独闯天下 提交于 2019-11-30 14:58:06
  好程序员大数据学习路线分享什么是Hash表,Hash,一般翻译做“散列”,也有直接音译为“哈希”的,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙。 ​ 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。比如我们存储70个元素,但我们可能为这70个元素申请了100个元素的空间。70/100=0.7,这个数字称为负载(加载)因子。我们之所以这样做,也 是为了“快速存取”的目的。我们基于一种结果尽可能随机平均分布的固定函数H为每个元素安排存储位置,以达到快速存取。但是由于此随机性,也必然导致一个问题就是冲突。所谓冲突,即两个元素通过散列函数H得到的地址相同,那么这两个元素称为“同义词”。这类似于70个人去一个有100个椅子的饭店吃饭。散列函数的计算结果是一个存储单位地址,每个存储单位称为“桶”。设一个散列表有m个桶,则散列函数的值域应为[0,m-1]。   这些元素是按照什么样的规则存储到数组中呢。一般情况是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到