hash_table [key] == NULL和hash_table.find(key)== hash_table.end()之间的时间复杂度差异?

时间:2014-10-26 22:36:06

标签: c++ hashmap

我目前正在写一个特里树,并想知道如果有任何时间复杂性差异

hash_table [key] == NULL

hash_table.find(key)== hash_table.end()

如果密钥不在表中。 C++ reference表示map :: find的时间复杂度为log(n)

提前致谢。

2 个答案:

答案 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可能会更好。