哈希表

Redis 哈希(Hash)的使用及实例介绍

匿名 (未验证) 提交于 2019-12-03 00:44:02
Redis 哈希(Hash) Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。 Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。 实例 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 命令 下表列出了 redis hash 基本的相关命令: 序号 命令及描述 1 HDEL key field1 [field2] 删除一个或多个哈希表字段 2 HEXISTS key field 查看哈希表

Redis压缩列表

匿名 (未验证) 提交于 2019-12-03 00:43:02
此篇文章是笔者在学习过程中的总结。主要介绍Redis在数据存储方面的其中一种方式,压缩列表。在实践上的操作主要是对conf配置文件进行配置,具体上没有确切的一个值,更多是经验值。也有的项目会直接使用原本的默认值。此篇对于更好地理解一个数据库底层的存储逻辑会有一点帮助。修学储能,既要博,也要渊。希望这篇文章对同样也是在学习Redis的各位同伴有点用。 一、压缩列表(ziplist )的使用场景: Redis为了优化数据存储,节约内存,在列表、字典(哈希键)和有序集合的底层实现了使用压缩列表这一优化方案。 例如,假如一个哈希键里面存储的字符串比较短,那么Redis就会将它用压缩列表的格式去存储,即转换为字节数组存储。而一个哈希键内部存储的整数值比较小,同样也会把它存储为压缩列表的一个节点。同理,列表键的对小数据的存储跟哈希键的操作类似。 如此说来,压缩列表并不是开发者可以直接调用的Redis中的一种存储数据结构,而是Redis中为 优化数据存储而在底层做的一项努力 。理解好这点还是比较重要的。 二、如何达到节约内存的效果? 压缩列表是一种序列化的数据结构,这种数据结构的功能是将一系列数据与其编码信息存储在一块连续的内存区域,这块内存物理上是连续的。但逻辑上被分为多个组成部分,即节点。目的是为了在 一定可控的时间复杂度 条件下尽可能的减少不必要的内存开销,从而达到节省内存的效果

HashMap和Hashtable的区别

匿名 (未验证) 提交于 2019-12-03 00:43:02
二者继承的类与实现的接口 HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类(Dictionary类是一个已经被废弃的类)。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。 HashTable比HashMap多了两个公开方法。一个是elements,这来自于抽象类Dictionary,鉴于该类已经废弃,所以这个方法也就没什么用处了。另一个多出来的方法是contains,这个多出来的方法也没什么用,因为它跟containsValue方法功能是一样的。 Null Key & Null Value HashMap是支持null键和null值的,而HashTable在遇到null时,会抛出NullPointerException异常。这并不是因为HashTable有什么特殊的实现层面的原因导致不能支持null键和null值,这仅仅是因为HashMap在实现时对null做了特殊处理,将null的hashCode值定为了0,从而将其存放在哈希表的第0个bucket中。 线程安全 Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步。 HashMap不是线程安全的

HashMap实现原理及源码分析

匿名 (未验证) 提交于 2019-12-03 00:43:02
哈希表(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-12-03 00:41:02
  今天是7.20,是计划的截止日期。前几天一直在玩滑板拖着没写博客没学习,今天下午又学习了一遍哈希表的知识,按计划该写博文完成哈希表的学习。   哈希表(hash table)又称为散列表,是一种对实体进行索引的数据结构。它的特点是查询速度快,一个拥有好的哈希函数的哈希表,进行查找时可以实现均摊常量时间O(1)的时间复杂度,这无疑是很快速的查找速度。比方说,数组本身就是最简单的一种哈希表,根据数组下标可以快速找到下标对应的数组元素。   对于哈希表,根据解决冲突的形式不同,有开散列和闭散列两种形式。这里的“开、闭”可以形象地认为是,主表状态是发散(开散列)的还是一维线性结构(闭散列)。   有了对哈希表的大概了解,下面再详细介绍一下哈希表的基本组成部分。   首先,哈希表由键-值组成(key-value)。键是实体被索引时的标识符,值是被索引的实体。举下面一个例子对键和值进行说明:   《红楼梦》 ――――> 文学类, 在以上的例子中,文学类即是键,而《红楼梦》则是值。一般使用数组元素存储值,使用数组下标表示键。   其次,由值转化为键的过程,需要使用哈希函数,哈希函数是一种将值映射到键的规则与方法。哈希函数可以理解为值与键的对应关系。输入一个值,根据哈希函数,可以求得一个对应的键。一个好的哈希函数,会让将不同的值尽可能映射成不同的键。举下面一个例子对哈希函数进行说明:  

HashMap工作原理

匿名 (未验证) 提交于 2019-12-03 00:41:02
Hash表的概念 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表 几种数据结构在新增,查找,删除上的性能对比 数组 :采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n) 线性链表 :对于链表的新增,删除等操作(在找到指定操作位置后),仅需处理结点间的引用即可,时间复杂度为O(1),而查找操作需要遍历链表逐一进行比对,复杂度为O(n) 二叉树 :对一棵相对平衡的有序二叉树,对其进行插入,查找,删除等操作,平均复杂度均为O(logn)。 哈希表 :相比上述几种数据结构,在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下,仅需一次定位即可完成,时间复杂度为O(1),接下来我们就来看看哈希表是如何实现达到惊艳的常数阶O(1)的。 我们知道,数据结构的物理存储结构只有两种: 顺序存储结构 和 链式存储结构

【杨镇】【中译修订版】以太坊的分片技术官方介绍

匿名 (未验证) 提交于 2019-12-03 00:40:02
杨镇,资深软件架构师,资深开发工程师。以太坊技术爱好者与布道者。 是Solidity官方文档中译项目的重要贡献者,以太坊Homestead官方文档中文版译者,并对以太坊黄皮书中文版、Thunder共识白皮书中文版进行了独立校订。目前致力于以太坊技术推广及智能合约开发、安全审计方向。 原文链接: https://github.com/ethereum/sharding/blob/develop/docs/doc.md 作者: Vitalik 序言 本文的目的是为那些希望理解分片建议详情,乃至去实现它的朋友提供一份相对完整的细节说明和介绍。本文仅作为二次方分片(quadratic sharding)的第一阶段的描述;第二、三、四阶段目前不在讨论范围,同样,超级二次方分片(super-quadratic sharding)(“Ethereum 3.0”) 也不在讨论范围。 假设用变量 c 来表示一个节点的有效计算能力,那么在一个普通的区块链里,交易容量就被限定为 O(c),因为每个节点都必须处理所有的交易。二次方分片的目的,就是通过一种双层的设计来增加交易容量。第一层不需要硬分叉,主链就保持原样。不过,一个叫做 校验器管理和约 (validator manager contract,VMC)的合约需要被发布到主链上,它用来维持分片系统。这个合约中会存在 O(c) 个 分片 (目前为

数据结构--哈希表(散列表)

匿名 (未验证) 提交于 2019-12-03 00:22:01
在学习Java集合 HashMap 源码时,了解到了 HashMap 是底层的数据结构是基于哈希表(也叫散列表),意识到以前对于哈希表的学习也是浅尝辄止的,故做了一番功课以后,写下这篇文章。 散列表(Hash table,也叫哈希表),是根据关键码值(Key)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。 这样说可能有些抽象,但是别急,我们从哈希表的产生原因慢慢道来。 我们知道,数组通过下标直接访问一个元素的是非常快速的,专业一点来讲就是时间复杂度只有 O(1) ,其原因是因为数组在计算机内存内存储是直接申请了一块连续的内存,而数组的下标会直接对应一个元素的内存地址, 也就是说CPU就可以直接拿到元素地址去访问。 但是有些特殊的需求,比如一个键值对 ("《新华字典》":"cn-12345") 这种形式的数据,如果使用数组这种数据结构, 是很难实现物理意义上键和值的映射关系的。 当然你可以使用一维数组强行实现。 // 一维数组强行实现键值对映射,但需要定义自己的分隔符(我们使用 :) String

找一个字符串中第一个只出现一次的字符(牛客网)

匿名 (未验证) 提交于 2019-12-03 00:22:01
思路:普通思路就是先看第一个元素,遍历字符串看看每个字符总共在字符串中出现的次数,但是这是一个时间复杂度O(N)的算法,牛客上面是肯定跑不过的,所以我们可以想到用什么东西可以达到记录字符出现次数时间复杂度有符合要求的呢? 哈希表 这里是一个字符串,每个字符的取值范围不可能超过256,我们可以直接将哈希表定义出来并且初始化为全0,然后对应字符的ASCII存放在字符串中出现的次数,后面就可以遍历哈希表来确定哪一个字符是字符串中只出现一次的,由于我们是根据str[i]来遍历就可以保证遍历的时候就是按照原字符串中字符出现的先后顺序来的,一旦遇到hashtable[str[i]]==1,就直接返回 #include <iostream> using namespace std ; #include <string> #include <assert.h> char FindFirst ( string str ){ assert ( str . size () > 0 ); int hashtable [ 256 ] = { 0 }; int i = 0 ; for ( i = 0 ; i < str . size (); i ++){ hashtable [ str [ i ]]++; } for ( i = 0 ; i < str . size (); i ++){ if (

数据结构 哈希表(1)

匿名 (未验证) 提交于 2019-12-03 00:22:01
HashTable:散列表/哈希表。根据关键字key而直接进行访问数据结构;即哈希表是通过吧关键字值映射到表中的一个位置来访问记录 这个映射函数叫做散列函数,存放记录的数组叫做散列表/哈希表 若结构中存在关键字和K相等的记录,则必定存储在f(K)的位置上。因此,不需要比较便可以直接取得所要查找的记录。这个对应关系 f 称为散列函数,按照这个思想建立的表为散列表 构造散列表/哈希表的几种常用方法: 直接定址法 :取关键字的某个线性函数为散列地址,Hash(key)= key 或 Hash(key)= A*key + B,A、B为常数 除留余数法 :取关键值被某个不大于散列表长m的数p除后的所得的余数为散列地址。Hash(key)= key % p 平方取中法 折叠法 随机数法 数学分析法 不同的key值经过哈希函数Hash(key)处理以后可能产生相同的值哈希地址,我们称这种情况为哈希冲突 任意的散列函数都不能避免产生冲突。 开放定制法:指的是可存放新表项的空闲地址既可以向它的同义词表项开放,又可以向它的非同义词表项开放,其递推公式为:Hi=(H(key)+di)%m;其中m表示散列表表长,di为增量序列 线性探测法:当发生冲突时,若该索引对应的存储位置已有数据,则以线性的方式往后寻找空的存储位置此一来若后面的位置已被填满而前面还有位置时,可将数据放到前面 假设给出一组元素