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()?
我目前正在写一个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()
的性能可能会更好。
相关文章:
- 什么是"#include <boost/functional/hash.hpp> "?
- 对自定义类使用 std::hash<uint64_t>
- Lua table in C++ dll
- std::hash<std::string> 可以为不同的字符串返回相同的值吗?
- C++std::hash实现总是确定性的吗
- std::hash for std::chrono::duration
- Hash for a std::pair, for use in an unordered_map
- 为什么在这种特殊情况下不需要将 std::hash() 的专用化注入到 std 命名空间中?
- R data.table 和 STRING_ELT() 错误:如何修复"字符向量"与"字符"错误?
- 为什么当我在MD5 Hash中转换相同的C 字符串时,每次都会获得不同的输出
- 在使用 JNI 将 c++ unordered_map转换为 java hashMap之前将其转换为 java hash
- "The C++ Library doesen't provide a hash for this type." - 在 std::unordered_map 中使用自己的类
- Qt/C++ hash of hashes
- 为什么不区分大小写适用于 std::unordered_set的 std::hash 函数?
- 错误:未使用不完整的类型'struct std::hash<>'无效
- 用于unordered_set<BSTR>的 Hash & EqualTo 函数
- 无法专门化 std::hash 以unordered_map存储自定义类型
- 调用 QSqlTableModel setTable 方法时出现"Unable to find table"错误
- 为模板类嵌套类定义 std::hash 时出现编译错误
- C++ "Count the number of collisions at each slot in the hash table"