哈希表

和为K的子数组-哈希表

坚强是说给别人听的谎言 提交于 2019-11-29 03:25:34
class Solution { public int subarraySum(int[] nums, int k) { HashMap<Integer,Integer> h=new HashMap<>(); int sum=0; int count=0; h.put(0,1); for(int i=0;i<nums.length;i++){ sum+=nums[i]; if(h.containsKey(sum-k)){ count+=h.get(sum-k); } h.put(sum,h.getOrDefault(sum,0)+1); } return count; } }    来源: https://www.cnblogs.com/NeverGiveUp0/p/11443033.html

Redis数据结构之字典

ぐ巨炮叔叔 提交于 2019-11-29 02:40:51
dict 是 Redis 服务器中出现最为频繁的复合型数据结构,除 hash 使用 dict 之外,整个 Redis 数据库中所有的 key 和 value 也会组成一个全局字典,还有带过期时间的 key 集合也是一个字典。 zset 集合中存储 value 和 score 的映射关系也是通过 dict 结构实现的。 结构 // 哈希表 typedef struct dictht { dictEntry **table; // 哈希表数组,二维 long size; // 哈希表大小 long used; // 哈希表已有节点数 } dictht; ​ // 哈希表节点 typedef struct dictEntry { void *key; // 键 void *val; // 值 dictEntry *next; // 指向下一个哈希表节点,形成链表 } dictEntry; 内部是二维数组 dict 内部是一个二维数组,包含两个 hashtable 。 通常情况下只有一个 hashtable 是有值的,但是在扩容、缩容时,需要分配新的 hashtable ,然后进行渐进式 rehash ,此时两个 hashtable 分别是旧的 hashtable 和新的 hashtable 。在 rehash 结束后,旧的 hashtable 被删除,新的 hashtable 取而代之。

python--redis

雨燕双飞 提交于 2019-11-29 02:24:34
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。 Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型 Redis的基本使用: 1.先来看看redis的安装 Redis在Linux Ubuntu中安装: #安装Redis服务器端 apt-get install redis-server #检查Redis服务器系统进程 ps -aux|grep redis-server #通过启动命令检查Redis服务器状态 netstat -nlt |grep 6379 #通过启动命令检查Redis服务器状态 sudo /etc/init.d/redis-server status 2.连接redis 通过命令行客户端访问Redis #客户端程序访问Redis服务器。 redis-cli #命令行的帮助 help #查看所有的key 列表 keys * 3.增加数据 #增加字符串记录 set key1 'hello'

ConcurrentHashMap源码详解

我怕爱的太早我们不能终老 提交于 2019-11-29 01:16:44
1. ConcurrentHashMap概述 ConcurrentHashMap是线程安全的哈希表,不同于HashTable,后者在方法上增加synchronized关键字,利用对象同步锁实现线程之间的同步。显然,HashTable实现线程安全的方式太“重”,并发度高的情况下,很多线程争用同一把锁,吞吐量较低。 ConcurrentHashMap通过锁分段技术,只有在同一个段内,才会存在锁竞争,提高了并发处理能力。它的内部数据结构其实是一个Segment数组,该数组的大小代表了ConcurrentHashMap的并发度,Segment同时也是一把可重入锁,该锁用来确保该段数据并发访问的线程安全。每一个Segment其实是一个类似于HashMap的哈希表,用来存储key-value。看下ConcurrentHashMap结构图: ConcurrentHashMap维护了一个Segment数组segments,每个Segment是一个哈希表。当线程需要访问segments[1]处的哈希表,首先需要获取该段的锁,然后才能访问该段的哈希表。上图中segments数组大小为8,因此并发度为8,最多支持8个线程在不同的段同时访问。 2. HashEntry HashEntry代表了哈希表的一个key-value项,它是ConcurrentHashMap的一个内部静态类

Java20List和Set接口2

房东的猫 提交于 2019-11-28 22:16:11
Set接口 我们之前说的list接口是 对于数据怎么存然后怎么取,数据中课一存入重复值,有数组下标,而set接口则是 没有数组下标 不可以存重复值 并且怎么存的不一定怎么取 这里数组是通过equals方法来判断是否存在重复数值的他将会用 hashCode()与 equals()方法。 hashCode()就是对数组中的内容进行判断 并且按照一定的方式计算出一个值来通过equals方法跟其他值进行比较 想hashSet中村元素时 add方法先调用hachcode方法计算哈希值 如果容器中没有相同的哈希值直接吧该元素存入集合 如果有相同的哈希值 则调equals方法 判断内容 一样就丢弃 不一样才存入集合 set接口中的HashSet子类就是通过这种方式进行存储元素的 所以当我们创建实体类是 如果要用到次方法 就必须要重写equals方法和hashcode方法 再就是ASCII码表 记住常用的几个 然后推导就行 48--0 65--A   97--a 来源: https://www.cnblogs.com/axu-xxx/p/11429609.html

redis cluster

社会主义新天地 提交于 2019-11-28 19:49:44
一、Redis Cluster(Redis集群)简介 redis是一个开源的key value存储系统,受到了广大互联网公司的青睐。redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群,我这里用的是redis3.0.0版本; redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点; redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制),每个节点都是一个redis实例; 为了实现集群的高可用,即判断节点是否健康(能否正常使用),redis-cluster有这么一个投票容错机制:如果集群中超过半数的节点投票认为某个节点挂了,那么这个节点就挂了(fail)。这是判断节点是否挂了的方法; 那么如何判断集群是否挂了呢? -> 如果集群中任意一个节点挂了,而且该节点没有从节点(备份节点),那么这个集群就挂了。这是判断集群是否挂了的方法; 那么为什么任意一个节点挂了(没有从节点)这个集群就挂了呢? -> 因为集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些slot均等的分配给了各个节点。当需要在Redis集群存放一个数据(key-value)时

HashMap和Hashtable的详细区别

淺唱寂寞╮ 提交于 2019-11-28 18:10:43
HashMap和Hashtable的详细区别 一、简述: 1.安全性 Hashtable是线程安全,HashMap是非线程安全。 HashMap的性能会高于Hashtable,我们平时使用时若无特殊需求建议使用HashMap,在多线程环境下若使用HashMap需要使用 Collections.synchronizedMap() 方法来获取一个线程安全的集合( Collections.synchronizedMap() 实现原理是Collections定义了一个 SynchronizedMap 的内部类,这个类实现了Map接口,在调用方法时使 用synchronized 来保证线程同步 2.是否可以使用null作为key HashMap可以使用null作为key,不过建议还是尽量避免这样使用。HashMap以null作为key时,总是存储在table数组的第一个节点上。而Hashtable则不允许null作为key 3.继承了什么,实现了什么 HashMap继承了AbstractMap,HashTable继承Dictionary抽象类,两者均实现Map接口 4.默认容量及如何扩容 HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。 HashMap扩容时是当前容量翻倍即: capacity * 2 ,Hashtable扩容时是容量翻倍

redis的数据结构与对象

倾然丶 夕夏残阳落幕 提交于 2019-11-28 17:57:24
  地方简单动态字符串   redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组),而是自己构建了一种名为简单动态字符串(simple dynamic string sds)的抽象类型,并将sds作为redis的默认字符串表示。    在redis中,c字符串只会作为字符串字面量用在一些无须对字符串值进行修改的地方 。比如打印日志:   redisLog(REDIS_WRNING,"redis is now ready to exit,bye bye");    如果redis需要的是一个可以被修改的字符串,那么就会使用sds来表示字符串的值 ,比如,如果在客户端执行命令,msg 和 hello word都将会用sds来表示。   redis> set msg "hello word"   OK   除了用来保存数据库中的字符串值之外,sds还被用作缓冲区:AOF模块中的AOF缓冲区。    1.sds定义   每个sds.h/sdshdr结构表示一个sds值:      sds遵循了c字符串以空字符结尾的惯例,保存空字符的1字节空间不计算到len属性中。为空字符串分配额外的1字节空间,以及将空字符串添加到字符数组的末尾都是由sds函数自动完成的,所以空字符串对于sds的使用者来说是完全透明的。 遵循了c字符串以空字符结尾的惯例的好处是

hashCode与equals

微笑、不失礼 提交于 2019-11-28 16:21:59
hashCode与equals hashCode(): 作用是获取哈希码,也称散列码,实际上是返回一个int整数.此哈希码是确定对象在哈希表中的索引位置 利用索引位置找出键值对 相关规定: 1.如果两个对象相等hashcode也一定相同 2.如果两个对象相等,对两个对象分别调用equals方法都返回true 3.两个对象hashcode相同但本身不一定相等 4.equals()方法被覆盖过,则hashcode方法也必须被覆盖 来源: https://blog.csdn.net/qq_30039097/article/details/100086003

哈希(散列)详解

半城伤御伤魂 提交于 2019-11-28 16:08:35
散列表(也叫哈希表),是根据关键字值而直接进行访问的数据结构。 通过把关键字值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 散列函数的构造方法: (1)直接定址法 (2)除留余数法 (3)平方取中法 (4)折叠法 (5)数值分析法 本文采用除留余数法构造散列函数。 H(K) = (H(k) + i) % m; 其中i = 1, 2, …, m为哈希表大小。 构造散列函数的目的是减少冲突,但要完全避免冲突是不可能的,只能尽可能减少冲突。 处理冲突的方法: (1)开放定址法 (2)二次探测法 (3)链地址法(拉链法) 开放地址法: 线性探查法:H(K) = (H(k) + i) %d 每次+1,一次循环查找。缺点:容易造成聚集现象 平法探查法:H(K) = (H(k) + ) %d 每次加 ,避免了线性探查的聚集现象,缺点:不能探查到散列表的所有单元,但知道可以探查到散列表的一半单元。 根据原始数组建立一个哈希表,哈希表也为一个数组,且要求哈希表有固定大小。 本文采用 开放定址法处理冲突 ,线性探查法。 当由H(k)算出的位置不为空时,则通过已经构造的散列函数来寻找新的空位置。 从H(k)开始往后逐个搜索空位置,如果后面没有空位置,则从头开始搜索,直到搜索到空位置,或者回到H(k)停止搜索。(回到H(k)则说明搜索失败) 举例