检查一个文本文件中的单词是否在第二个文本文件中(C ++)

时间:2018-05-12 07:14:40

标签: c++

我有两个文本文件:第一个有~100,000个单词,另一个有~850,000个单词。两者都被解析为单独的向量。如果两个文件中都有一个单词,我需要做一些事情。

我已经编写了一些循环遍历第一个和第二个文件的C ++代码,但是时间复杂度是O(n ^ 2),对于这个大文件,这个代码将永远耗尽。即使在15分钟后,它似乎也没有完成。

for (string word1 : firstTextFile)
            {
                for (string word2 : secondTextFile)
                {
                    if (word1 == word2)
                    {
                        doSomething();
                    }
                }
            }

有更快的方法吗?我到处搜索,但我不知道该怎么做。任何帮助都会很棒,谢谢!

3 个答案:

答案 0 :(得分:4)

简答:是的。

std::set_intersection函数以线性时间处理这种情况。如果你能够,只需使用它。

reference

答案 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();
    }
}