c – std :: unordered_map如何存储和比较其键以实现快速访问元素而无需排序?
作者:互联网
据我所知,std :: unordered_map用于快速访问元素.这通过存储和比较密钥散列而不是密钥本身来实现.此外,无序意味着其中的元素未排序.但是快速访问元素要求项目已经排序,以便能够使用二分查找来查找所请求的项目.
>这是否意味着unordered_map中的项目是根据它们进行排序的
哈希键和导致unordered_map的唯一原因
比映射到访问元素更快的是比较哈希值
通常比比较关键值快得多?
>如果是这样,在unordered_map和map之间进行选择取决于类型
键.我对吗?
>最后一个问题是为什么unordered_map没有得到比较
模板参数就像地图一样? unordered_map如何?
仅仅通过相同的运算符来比较关键哈希值?
template <class Key,
class T,
class Compare = less<Key>,
class Alloc = allocator<pair<const Key,T> >
> class map;
template <class Key,
class T,
class Hash = hash<Key>,
class Pred = equal_to<Key>,
class Alloc = allocator< pair<const Key,T> >
> class unordered_map;
解决方法:
快速元素访问确实需要某种形式的排序. Unordered_map以这种方式调用,因为排序可能对人类没有意义,并且在添加或删除元素时可能不会保持稳定.
unordered_map并不比map快,因为比较哈希一对一比一对一比较任意对象要快.它更快,因为它根本不需要比较.这就是为什么它不需要比较模板参数.
典型的unordered_map实现是哈希表.哈希表主要是一个常规的键值对数组,它使用一个聪明的技巧来帮助您快速找到您正在寻找的元素.
理想的散列函数是均匀分布的:如果你要随机从任何对象中选择一个散列,那么某个整数N的散列%N的值应该大致是一致的(假装一秒不存在modulo bias).如果选择N作为键值对数组的大小,则可以使用hash(key)%size作为数组索引进行快速查找.
由于散列值应该是均匀分布的,因此不同的对象通常会有不同的索引,所以通过这样做,事情通常对你有利.但是,对于两个对象,散列(键)%N仍然是相同的.在这种情况下,哈希表需要处理冲突:有多种策略,但所有这些策略通常都会转移到位于同一哈希桶中的密钥内的线性搜索(因此,哈希表需要包含关键,不仅仅是密钥的哈希).这就是为什么哈希表的最坏情况访问时间是O(n),并且它突出了具有良好哈希函数的重要性.
在某些情况下,这可能是优先映射到unordered_map的原因,因为map(O(log n))的访问性能是非常可预测的.
此外,随着哈希表中占用的桶数增加,冲突的可能性也增加.通常,由于这个原因,哈希表将具有比元素更多的桶,这意味着它“浪费”空间以提高效率.
标签:unordered-map,c,dictionary,hash 来源: https://codeday.me/bug/20190823/1697512.html