unordered_map

Java与C ++中的哈希

余生颓废 提交于 2020-03-07 20:06:59
Java和C ++在语法上有些相似,但是随着时间的流逝而发生了变化。Java受到C ++的宽松启发,但最初并未采用C ++的模板结构,也不需要C ++的头文件/内容文件分离,并且当然,它使用JVM并编译为字节码而不是机器码。 从那时起,这两种语言在某种程度上融合了起来-它们遵循相似的编码准则,支持Lamda构造,泛型/模板,循环语法的多个相同形式,等等。但是,现代用途肯定存在差异。C ++模板支持专业化,而Java泛型支持类型限制。它们也具有相似的基本集合类型。 哈希表,哈希图和类似类型的数据结构,这些数据结构允许通过唯一键进行索引,但是该索引是以非常特定的方式实现的。现在,任何关联的容器类型都可以让你通过特定键访问数据。例如,你可以使用链表作为存储结构,也可以使用双链表或二叉树。哈希表本质上使用数组,但是该数组由哈希值索引。 Java 具有作为类的基本关联容器类型 java.util.HashMap 。 C ++ 有 std::unordered_map 。 基于哈希的容器在数据存储方面具有明显的优势。当使用具有低冲突可能性的哈希生成器时,两个容器( HashMap 和 unordered_map )都具有 O ( 1 )查找性能。碰撞的可能性越大,容器的性能就越接近 O ( n ),其中 n 是存储在容器中的元素数。这两个容器也都使用标准的哈希函数 -Java 需要键来实现

HashMap O(1) 复杂度的分析

六月ゝ 毕业季﹏ 提交于 2020-03-02 11:38:27
**C++**在使用STL时,经常混淆的几个数据结构, map,hash Map,unordered_map 事实上,三个容器,有着比较大的区别. Map 内部数据的组织,基于红黑树实现,红黑树具有自动排序的功能,因此map内部所有的数据,在任何时候,都是有序的。 所以复杂度为 O(LogN) Hash map 基于哈希表,数据插入和查找的时间复杂度很低,几乎是常数时间,而代价是消耗比较多的内存。底层实现上,使用一个下标范围比较大的数组来存储元素,形成很多的桶,利用hash函数对key进行映射到不同区域(桶)进行保存。 插入 得到key, 通过hash函数得到hash值 根据hash值 找到对应的桶号(区域), hash值对(桶数)求模 存放key和value 在对应桶内 取值 分四步: 判断key,根据key算出索引。 根据索引获得索引位置所对应的键值对链表。 遍历键值对链表(当每个桶内只有一个元素时,查找时只进行一次比较),根据key找到对应的Entry键值对。 拿到value。 分析: 以上四步要保证HashMap的时间复杂度O(1),需要保证每一步都是O(1),现在看起来就第三步对链表的循环的时间复杂度影响最大,链表查找的时间复杂度为O(n),与链表长度有关。我们要保证那个链表长度为1,才可以说时间复杂度能满足O(1)。但这么说来只有那个hash算法尽量减少冲突

unordered_map的模拟实现

爷,独闯天下 提交于 2020-02-15 00:42:34
unordered_map的模拟实现 template < class K , class V , class HF = DefHashF < K >> class unordered_map { typedef pair < K , V > ValueType ; typedef HashBucket < K , ValueType , KeyOfValue , HF > HT ; struct KeyOfValue { const K & operator ( ) ( const ValueType & data ) { return data . first ; } } ; public : typename typedef HT :: Iterator iterator ; public : unordered_map ( ) : _ht ( ) { } iterator begin ( ) { return _ht . Begin ( ) ; } iterator end ( ) { return _ht . End ( ) ; } size_t size ( ) const { return _ht . Size ( ) ; } bool empty ( ) const { return _ht . Empty ( ) ; } V & operator [ ] (

牛客 B.The flower(unordered_map、set)

久未见 提交于 2020-01-21 03:16:06
题目链接: 点击这里 C++11中有新出4个关联式容器:unordered_map/unordered_multimap、unordered_set/unordered_multiset。这4个关联式容器与map/multimap、set/multiset功能基本类似,最主要就是底层结构不同,使用场景不同。 我们知道map和set实现的是 O(logn) 进行一个映射,其中内置的实现是红黑树。 多数时候已经非常优秀了,但是往往会有一些题用不到有序的序列(我们知道set内部是有序的),反而需要更快的速度。这个时候可以选择自己打hash,但是对于懒癌晚期患者自然想要以哈希桶为底层实现的 unordered_map & unordered_multiset 实现 O(1) 查询。 所以,如果需要得到一个有序序列,使用红黑树系列的关联式容器,如果需要更高的查询效率,使用以哈希表为底层的关联式容器。 AC代码如下: 如何让Dev C++支持C++11: 点击这里 C++11新特性 auto: 点击这里 # include <bits/stdc++.h> using namespace std ; typedef long long ll ; const int MOD = 10000007 ; const int INF = 0x3f3f3f3f ; const double PI =

C++ vector和unordered_map浅析

有些话、适合烂在心里 提交于 2020-01-05 05:28:29
C++内置的数组支持容器的机制,可是它不支持容器抽象的语义。要解决此问题我们自己实现这种类。在标准C++中,用容器向量(vector)实现。容器向量也是一个类模板。可以说vector的引入,方便了我们对一系列数据的处理,相比于数组,我们不用考虑下标越界等溢出问题了。 使用vecor,需要引入头文件#include <vector>,命名空间需要引入using std::vector,再补充一下,vector是连续存储的!!! 简单的存储操作: vector<int> v1; for (vector<int>::size_type i = 0; i < 10; i++) { v1.push_back(i); } cout << "adjective:"; for (vector<int>::size_type i = 0; i < 10; i++) { cout << v1[i] << setw(4); } 然后比较坑的这个,注意一下就OK了: //v1中有n个值为i的元素 vector<int> v1(n,i); //v2中只有n和i两个元素 vector<int> v2({n,i}); 切记我们初始化的时候不能直接v1[i]=value,只能使用v1.push_back(i); 详细的介绍请看 https://www.cnblogs.com/mengfanrong/p

c++容器之map和unordered_map

余生长醉 提交于 2019-12-02 06:04:49
1、简介 map需要的头文件是#include < map > map是一类关联性容器,它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。 我感觉map比较好用的就是key-value对,其中key和value可以是任意你需要的类型,比如map<int, string> m; 根据key值快速查找记录,查找的复杂度基本是O(logn) 2、unordered_map与map 内部实现机理 map: map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素,因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行这样的操作,故红黑树的效率决定了map的效率。 unordered_map: unordered_map内部实现了一个哈希表,因此其元素的排列顺序是杂乱的,无序的 优缺点以及适用处 map 优点: 有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作 红黑树,内部实现一个红黑书使得map的很多操作在的时间复杂度下就可以实现,因此效率非常的高 缺点: 空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点,孩子节点以及红/黑性质

350--返回两个数组的交叉元素

自古美人都是妖i 提交于 2019-12-01 02:50:42
1、这道题和349不同之处在于,不仅要返回重复数字,还要保证重复数字出现几次返回几次 2、上一题让我接触了set容器,这道题让我接触到了unordered_map容器(要知道map和unordered_map的区别!!!),基于 哈希表 区别再链接里:https://blog.csdn.net/u013130743/article/details/80794177(转载一位csdn的作者的总结) 3、 map容器 和 unordered_map 的基本用法 #include<map>; unordered_map<int,string>map1;//第一个是键值,第二个是键值对应的存储对象(可以是string,可以是int等其他数据类型) map1.insert(pair<int,string>)(1,"zhangsan");//三种数据插入方式 map1.insert(map<int,string>::value_type)(1,"zhangsan"); map1[1]="zhangsan";//此种插入方式可以覆盖,上面两种不行 map1.empty();//判断是否为空 map1.begin();map1.end();//迭代起始位置和结束位置 map1.size();//返回元素个数 map1.count();//返回指定元素出现的次数 map1.[key]; 4、 思路

对于一些stl自定义比较函数

自作多情 提交于 2019-11-30 23:44:09
1.unorderd_map自定义键 自定义类型 struct my_key { int num; string name; }; 1、由于unordered_map是采用哈希实现的,对于系统的类型int, string等,都已经定义好了hash函数,所以如果我们引入新的自定义类型的话,系统并不知道如何去计算我们引入的自定义类型的hash值,所以我们就需要自己定义hash函数,告诉系统用这种方式去计算我们引入的自定义类型的hash值 自定义的hash函数如下: struct myHashFuc { std::size_t operator()(const my_key &key) const { return std::hash<int>()(key.num); } }; 由于我们的结构中有int和string,所以此处直接采用系统的int的哈希做法即可 2、重载==号 除了自定义哈希函数外 系统计算了hash值后,还需要判断是否冲突,对于默认的类型,系统都知道怎样去判断是否相等,但不知道怎样去判断我们引入的自定义类型是否相等,所以需要我们重载==号,告诉系统用这种方式去判断2个键是否相等 struct my_key { int num; string name; my_key(){} ~my_key(){} my_key(int a, string b) : num(a),

Cocos2d-x3.0模版容器详解之二:cocos2d::Map<K,V>

人走茶凉 提交于 2019-11-27 16:45:20
1.概述 版本: v3.0 beta 语言: C++ 定义在 “COCOS2DX_ROOT/cocos/base” 路径下的 " CCMap.h " 的头文件中。 ? 1 2 template < class K, class V> class CC_DLL Map; cocos2d::Map<K,V> 是一个内部使用了 std::unordered_map 的关联容器模版。 std::unordered_map 是一个存储了由key-value键值对组合成构成的关联性容器,允许基于键对单个元素进行快速检索。 在 unordered_map 中,key value 一般用来标识唯一的一个元素,而 mapped value 是一个对象,其内容关联到对于的 key value。 在内部,unordered_map 的元素并不依赖于 key 或者 mapped 值来使用任何的特定方式排序,而是取决于它们的哈希值,以便通过他们的key值快速访问单个元素(使用平均时间复杂度)。 在 Cocos2d-x v3.0 beta 之前,存在另一个顺序性容器 cocos2d::CCDictionary ,这将会被弃用。 我们很细致地设计了 cocos2d::Map<K,V> 容器作为 cocos2d::CCDictionary 的替代品,所以请使用 cocos2d::Map 代替 cocos2d:

C++11 新用法

梦想的初衷 提交于 2019-11-27 05:15:49
C++11 新用法 基于哈希的 map 和 set 简述 基于哈希的 map 和 set ,它们分别叫做 unordered_map , unordered_set 。数据分布越平均,性能相较 map 和 set 来说提升就更大。但由于它们基于哈希,所以并不像 map 和 set 一样能自动排序;它们都是无序的。 我做了一个测试:随机生成 \(10^7\) 个 int 范围内的整数(平均分布),然后将其分别插入 map 和 unordered_map ,再完整的做一次查询,查看时间和内存上的消耗。 测试代码 #include <cstdio> #include <cstdlib> #include <ctime> #include <map> #include <vector> #include <unordered_map> using namespace std; vector<pair<int, int>> data; int main() { freopen("map.txt", "r", stdin); data.resize(5000000); map<int, int> mp; double st, ed; st = clock(); for (int i = 0; i < 5000000; ++i) scanf("%d%d", &data[i].first,