哈希表

HashSet 和 TreeSet的区别

此生再无相见时 提交于 2019-12-02 11:32:24
HashSet 和 TreeSet的区别 HashSet 内部是由哈希表(实际上是一个 HashMap 实例)支持的。它不保证 set 元素的迭代顺序。 TreeSet TreeSet 使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的Comparator 进行排序。 来源: https://blog.csdn.net/weixin_45151960/article/details/102756580

【leetcode/哈希表】四数相加(利用哈希映射降低时间复杂度)

孤者浪人 提交于 2019-12-02 10:56:45
问题描述: 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0 。 为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。 例如: 输入: A = [ 1, 2] B = [-2,-1] C = [-1, 2] D = [ 0, 2] 输出: 2 解释: 两个元组如下: 1. (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0 2. (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0 基本思路: 这道题暴力O(n^4), 绝对不可取。于是 采用二分的技巧 。 遍历前两个列表 ,获得所有两个数的和; 遍历后两个列表 ,获得所有数的两个和; 统计这两个结果集中互为相反数的元素个数 ,即为答案。 这样 我们的复杂度就降为O(n^2) 了。 不过还是TLE了,于是我们想到用哈希表的思想来降低复杂度。 这是因为哈希表 插入和查询一个元素 的平均时间复杂度为O(1); (其它的

ConcurrentSkipListMap/ConcurrentSkipListSet

亡梦爱人 提交于 2019-12-02 08:57:54
转关于ConcurrentSkipListMap 和 ConcurrentSkipListSet 的深度好文, 终于明白了skip List (跳表)的含义 http://www.cnblogs.com/skywang12345/p/3498634.html http://www.cnblogs.com/skywang12345/p/3498556.html ===== ConcurrentSkipListMap介绍 ConcurrentSkipListMap是线程安全的有序的哈希表,适用于高并发的场景。 ConcurrentSkipListMap和 TreeMap ,它们虽然都是有序的哈希表。但是,第一,它们的线程安全机制不同,TreeMap是非线程安全的,而ConcurrentSkipListMap是线程安全的。第二,ConcurrentSkipListMap是通过跳表实现的,而TreeMap是通过红黑树实现的。 关于跳表(Skip List),它是平衡树的一种替代的数据结构,但是和红黑树不相同的是,跳表对于树的平衡的实现是基于一种随机化的算法的,这样也就是说跳表的插入和删除的工作是比较简单的。 ConcurrentSkipListMap原理和数据结构 ConcurrentSkipListMap的数据结构,如下图所示: 说明 : 先以数据 “7,14,21,32,37,71

【哈希表】C++STL内置哈希表

巧了我就是萌 提交于 2019-12-02 08:08:39
hashset和hashmap都是hashtable的一种实现形式。 接下来我要介绍的unordered_set和unordered_map 都是基于hashtable的实现 。 unordered_set实现了 不存储重复的元素 。 unordered_map实现了 key和value的映射 。 下面就让我们一起来了解它吧! 一. set和unordered_set ·对比 set unordered_set 是否有序 有序 无序 实现 BST或RBT Hash Table 插入 log n 平均O(1),最坏O(n) 删除 log n 平均O(1), 最坏O(n) 由此可见, 用hash table实现的,其实是unordered_set而不是set 。所以我们只有使用set才是利用了hash table的特点。 之后的讲解我们都会围绕unordered_set来展开。 ·支持操作 插入(insert),删除(erase), 查找(count) 获得大小(size), 遍历(begin, end) 清空操作(clear, empty) ·其他注意事项 不论是unordered_set还是set, 都是集合的实现形式。都用来存储不重复的元素。 unordered_set的实现形式是 使用数组把一些不同的值储存在同一个桶中 。(想一想y = x % 1000)。 桶足够小的时候

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

别等时光非礼了梦想. 提交于 2019-12-02 06:51:34
哈希表 是唯一一个专用于集合的数据结构。可以以常量的平均时间实现插入,删除和查找 哈希表的时间复杂度是 O(1) 哈希表的思想是 用一个与集合差不多大小的数组来存储这个集合,将数据元素的关键字映射的数组的下标上面,这个映射我们称之为 散列函数 数组称之为 散列表,查找数据的时候,根据被查找的关键字找到存储数据元素的地址,从而获取元素 散列函数的应用带来一个比较复杂的问题:; 因为散列函数的定义域范围比值域大 导致2个或者更多的数据元素可能会被映射到同一个位置 称为 冲突或者碰撞。这种情况是不可避免的。因此 实现哈希表 二个基本的问题是 1如何设计散列函数 2如何解决碰撞问题 来源: https://www.cnblogs.com/burg-xun/p/11735360.html

关于==、equals和hashCode详解

青春壹個敷衍的年華 提交于 2019-12-02 06:32:57
这几天在尝试手撸一个类似Lombok的注解式代码生成工具,用过Lombok的小伙伴知道,Lombok可以通过注解自动帮我们生产equals()和hashCode()方法,因此我也想实现这个功能,但是随着工作的深入,我发现其实自己对于equals()和hashCode()的理解,也处在一个很低级的阶段。 因此痛定思痛,进行了一番深入学习,才敢来写这篇博客。 文章目录 1、equals在Java中含义 2、hashCode在Java中的作用 3、为什么hashCode和equals要一起重写 4、扩展:实现科学的哈希函数 1、equals在Java中含义 首先要解释清楚这个,equals方法在Java中代表逻辑上的相等,什么叫逻辑上的相等?这个就涉及到Java本身的语法特性。 我们知道,Java中存在着==来判断基本数据类型的相等,但是对于对象,==只能判断内存地址是否相等,也就是说是否是同一个对象: int a = 10000; int b = 10000; // 对于基本数据类型, == 可以判断逻辑上的相等 System.out.println(a == b); Integer objA = 10000; Integer objB = 10000; Integer objA1 = objA; // 对于类实例, == 只能判断是否为同一个实例(可以视为内存地址是否相等)

HashMap、HashTable差异详解

风流意气都作罢 提交于 2019-12-02 05:19:22
  HashMap和HashTable有什么不同?在面试和被面试的过程中,我问过也被问过这个问题,也见过了不少回答,今天决定写一写自己心目中的理想答案。 代码版本   JDK每一版本都在改进。本文讨论的HashMap和HashTable基于JDK 10.0.1。 1. 时间   HashTable产生于JDK 1.1,而HashMap产生于JDK 1.2。从时间的维度上来看,HashMap要比HashTable出现得晚一些。 2. 作者   以下是HashTable的作者: /* * 以下代码及注释来自java.util.HashTable * @author Arthur van Hoff * @author Josh Bloch * @author Neal Gafter */   以下是HashMap的作者: /* * 以下代码及注释来自java.util.HashMap * @author Doug Lea * @author Arthur van Hoff * @author Josh Bloch * @author Neal Gafter */   可以看到HashMap的作者多了大神Doug Lea。不了解Doug Lea的,可以看 这里 。 3. 对外的接口(API)   HashMap和HashTable都是基于哈希表来实现键值映射的工具类。讨论他们的不同

Mysql 三大特性详解

£可爱£侵袭症+ 提交于 2019-12-02 05:11:27
Mysql 三大特性详解 Mysql Innodb后台线程 工作方式 首先Mysql进程模型是单进程多线程的。所以我们通过ps查找mysqld进程是只有一个。 体系架构 InnoDB存储引擎的架构如下图所以,是由多个内存块组成的内存池,同时又多个后台线程进行工作,文件是存储磁盘上的数据。 后台线程 上面看到一共有四种后台线程,每种线程都在不停地做自己的工作,他们的分工如下: Master Thread: 是最核心的线程,主要负责将缓冲池中的数据异步刷新的磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲(INSERT BUFFER),UNDO页的回收等。下面几个线程其实是为了分担主线程的压力而在最新的版本中添加的。 IO Thread: InnoDB使用大量的异步IO来处理请求。IO Thread的主要工作就是负责IO请求的回调(call back)处理。异步IO可以分为4个,分别是:write, read, insert buffer 和 log IO thread。 Purge Thread: undo log是用来保证事务的,当一个事务正常提交后,这个undo log可能就不再使用了。purge thread就是用来清除这部分log已经分配的undo页的。 Page Cleaner Thread: 主要是把脏页的刷新从主线程中拿到单独的线程,减轻主线程的压力

C++哈希表头文件

别来无恙 提交于 2019-12-02 03:12:04
#ifndef _HASHTABLE_H_ #define _HASHTABLE_H_ #include <iostream> #include <cstdlib> using namespace std; typedef enum { Empty, Active, Deleted }kindofitem; typedef struct { int key; }datatype; typedef struct{ datatype data; kindofitem info; }hashitem; typedef struct{ hashitem* arr; int table_size; int current_size; }hashtable; int initiate(hashtable* hash, int size);//初始化哈希表 int find(hashtable* hash, datatype x);//查找x元素对应的关键字 int insert(hashtable* hash, datatype x);//像哈希表中插入数组元素x,及设置它对应的关键字 int deleted(hashtable* hash, datatype x);//从哈希表中删除x数据元素 void destroy(hashtable* hash);//撤销函数 /* int main(

01哈希表

五迷三道 提交于 2019-12-02 02:36:38
1. Hash Table ​ 我们都知道,二叉树、红黑树等数据结构,它们的查找都是先从根节点开始查找,从节点取出数据或者索引与查找值进行比较。 ​ 那么,有没有一种函数H,根据这个函数和查找关键字 Key,可以 直接确定查找值所在的位置 ,而不需要一个个比较。这样叫“预先知道” Key 所在的位置,直接找到数据,提升效率。即: 地址index = H(key) 说白了,hash函数功能就是根据 key 计算出应该存储地址的位置,而哈希表是基于哈希函数建立的一种查找表。 2. 哈希函数的构造方法 ​ 根据前人经验,统计出集中常用 hash 函数构造方法 2.1. 直接定制法 ​ 哈希函数为关键字的线性函数,如 H(key) = a * key + b,这种构造方法比较简单,均匀。但是有很大限制,仅限与地址大小 = 关键字集合的情况。 2.2. 数字分析法 ​ 假设关键字集合中的每个关键字 key 都是由s位数字组成(k1,k2,……,kn),分析 key 中的全体数据,并从中提取分布均匀的若干位或他们的组合构成全体。 ​ 使用举例:假设要保存的集合中 key 由 5 位不同的数字构成。并且这些数字分布均匀,我们可以提取其中一位,代表数据保存的地址。H(key) = key % 100000。 ​ 此种方法通常用于数字位数较长的情况,要求数字存在一定的规律,其次必须知道数字的分布情况