哈希表

java Map

一曲冷凌霜 提交于 2020-04-07 19:58:03
Map集合:该集合存储键值对。一对一对往里存,而且要保证键的唯一性。 添加 V put(K key, V value); 存在覆盖(相同键),返回上一次value(被覆盖的值) void putAll(Map<? extends K,? extends V> m) 删除 void clear(); V remove(Object key) 判断 boolean containsKey(Object key); boolean containsValue(Object value); boolean isEmpty(); 获取 V get(Object key); int size(); Collection<V> values(); Set<Map.Entry<K,V>> entrySet(); Set<K> keySet(); Hashtable、HashMap、TreeMap Hashtable: 底层是哈希表数据结构,不可以存入null键null值。线程同步。 此类实现一个哈希表,该哈希表将键映射到相应的值。任何非null对象都可以用作键或值。用作键的对象必须实现hashCode()和equals()。 HashMap: 底层是哈希表数据结构,允许使用null键和null值。线程不同步。 TreeMap: 底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。

【总结—.Net Framework集合类】

≡放荡痞女 提交于 2020-04-07 10:01:51
写在前面: 最近在学习 .Net 的集合框架,看了许多博文,也看了书,总感觉不是很明白。心里疑惑很多,每天郁闷度日。如果学技术时感到很痛苦,有两种可能,其一是学习方法不对;其二是真的不适合。希望大多数搞技术的朋友都不属于后者。方法不对,那得找解决方法呀,于是乎网上一顿狂搜,也没发现有价值的文章。同样地,我搜索了一下 Java 的集合类,文章一堆,图片更少满天飞。而 .Net 连一张像样的说明图片都没有,觉得微软的技术总是藏着掖着,放佛怕人知道似的。不知道各位有没有这样的想法 !? 不过话又说回来,这样也好,越是不想让我知道,我就越想知道,自己总结出来的东西才记忆深刻! 上面这幅图是 Java 的。 下面就把这几天的学习成果总结一下,与朋友们共享,有纰漏的地方还望指点! 集合,表示可以通过遍历每个元素来访问的一组对象 ( 特别是可使用 foreach 循环访问 ) 。一个集合包括多个元素,即有一个集合类对象和 N 个元素对象。 因为任何集合类都实现了 IEnumerable 接口,所以任何集合类对象都有一个 GetEnumerator() 方法,该方法可以返回一个实现了 IEnumerator 接口的对象,这个返回的 IEnumerator 对象既不是集合类对象,也不是集合的元素类对象,它是一个独立的类对象。通过这个对象,可以遍历访问集合类对象中的每一个元素对象

使用虚拟节点改进的一致性哈希算法

大憨熊 提交于 2020-04-06 23:50:01
##分布式存储中的应用 在分布式存储系统中,将数据分布至多个节点的方式之一是使用哈希算法。假设初始节点数为 N,则传统的对 N 取模的映射方式存在一个问题在于:当节点增删,即 N 值变化时,整个 哈希表 (Hash Table)需要重新映射,这便意味着大部分数据需要在节点之间移动。 因此现在普遍使用的是被称为 一致性哈希 (Consistent Hashing)的一类算法。“一致性” 这个定语的意义在于:当增删节点时,只影响到与变动节点相邻的一个或两个节点,散列表的其他部分与原来保持 一致 。某种程度上可以将其理解为:一致性哈希算法的哈希函数与节点数 N 无关。 其他地方对一致性哈希配图的时候,都会选择一个圆环来解释,但我个人感觉哈希表更加直观: 上图左右分别表示增加一个 “节点 5” 前后的哈希表,哈希函数使用的是 md5 。md5 会根据 key 的值摘要出一个 128 bit 的哈希值(校验和),一般表示为一个 32 位的 16 进制数。这里我们取哈希值第一位的范围来将 key 映射到不同的节点,可以看到在拆分了 “节点 4” 的 md5 首位范围后,只需要将 “节点 4” 原本数据的约一半移动到 “节点 5” 上去就可以了,其他三个节点并未受到影响。 <br /> ##负载均衡改进 但这里其实仍有改进的空间。 问题在于,上面需要将 “节点 4” 的一半数据搬运到 “节点 5

Python从零实现区块链仿真【含源码】

我与影子孤独终老i 提交于 2020-04-06 18:19:06
在区块链或数字货币领域,Python并不是主流的开发语言。但是如果你的目的是研究区块链技术的原理,或者需要在自己的笔记本上仿真一个区块链网络并进行一些研究性的实验,比如完成自己的毕业设计项目或科研课题,那么Python就是合适的。在这个教程里,我们将学习如何使用Python从零开发一个多节点的区块链网络,并基于这个仿真区块链网络,开发一个去中心化的数据分享应用。 相关教程链接: 区块链毕业论文 | 以太坊 | 比特币 | EOS | Tendermint | Hyperledger Fabric | Omni/USDT | Ripple 本教程中的完整源代码可以在这里下载: https://github.com/ezpod/python-blockchain-sim 1、Python仿真区块链:用区块分批保存交易 我们首先要把数据以JSON格式存入区块链。JSON是一种常用的跨语言的数据交换格式,例如一篇博客的JSON表示看起来就像这样: { "author": "some_author_name", "content": "Some thoughts that author wants to share", "timestamp": "The time at which the content was created" } 在区块链领域,我们经常使用 交易 来代替上面说到的数据

equals()和hashcode()相关问题

谁说我不能喝 提交于 2020-04-06 08:03:35
第1部分 equals() 的作用 equals() 的作用是 用来判断两个对象是否相等 。 equals() 定义在JDK的Object.java中。通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否相等。源码如下 public boolean equals(Object obj) { return (this == obj); } View Code 既然Object.java中定义了equals()方法,这就意味着所有的Java类都实现了equals()方法,所有的类都可以通过equals()去比较两个对象是否相等。 但是,我们已经说过,使用默认的“ equals() ”方法,等价于“ == ”方法。因此,我们通常会重写equals()方法:若两个对象的内容相等,则equals()方法返回true;否则,返回fasle。 下面根据“ 类是否覆盖equals()方法 ”,将它分为2类。 (01) 若某个类没有覆盖equals()方法,当它的通过equals()比较两个对象时,实际上是比较两个对象是不是同一个对象。这时,等价于通过“==”去比较这两个对象。 (02) 我们可以覆盖类的equals()方法,来让equals()通过其它方式比较两个对象是否相等。通常的做法是: 若两个对象的内容相等,则equals()方法返回true;否则,返回fasle。

哈希、哈希表详解及应用

本小妞迷上赌 提交于 2020-04-06 07:02:42
前置概念 Key : 我们提供的一个要进行哈希的数字 \(f(x)\) :即为哈希函数,将key扔到这个函数里面,可以得到Value,最核心的构造哈希表的东西 Hash地址:hash出来的值在哈希表中的存储位置 进入正题 字符串hash 例题1:【模板】KMP 现有T组数据,每次给定两个字符串 \(s1\text{和}s2\) ,求 \(s1\text{在}s2\) 中出现了几次。 首先考虑的当然是KMP了(逃 但是由于我们讲的是字符串hash,那就考虑怎么用字符串hash求解; 考虑每次枚举每一个子串的hash值,但是复杂度..... \(O(nm)\) 所以介绍一个优化技巧:滚动hash 滚动hash 滚动hash的诞生就是为了避免在 \(O(m)\) 的时间复杂度内计算一个长度为m的字符串的hash值: 我们选取两个合适的互质常数(虽然不知道为什么互质)b和h,对于字符串c,我们搞一个hash函数: \(hash(c)=(c_1b^{m-1}+c_2b^{m-2}+.....+c_mb^0)mod h\) 这个hash函数的构造过程是以递推实现的,设 \(hash(c,k)\) 为前k个字符构成的子串的hash值,有 \(hash(c,k)=hash(c,k-1)\times b+c_{k}\) 为方便理解,设 \(c="ABCD"\) 且 \(A=1,B=2....\) 则

字符串哈希

会有一股神秘感。 提交于 2020-04-06 06:00:53
转 http://acm.uestc.edu.cn/#/problem/show/1092 韩爷的梦 Time Limit: 200/100MS (Java/Others) Memory Limit: 1300/1300KB (Java/Others) Submit Status 一天,韩爷去百度面试,面试官给了他这么一个问题。 给你2万个字符串,每个字符串长度都是100,然后把2万个字符串丢入一个 set< string >g 中,问最终set里含有多少个元素? g 是一个用来存储字符串、具有去重功能的容器,即相同字符串在 g 中只能保留一个。 两个字符串相等,当且仅当,长度一样且对应位置的字符都一样。 韩爷前晚没睡好,随手写了一个程序交给面试官,然后就gg了。 #include<iostream> #include<string> #include<set> using namespace std; string s; set<string>g; int main(){ for(int k=1;k<=20000;k++){ cin>>s; g.insert(s); } cout<<g.size()<<endl; return 0; } 韩爷醒来之后,发现这只是一个梦(还好只是个梦)。他回忆起梦中的面试官给他的内存限制和时间限制非常低,这么做肯定过不了,那么,现在你不在梦中

redis 常用命令总结

雨燕双飞 提交于 2020-04-05 19:23:15
转载—— 第一部分 redis的常用指令 一、针对key的操作 1.1 del key [key .. ] , 删除指定的一个或者多个key; 1.2 dump key , 序列化给定的key 1.3 restore key ttl serialized-value , 反序列化到key 1.4 exists key , 判断某一key是否存在 1.5 expire key seconds , 设置key的过期时间 ① set命令可以覆盖过期时间;不改变key的操作不会影响key的生存时间 ② rename也不会改变key的过期时间 ③ persist命令可以删除key的过期时间,即永久 ④ ttl可以查看redis中key的过期时间 1.6 expireat key timestamp , 设置key的生存时间 1.7 keys pattern , 查找所有符合给定模式pattern的key ① *, ?, [m,n] 1.8 move key db , 将当前数据库中的key移动数据库 db中。使用select db可以切换数据库 1.9 persist key , 移除给定 key 的生存时间 1.10 pexpire,pexpireat , 设置key的过期、生存时间,单位毫秒 1.11 ttl,pttl , key的剩余过期时间,单位秒,单位是毫秒 1.12

区块链学习(6)区块链

拟墨画扇 提交于 2020-04-03 21:49:34
写了几篇区块链的学习笔记,今天来写写比特币中的区块链。比特币中区块链是由包含交易信息的区块从后向前有序链接起来的数据结构。每个区块从后向前有序地链接在这个链条里,每个区块都指向前一个区块。 区块结构 区块是一种数据结构,存放了多组交易,并且块与块之间相互连接,每个块都指向前一个区块。为了提高性能,一组交易确认打包成块,下面就是区块的结构 区块头中由版本,父区块哈希值,Merkle根,时间戳,难度目标,Nonce。Nonce、难度目标和时间戳会用于挖矿过程。 每个区块通过SHA256算法对区块头进行二次哈希计算而得到一个哈希值叫做区块哈希值,不过只有区块头进行了哈希计算。区块哈希值可以唯一的表示一个区块。还可以用区块高度表示区块,第一个区块高度为0,第二个区块为1,之后的区块依次增加。但区块高度并不能唯一的表示一个区块,若区块链出现分叉就有可能出现两个区块的高度相同。而一个区块中的区块头内储存着它上一个区块的哈希值的引用,而上一个区块的区块头内又有再上一个的区块的哈希值的引用。这样就将各区块组成了区块链。 该区块中的所有交易都是用Merkle树表示的,在区块头中就储存了Merkle树的根。关于Merkle树这个博客讲的是相当详细https://blog.csdn.net/wo541075754/article/details/54632929 有兴趣的可以去看看。 Merkle树

Golang 实现 Redis(3): 实现内存数据库

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-29 07:36:18
本文是 golang 实现 redis 系列的第三篇, 主要介绍如何实现内存KV数据库。本文完整源代码在作者Github: HDT3213/godis db.go 是内存数据库的主要源文件,db.Exec 方法会从协议解析器中获得命令参数并调用相应的处理函数进行处理。 目录: Concurrent Hash Map LockMap TTL Concurrent Hash Map KV 内存数据库的核心是并发安全的哈希表,常见的设计有几种: sync.map: golang 官方提供的并发哈希表, 性能优秀但结构复杂不便于扩展 juc.ConcurrentHashMap: java 的并发哈希表采用分段锁实现。在进行扩容时访问哈希表线程都将协助进行 rehash 操作,在 rehash 结束前所有的读写操作都会阻塞。因为缓存数据库中键值对数量巨大且对读写操作响应时间要求较高,使用juc的策略是不合适的。 memcached hashtable: 在后台线程进行 rehash 操作时,主线程会判断要访问的哈希槽是否已被 rehash 从而决定操作 old_hashtable 还是操作 primary_hashtable。 这种策略使主线程和rehash线程之间的竞争限制在哈希槽内,最小化rehash操作对读写操作的影响,这是最理想的实现方式。但由于作者才疏学浅无法使用 golang