将字符串集与一个字符串进行比较的最快方法是什么?

时间:2014-07-12 22:38:43

标签: c++ string sorting time compare

我有一组字符串,我需要找到一个特定的字符串。我只需要这样做一次(下次字符串不同)。

我正在考虑使用存储桶排序对字符串进行排序,然后进行二进制搜索。

时间复杂度:O(n + k)+ O(log n)

有没有更快/更好的解决方案?

使用set我的意思是更多字符串而不是std :: set。

1 个答案:

答案 0 :(得分:4)

在答案中总结上述评论。如果您正在加载要在运行中进行比较的字符串,并且不需要它们按特定顺序排列,那么std::unordered_set是最快的。

unordered_set是一个哈希集,它将通过哈希函数打出你的字符串,并在常量时间O(1)中查找它是否已经在集合中。

如果你需要保留元素的顺序,那么问题就是保留向量并进行线性搜索更快,或者是否仍然值得构建哈希集。

代码:

std::unordered_set<std::string> theSet;

// Insert a few elements.
theSet.insert("Mango");
theSet.insert("Grapes");
theSet.insert("Bananas");

if ( theSet.find("Hobgoblins") == theSet.end() ) {
    cout << "Could not find any hobgoblins in the set." << endl;
} 

if ( theSet.find("Bananas") != theSet.end() ) {
    cout << "But we did find bananas!!! YAY!" << endl;
}

进行比较:

如果使用std::vector,则需要O(n)时间构建向量,然后O(n)时间找到元素。

如果你使用std::unordered_set,你仍然需要O(n)时间来构建向量,但之后你可以在常数时间O(1)中找到一个元素。