我当时在研究C ++中的STL,遇到了使用哈希实现的unordered_set,但是有一个带有哈希的存储桶概念,并且不同存储桶的大小也在不断变化。有人可以解释这是怎么做到的吗?
答案 0 :(得分:0)
散列是将大量数据转换成较小数据的过程。因此,当您将新元素添加到std:: unordered_set
时,新元素的值正在经过hash
计算,而得到的哈希实际上是key
,根据该哈希值将元素存储在std::unordered_set
及其访问方式。
散列技术的缺陷在于,不同的值可能会导致相同的散列值(key
)。在key
发生冲突的情况下,该值将存储在buckets
中-因此,bucket
是一种存储其keys
发生冲突的不同值的方法(即相同的键)。
虽然计算hash
函数需要“固定”的时间,但是在同一bucket
中所需元素值的分辨率是线性过程(逐个值比较),与桶。
随着您的std::unordered_set
不断增长,为了确保存储桶不会变得太大(导致元素访问速度过快/相对较慢),会触发重新存储桶,该事件由{{ 1}},以便容器大小和存储桶大小保持平衡