我在stackoverflow上读了很多关于unordered_map的时间复杂度,但我没有找到我的问题的答案。
假设按整数进行索引(只是举例):
插入/在函数中工作恒定(平均时间),因此该示例将需要O(1)。
std::unordered_map<int, int> mymap = {
{ 1, 1},
{ 100, 2},
{ 100000, 3 }
};
我好奇的是遍历(未排序的)map中所有存储值需要多长时间 - 例如
for ( auto it = mymap.begin(); it != mymap.end(); ++it ) { ... }
我能假设每个存储的值只被访问一次(或两次或常数次)吗?这意味着遍历所有值在N值映射中是O(N)。另一个可能性是,如果用数组表示,我的键为{1,10,100000}的示例可能需要多达1000000次迭代。
是否有其他容器可以按给定键进行线性迭代并恒定时间访问值?
我真正需要的是(伪代码)
myStructure.add(key, value) // O(1)
value = myStructure.at(key) // O(1)
for (auto key : mySructure) {...} // O(1) for each key/value pair = O(N) for N values
std::unordered_map是我需要的数据结构吗?
整数索引足够了,平均复杂度也行。
map
还是unordered_map
应该基于你是否需要保留键的相对严格弱排序。如果需要,则需要使用常规的map
。如果不需要,则unordered_map
是最合适的选择(前提是键可以被散列为合理的分布)。 - WhozCraiginsert
/emplace
/[]
中触发重新哈希时使现有迭代器/引用/指针无效是否可接受,然后会有性能差异,通常更偏向于unordered_map
,但应该由那些工具分析/检测工具说真正关心的人来进行测量。 - Tony Delroy