我有两个文本文件:第一个有~100,000个单词,另一个有~850,000个单词。两者都被解析为单独的向量。如果两个文件中都有一个单词,我需要做一些事情。
我已经编写了一些循环遍历第一个和第二个文件的C ++代码,但是时间复杂度是O(n ^ 2),对于这个大文件,这个代码将永远耗尽。即使在15分钟后,它似乎也没有完成。
for (string word1 : firstTextFile)
{
for (string word2 : secondTextFile)
{
if (word1 == word2)
{
doSomething();
}
}
}
有更快的方法吗?我到处搜索,但我不知道该怎么做。任何帮助都会很棒,谢谢!
答案 0 :(得分:4)
答案 1 :(得分:2)
#include <algorithm>
for (string word1 : firstTextFile) {
if (std::binary_search(secondTextFile.begin(), secondTextFile.end(), word1) {
doSomething();
}
}
上面的复杂性是 O(firstTextFile.size()* log(secondTextFile.size())。
如果您使用std::unoredered_set<std::string> secondTextFile
代替std::vector<std::string> secondTextFile
:
for (string word1 : firstTextFile) {
if (secondTextFile.count(word1)) {
doSomething();
}
}
复杂性是 O(firstTextFile.size())。
此外,您可以节省插入和排序单词到secondTextFile
的时间: O(secondTextFile.size())而不是 O(secondTextFile.size()* log( secondTextFile.size()))
答案 2 :(得分:1)
由于两个向量都已排序,因此实现此目的的算法类似于合并排序。
列表中有一个线性遍历,算法试图将两个列表保持在字典排序的大致相同部分。
while( worda && wordb ){
if( worda == wordb ){
DoSomething();
worda = nextWordFromA();
wordb = nextWordFromB();
} else if ( worda < wordb ) {
worda = nextWordFromA();
} else {
wordb = nextWordFromB();
}
}