我有一组字符串,我需要找到一个特定的字符串。我只需要这样做一次(下次字符串不同)。
我正在考虑使用存储桶排序对字符串进行排序,然后进行二进制搜索。
时间复杂度:O(n + k)+ O(log n)
有没有更快/更好的解决方案?
使用set我的意思是更多字符串而不是std :: set。
答案 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)中找到一个元素。