哈希表

collection(list,set,map)、HashMap

断了今生、忘了曾经 提交于 2020-02-18 02:53:39
collection里面有什么子类?(list和set是实现了collection接口的。)   List: 1.可以允许重复的对象(可重复,有序集合)。 2.可以插入多个null元素。 3.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。 ———————————————— Set: 1.不允许重复对象(不可重复,无序集合)。 2 只允许一个 null 元素 3.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序集合。而且可以重复。 ———————————————— Map: 1.Map不是collection的子接口或者实现类。Map是一个接口。 2.不允许重复元素。 3. Map 里你可以拥有随意个 null 值但只能有一个 null (key)键。 4. Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable

八数码的 八种境界

末鹿安然 提交于 2020-02-17 11:52:35
境界一、 暴力广搜+STL   开始的时候,自然考虑用最直观的广搜,因为状态最多不超过40万,计算机还是可以接受的,由于广搜需要记录状态,并且需要判重,所以可以每次图的状态转换为一个字符串,然后存储在stl中的容器set中,通过set的特殊功能进行判重,由于set的内部实现是红黑树,每次插入或者查找的复杂度为Log(n),所以,如果整个算法遍历了所有状态,所需要的复杂度为n*Log(n),在百万左右,可以被计算机接受,由于对string操作比较费时,加上stl全面性导致 速度不够快,所以计算比较费时,这样的代码只能保证在10秒内解决任何问题。但,明显效率不够高。POJ上要求是1秒,无法通过,第一次的代码见Code1.cpp。   境界二、广搜+哈希   考虑到费时主要在STL,对于大规模的遍历,用到了ST的set和string,在效率上的损失是很大的,因此,现在面临一个严重的问题,必须自己判重,为了效率,自然是自己做hash。有点麻烦,hash函数不好想,实际上是9!种排列,需要每种排列对应一个数字。网上搜索,得知了排列和数字的对应关系。取n!为基数,状态第n位的逆序值为哈希值第n位数。对于空格,取其为9,再乘以8!。例 如,1 3 7 24 6 9 5 8 的哈希值等于:0*0! + 2*1! + 0*2! + 1*3! + 3*4! +1*5! + 0*6! + 1*7! +

浅析分布式系统中的一致性哈希算法

点点圈 提交于 2020-02-17 08:59:42
分布式系统与高并发高可用 浅析分布式系统中的一致性哈希算法 通过本文将了解到以下内容: 分布式系统的简单概念和基本作用 分布式系统常用负载均衡策略 普通哈希取模策略优缺点 一致性哈希算法的定义和思想 一致性哈希的基本过程 Redis集群中一致性哈希的实现 1.分布式系统的基本概念 分布式系统与高并发高可用 当今高并发和海量数据处理等场景越来越多,实现服务应用的高可用、易扩展、短延时等成为必然。 在此情况下分布式系统应运而生,互联网的场景无外乎存储和计算,因此分布式系统可以简单地分为: 分布式存储 分布式计算 所谓分布式系统就是一批计算机组合起来共同对外提供服务,对于用户来说具体有多少规模的计算机完成了这次请求,完全是无感知的。分布式系统中的计算机越多,意味着计算和存储资源等也就越多,能够处理的并发访问量也就越大,响应速度也越快。 如图为简单整体架构图: 大前端 主要实现了服务应用对应的所有流量的接入,比如xyz域名下可能有N个子服务,这一层涉及很多网络流量的处理,也很有挑战,像百度的BFE(百度统一前端)接入了百度的大部分流量,每日转发1万亿次,峰值QPS1000w。 中间层 完成了各个服务的调度和分发,粒度相比大前端接入层更细致一些,这一层实现了用户的无感知体验,可以简单理解为反向代理层。 业务层 完成了数据存储、数据计算、数据缓存等,各个业务环节高度解耦,并且基于集群化来实现。

Python解决两数之和问题

北战南征 提交于 2020-02-17 03:38:30
作为一个新手小白,我将开始一场用python征服力扣题库的旅程。 下面是力扣题库的第一题 题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 方法一:暴力法。 暴力法很简单,遍历每个元素 x,并查找是否存在一个值与 target - x 相等的目标元素。 复杂度分析: 时间复杂度:O(n^2) 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n) 的时间。因此时间复杂度为 O(n^2)。空间复杂度:O(1)。 #暴力遍历法 def twoSum ( nums , target ) : result = [ ] for i , value in enumerate ( nums ) : diff = target - value # 得到差值(即:在余下的元素中找到该diff值即可) j = i + 1 # 因为不能重复利用同个元素, 所以把'位置索引j'加上1 if diff in nums [ i + 1 : ] : j

Java_Map集合接口

♀尐吖头ヾ 提交于 2020-02-16 10:02:31
现实生活中,我们经常需要成对存储某些信息。比如,我们使用的微信,一个手机号只能对应一个微信账户。这就是一种成对存储的关系。 Map就是用来存储“键(key)-值(value) 对”的。 Map类中存储的“键值对”通过键来标识,所以“键对象”不能重复。 Map 接口的实现类有HashMap、TreeMap、HashTable、Properties等。 Map接口中常用的方法: HashMap采用哈希算法实现,是Map接口最常用的实现类。 由于底层采用了哈希表存储数据,我们要求键不能重复,如果发生重复,新的键值对会替换旧的键值对。 HashMap在查找、删除、修改方面都有非常高的效率。 Map接口中的常用方法 : import java.util.HashMap; import java.util.Map; public class TestMap { public static void main(String[] args) { Map<Integer, String> m1 = new HashMap<Integer, String>(); Map<Integer, String> m2 = new HashMap<Integer, String>(); m1.put(1, "张三"); m1.put(2, "李四"); m1.put(3, "王五"); m2.put(1, "一

哈希表概念及方法

天大地大妈咪最大 提交于 2020-02-16 01:24:38
哈希表 概念 :散列表,也叫哈希表,是根据关键码值(key value)而直接进行访问的数据结构,也就是表示它通过关键码值映射到表中的一个位置来访问记录,加快查找的速度,这个函数也叫散列函数,存放数值的表叫做散列表,也叫哈希表。 (1)若一个数值的关键字为k,则它的值存放在F(k)的存储位置上,不需要比较可直接取得所查数据。 (2)对于不同的数值k1,k2,若它们的散列位置相同,即k1 != k2,F(k1) == F(k2),这种现象称之为哈希冲突, 散列函数常用方法: (1)直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。若其中H(key)中已经有值了,就往下一个找,直到H(key)中没有值了,就放进去。 (2)数字分析法:数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址。 (3)平方取中法:当无法确定关键字中哪几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。 (4)折叠法:将关键字分割成位数相同的几部分,最后一部分位数可以不同,然后取这几部分的叠加和(去除进位)作为散列地址。数位叠加可以有移位叠加和间界叠加两种方法。移位叠加是将分割后的每一部分的最低位对齐,然后相加

hashTable

£可爱£侵袭症+ 提交于 2020-02-14 23:13:49
六、hashTable 散列表(Hash Table),也叫哈希表,是根据关键码值(Key Value)而直接进行访问的数据结构。也就是说,它通过关键码值映射到表中的一个位置来访问记录,这样我们就可以通过查找关键码值而不需要比较就可获得需要的记录的存储位置。 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key) 存储位置=f(关键字) f为散列函数,又称哈希(hash)函数。 采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表或哈希表(Hash Table) 哈希表是由 数组+链表组成 根据关键字查找时,使用hash函数确定存储位置(数组中一个下标),确定下标后,遍历链表找到要索引的结果。数组中存储的是从链表的头结点。 来源: CSDN 作者: Simeon郎 链接: https://blog.csdn.net/dreame_life/article/details/104318039

北京大学肖臻老师《区块链技术与应用》公开课笔记3

拈花ヽ惹草 提交于 2020-02-14 19:06:38
北京大学肖臻老师《区块链技术与应用》公开课笔记 比特币数据结构篇,对应肖老师视频:https://www.bilibili.com/video/av37065233?p=3 全系列笔记请见:https://blog.csdn.net/Mu_Xiaoye/article/details/104299664 Hash pointer(哈希指针) 指针 在程序运行过程中,需要用到数据。最简单的是直接获取数据,但当数据本身较大,需要占用较大空间时,明显会造成一定麻烦。因此,可以引入 指针 这一概念。当需要获取数据时,只需要按照指针所给的地址,去对应的位置读取数据即可,这样大大节省了内存空间。 在实际中,为了便于程序移植性等原因,指针实际上存储的是 逻辑地址 而非物理地址。 区块链结构本身为一条链表,节点为区块。而传统链表实现,便是通过指针将各个节点串联起来而称为最终的链。如下便是我们最常见的一个链表: 但在区块链系统中,并未采用指针,而是使用了 哈希指针 哈希指针 如下图对于该节点,我们可以看到有两个指针指向这个节点(实际上为一个),其中P为该节点的地址,H()为该节点的哈希值,该值与节点中内容有关。当节点(区块)中内容发生改变,该哈希值也会发生改变,从而保证了区块内容不能被篡改。 在比特币中,其最基本的数据结构便是一个个区块形成的区块链。 区块链与链表区别1:哈希指针代替普通指针

链表【基础算法题】

Deadly 提交于 2020-02-12 12:50:39
题目一 代码实现 1 package class_03; 2 3 public class Code_07_ReverseList { 4 5 public static class Node { 6 public int value; 7 public Node next; 8 9 public Node(int data) { 10 this.value = data; 11 } 12 } 13 14 public static Node reverseList(Node head) { 15 Node pre = null; 16 Node next = null; 17 while (head != null) { 18 next = head.next; 19 head.next = pre; 20 pre = head; 21 head = next; 22 } 23 return pre; 24 } 25 26 public static class DoubleNode { 27 public int value; 28 public DoubleNode last; 29 public DoubleNode next; 30 31 public DoubleNode(int data) { 32 this.value = data; 33 } 34 } 35 36

MySQL索引

柔情痞子 提交于 2020-02-12 06:35:31
1.B树与B+树的区别? 1. B+树改进了B树, 让内结点只作索引使用, 去掉了其中指向data record的指针, 使得每个结点中能够存放更多的key, 树的层高能进一步被压缩, 使得检索的时间更短. 2. 由于底部的叶子结点是链表形式, 因此也可以实现更方便的顺序遍历 2.MySQL中HASH索引和B+树索引的区别? B+索引: B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接 在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。 哈希索引: 哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。 两者的区别: 1. 如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提 是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据 2. 从示意图中也能看到,如果是范围查询检索,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算 法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索 3. 同理