unordered_set <int> find方法的时间复杂度

时间:2017-02-27 14:02:01

标签: c++11 stl time-complexity unordered-set

unordered_set<int>find方法的时间复杂度是多少?

还可以更改哈希函数吗?

2 个答案:

答案 0 :(得分:2)

  

unordered_set中find方法的时间复杂度是什么?

...它就在您链接的页面中:

  

<强>复杂性

     

平均情况:常数。

     

最坏情况:容器大小为线性。

  

还可以更改哈希函数吗?

是。再看看at the documentation

Hash采用Hash模板参数。它是自定义点,您可以在其中注入自己的哈希逻辑。自定义{{1}}必须符合Hash概念。

答案 1 :(得分:0)

我猜您对默认的max_load_factor为1感到困惑。当您在unordered_set中插入一个int x时,它将转到存储区i(i = x%的存储区数量)。因此,您可以想象,即使散列函数不会发生冲突,因为它会将每个int与其自身映射,所以在某些情况下,mod操作可能会出现“冲突”。例如,如果按该顺序插入1、4和6,则1和6都将在同一个存储桶中,并且find函数将需要遍历该存储桶才能找到它们。仅当负载系数达到最大负载系数时,才会增加铲斗数。负载系数是每个存储桶中元素数的算术平均值。因此,每个存储桶中实际上可以有多个元素,甚至同一存储桶中的所有元素都可以相同。在这种情况下,找到集合内的元素将需要在存储桶内进行传统的安全搜索(O(n))。这里有一个例子:

unordered_set<int> n;
n.insert(1);
n.insert(12);
n.insert(23);
n.insert(34);
n.insert(45);

在这种情况下,每个int都在存储桶1中,因此当您寻找56(56%11 = 1)时,您需要遍历整个存储桶(大小为n,O(n))。负载系数为0.4545(5个元素/ 11个存储桶),因此未添加存储桶。您可以降低max_load_factor(某些语言使用的加载因子为0.75),但这会增加重排次数,因为您需要更频繁地保留存储桶(保留过程是摊销常量,因为它使用相同的std方法:: vector使用,这就是为什么在示例中我们有11个存储桶的原因)

相关问题