C++ c++;具有良好性能的map实现

C++ c++;具有良好性能的map实现,c++,data-structures,C++,Data Structures,我想将一些密钥映射到其他数据结构,其中密钥列表是从internet接收的 std::无序映射是O(1),但最坏情况是O(N) std::map始终为O(日志N) 是否还有另一个具有O(1)最佳情况和O(logn)最坏情况性能的map实现?正如您所指出的,std::unordered_map的最坏情况是线性的,因此,与其要求更好的最坏情况(不存在这样的容器,如果标准不使用它,或者至少提供这样的变体?)让我们来考虑最坏的情况是什么原因,看看我们是否能阻止它。 在这种情况下,std::unordere

我想将一些密钥映射到其他数据结构,其中密钥列表是从internet接收的

std::无序映射是O(1),但最坏情况是O(N)
std::map
始终为O(日志N)


是否还有另一个具有O(1)最佳情况和O(logn)最坏情况性能的map实现?

正如您所指出的,
std::unordered_map
的最坏情况是线性的,因此,与其要求更好的最坏情况(不存在这样的容器,如果标准不使用它,或者至少提供这样的变体?)让我们来考虑最坏的情况是什么原因,看看我们是否能阻止它。 在这种情况下,
std::unordered_map
几乎可以肯定是一个hashmap,因此最坏的情况发生在您将散列插入sme值的每个项目都链接到一个bucket中时(有效地使hashmap成为一个链接列表)


因此,只要你有一个稍微合理的散列函数,最坏的情况就永远不会发生,你将得到一个恒定时间的操作。

正如你所指出的,
std::unordered_map
的最坏情况是线性的,所以不要要求更好的最坏情况(没有这样的容器存在,如果它没有标准使用它,或者至少提供这样的变化?)让我们来考虑什么导致最坏的情况,看看我们是否能阻止它。< /P> 在这种情况下,
std::unordered_map
几乎可以肯定是一个hashmap,因此最坏的情况发生在您将散列插入sme值的每个项目都链接到一个bucket中时(有效地使hashmap成为一个链接列表)


因此,只要你有一个非常合理的散列函数,最坏的情况就永远不会发生,你将得到一个恒定时间的操作。

std::unordered_map的最佳和最差性能在很大程度上取决于散列函数的质量。最坏的O(N)性能是指所有密钥映射到相同的哈希值(即100%冲突率)时的性能。因此,除非您有一个非常糟糕的哈希函数,否则您不会真正获得那种最坏情况下的性能

当涉及到确定哈希映射的性能时,它与数据的概率和统计数据有很大关系。基本上,输入数据(键)有一个分布,然后将其映射到散列值的分布。如果您很了解输入分布,则可以设计一个好的散列函数,该函数将映射到散列值的均匀分布。如果散列值的分布非常均匀,则冲突的概率很低,因此桶的大小也很小(具有相同哈希值的值组)平均较小,这将导致非常好的平均案例性能。您可以说平均案例性能为O(B),其中B是存储桶的平均大小。哈希函数越好,冲突概率越低,存储桶大小越小,平均性能越好,这就是您应该追求的目标

一般来说,你不能保证你不会得到最差的性能O(N),但是你可以保证发生这种糟糕情况的概率非常低


也就是说,可能有一种数据结构,它以一种可以加快查找速度的方式存储每个bucket的元素,例如二叉树或排序数组。我不知道有哪种容器可以做到这一点,但它会将最坏的情况减少到O(log(N))左右,但也会增加额外的负担(常数因子)。因此,在一天结束时,您必须测试它以确定。

std::unordered_map的最佳和最差性能在很大程度上取决于哈希函数的质量。最差的O(N)性能是当您的所有键映射到相同的哈希值时(即100%冲突率)。因此,除非你有一个非常糟糕的哈希函数,否则你不会得到那种最坏情况下的性能

当涉及到确定哈希映射的性能时,它与数据的概率和统计数据有很大关系。基本上,输入数据(键)有一个分布,然后将其映射到散列值的分布。如果您很了解输入分布,则可以设计一个好的散列函数,该函数将映射到散列值的均匀分布。如果散列值的分布非常均匀,则冲突的概率很低,因此桶的大小也很小(具有相同哈希值的值组)平均较小,这将导致非常好的平均案例性能。您可以说平均案例性能为O(B),其中B是存储桶的平均大小。哈希函数越好,冲突概率越低,存储桶大小越小,平均性能越好,这就是您应该追求的目标

一般来说,你不能保证你不会得到最差的性能O(N),但是你可以保证发生这种糟糕情况的概率非常低


也就是说,可能有一种数据结构,它以一种可以加快查找速度的方式存储每个bucket的元素,例如二叉树或排序数组。我不知道有哪种容器可以做到这一点,但它会将最坏的情况减少到O(log(N))左右,但也会增加额外的负担(常数因子)。因此,在一天结束时,你必须测试它以确定答案。

这个怎么样,只是一个建议

Sudo code:

my_hash = GenHash(key)

std::unordered_map<my_hash, val, Hash = my_hash> map1   <---- Hash function of unordered_map should return its key. i.e. my_hash
std::map<key, val> map2

if my_hash is in map1
    map2[key] = val
else
    val.k = key    <---- assumes key can be stored/found inside the value
    map1[my_hash] = val
Sudo代码:
my_hash=GenHash(密钥)

std::无序地图map1这个怎么样,只是一个建议

Sudo code:

my_hash = GenHash(key)

std::unordered_map<my_hash, val, Hash = my_hash> map1   <---- Hash function of unordered_map should return its key. i.e. my_hash
std::map<key, val> map2

if my_hash is in map1
    map2[key] = val
else
    val.k = key    <---- assumes key can be stored/found inside the value
    map1[my_hash] = val
Sudo代码:
my_hash=GenHash(密钥)

std::unordered_map map1您对哈希函数有一点看法,但这样一个容器是存在的:您对哈希函数有一点看法,但这样一个容器是存在的:y