【发布时间】:2021-01-08 10:07:19
【问题描述】:
如果散列函数良好,unordered_set 应该提供 O(1) 的查找时间。
每个桶包含具有相同哈希值的项目。
让我们假设我们的散列函数是理想的并且完全没有冲突。
哈希值可以从 0 到 max(std::size_t) 变化。
如何在不为存储桶分配连续内存间隔的情况下组织 unordered_set 并提供 O(1) 查找?
我们不能分配连续的内存间隔,因为如果我们分配,那么我们将大量内存仅用于几个哈希值 - 例如 0 和 1000000。
中间的值根本没有使用,但我们为它们分配了内存。
【问题讨论】:
-
looking up a key 的复杂性是“[c] 平均而言是恒定的,最坏的情况是与容器大小呈线性关系。”,而不是 O(1)。
-
Each bucket contains items with the same hash value.Let's assume that our hash function is ideal and gives no collisions at all.这两个语句的含义相反。如果您的哈希是理想的,那么您将拥有与元素一样多的桶。所以你的查找将是 O(1)。 -
是的,会的。但是如何分配这些桶呢?如果我们连续分配它们,那么我们会使用大量内存但提供快速查找。
-
你想多了。
unordered_set的实现方式是桶数不超过项目数。 IMO 这个问题来自XY problem。 -
哈希值通常不是桶索引。参见例如Wikipedia on hash tables。
标签: c++ performance collections unordered-map unordered-set