hash_table[key] == NULL 和 hash_table.find(key) == hash_table

Time complexity difference between hash_table[key] == NULL and hash_table.find(key) == hash_table.end()?

本文关键字:hash table key find NULL      更新时间:2023-10-16

我目前正在写一个trie树,想知道两者之间是否存在任何时间复杂度差异

hash_table[键] == 空

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

如果键不在表中。 C++参考说 map::find 的时间复杂度为 log(n(

提前谢谢。

两种情况下的时间复杂度是相同的,但是如果您只想检查地图中的缺失,该地图显然具有指针的mapped_type并且nullptr是无效值,则第一种形式将严格变慢,因为在不存在的情况下,它将首先映射中插入一个新值以进行key。所以这是你必须做的额外工作...这是最好的情况,只有在相当僵化的情况下才有效。

如果您只想测试值是否存在,只需执行以下任一操作:

if (map.find(key) == map.end()) {
    // absent
}

if (!map.count(key)) {
}   

这两种方法做完全不同的事情:

  • hash_table[key]插入具有默认构造值的key元素
  • hash_table.find(key)只是在hash_table中定位具有key的元素,如果未找到,则返回end()

在这两种情况下,hash_table的复杂性实际上预计是摊销不变的。也就是说,从复杂性的角度来看,没有任何区别,但插入元素可能会产生不必要的成本(这取决于是否插入了key;如果是这样,保留引用可以使其更有效率(。

如果hash_table恰好是std::map<K, V>而不是std::unordered_map<K, V>则两个操作的复杂性O(log n)其中n是容器中的元素数。由于使用下标运算符会插入元素,因此n可能会更大:它可能不会改变复杂性(除非尝试的键比存在的键多得多(,但使用 find() 的性能可能会更好。