我目前正在写一个特里树,并想知道如果有任何时间复杂性差异
hash_table [key] == NULL
和
hash_table.find(key)== hash_table.end()
如果密钥不在表中。 C++ reference表示map :: find的时间复杂度为log(n)
提前致谢。
答案 0 :(得分:1)
两种情况下的时间复杂度都是相同的,但是如果你想要做的就是检查地图中是否存在明显有mapped_type
的指针,而nullptr
是指针的key
无效值,第一个表单将严格减慢,因为在缺席的情况下,它将首先在<{1}}的地图中插入新值。这样你需要做的额外工作......这是最好的情况,只有在非常严格的情况下才有效。
如果您只想测试是否存在值,请执行以下任一操作:
if (map.find(key) == map.end()) {
// absent
}
或
if (!map.count(key)) {
}
答案 1 :(得分:0)
这两种方法完全不同:
hash_table[key]
为key
插入一个默认构造值hash_table.find(key)
仅在key
中找到hash_table
的元素,如果找不到,则返回end()
在这两种情况下,a hash_table
的复杂性实际上预计会摊销不变。也就是说,从复杂的角度来看,没有任何区别,但插入元素可能会产生不必要的成本(这取决于是否插入key
;如果是这样,保留参考可以使它成为可能更有效率。)
如果hash_table
恰好是std::map<K, V>
而非std::unordered_map<K, V>
,则两个操作的复杂性为O(log n)
,其中n
是元素的数量容器。由于使用下标运算符插入元素,n
可能更大:它可能不会改变复杂性(除非尝试的密钥比密钥多得多),但使用{{1可能会更好。