在无序字符串集中查找字符串的时间复杂度

Time complexity of finding a string in an unordered set of strings

http://www.cplusplus.com/reference/unordered_set/unordered_set/find/

在 unordered_set 中查找的时间复杂度在 unordered_set 中平均保持不变。 如果我有 unordered_set 个字符串,那么在该集合中查找字符串的时间复杂度是多少? 它是常量还是 O(字符串的长度)?

std::unordered_set 实现为散列 table。它的 find 方法具有 O(1) 的平均情况复杂度和 O(set.size()) 键比较的最坏情况复杂度,如 [tab:container.hash.req] 所指定。


默认情况下,std::unordered_set<std::string> 使用 operator== 来比较键,因此每个键比较在 [string.view.ops] 中指定的 O(str.size()) 中运行(operator==(const std::string&, const std::string&) 已定义等价于std::string_view(str1) == std::string_view(str2),定义为等价于std::string_view(str1).compare(std::string_view(str2) == 0).

对于 std::unordered_set<std::string>,容器必须计算要查找的字符串的哈希值。默认情况下,它为此使用 std::hash<std::string>。该标准未指定 std::hash<std::string> 的任何复杂性要求,但很可能是 O(str.size()).