给定两个文件在file1中找到单词但在file2中找不到

时间:2015-06-07 08:31:57

标签: java algorithm

鉴于两个文件提出了一个算法/程序来查找file1中的单词,但不是在file2中 请注意,文件中的字词不按排序顺序

这是我的思考过程:

  • 步骤1:读取并将文件2的单词添加到HashSet
  • 第2步:读取file1并检查file1的单词是否为' not'出现在HashSet中。然后将其添加到file1中但不在file2中的单词列表中。

如果两个文件中的单词数量都少于100或1000,则此算法可以正常工作 但是,如果这两个文件都很庞大(数十亿字),那么这个解决方案将不起作用,因此我想出了一个改进的解决方案:

  • 第1步:逐字逐句阅读文件,按字母顺序对文字进行排序,将文字分配给单词,比如以#39; a'
  • 开头的所有单词。

因此,地图将如下所示[' a':{' ample'''' ...}]。这将帮助我在log(n)时间复杂度内搜索存储区,然后log(n)查找该单词是否包含在排序列表中。

  • 步骤2:读取file1并检查file1的单词是否没有存储桶或者不在存储桶中包含的列表中。

此解决方案可行,但我相信仍有改进余地 如何进一步改进这个解决方案?

1 个答案:

答案 0 :(得分:2)

一种可能的解决方案是使用一些external sort对两个文件进行排序,然后并行迭代它们以找到仅出现在文件1中的单词:

伪代码(排序后):

iter1 = 0
iter2 = 0
while iter1 < file1.length:
    if file1[iter1] == file2[iter2]:
         iter1 = iter1 + 1
         iter2 = iter2 + 1
    else if file1[iter1] > file2[iter2]:
         iter2 = iter2 + 1
    else: //we know for sure the item is only in file1
         iter1 = iter1 + 1
         yield file1[iter1]

此解决方案需要O(nlogn)时间,所需空间非常小(外部排序所需的空间量)。

另请注意,此问题是element distinctness problem的变体,因此在使用基于比较的算法或Omega(n)时间+空间使用散列时,很可能它具有Omega(nl0gn)的下限。 / p>