Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 给定两个文件,在文件1中查找单词,但在文件2中找不到_Java_Algorithm - Fatal编程技术网

Java 给定两个文件,在文件1中查找单词,但在文件2中找不到

Java 给定两个文件,在文件1中查找单词,但在文件2中找不到,java,algorithm,Java,Algorithm,给定两个文件,提出在文件1中查找单词的算法/程序,但不在文件2中查找单词。 请注意,文件中的字不是按顺序排序的 这是我的思考过程: 步骤1:读取file2的单词并将其添加到哈希集中 步骤2:读取file1并检查file1的一个字是否在HashSet中“不”存在。然后将其添加到文件1中的单词列表中,但不添加到文件2中 如果两个文件中的字数都只有100或1000个,则此算法将正常工作。 但是,如果这两个文件都很大(数十亿字),那么这个解决方案将不起作用,因此我提出了一个改进的解决方案: 步骤1

给定两个文件,提出在文件1中查找单词的算法/程序,但不在文件2中查找单词。
请注意,文件中的字不是按顺序排序的

这是我的思考过程:

  • 步骤1:读取file2的单词并将其添加到哈希集中
  • 步骤2:读取file1并检查file1的一个字是否在HashSet中“不”存在。然后将其添加到文件1中的单词列表中,但不添加到文件2中
如果两个文件中的字数都只有100或1000个,则此算法将正常工作。
但是,如果这两个文件都很大(数十亿字),那么这个解决方案将不起作用,因此我提出了一个改进的解决方案:

  • 步骤1:逐字阅读文件2,并按字母顺序对单词进行排序为单词分配一个存储桶,对所有以“a”开头的单词说一个存储桶
所以地图看起来像['a':{'sample','and'…}]。这将帮助我在log(n)时间复杂度内搜索bucket,然后在log(n)中查找单词是否包含在排序列表中

  • 步骤2:读取file1并检查file1中的一个单词是否没有bucket或不在bucket中包含的列表中
这个解决方案会奏效,但我相信还有改进的余地。

如何进一步改进此解决方案?

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

伪代码(排序后):

iter1=0
iter2=0
当iter1文件2[iter2]:
iter2=iter2+1
else://我们确信该项仅在文件1中
iter1=iter1+1
产量文件1[iter1]
此解决方案需要
O(nlogn)
时间,并且所需空间非常少(外部排序所需的空间量)


还要注意的是,这个问题是的一个变体,所以在使用基于比较的算法时,它很可能有一个下界
Omega(nl0gn)
,或者使用哈希的Omega(n)时间+空间。

,在我寻找更复杂、更不直观的解决方案之前,您可以使用数据库而不是哈希集。这应该能够处理更大的数据量。有了数十亿字,你的问题将是把所有东西都保存在内存中。如果您有足够的内存,那么HashSet解决方案会快得多。如果你没有足够的内存,那么就使用数据库。顺便说一句,你可能永远不会有数十亿个不同的单词。即使你采用了所有的复数形式,等等。英语中的单词比这少得多,而且你的文件可能使用了一个很小的子集。@JBNizet,我同意这个逻辑,但是单词也可以是名词。因此,它可以很容易地运行到不适合RAM的数字。O(nlogn)可能比使用哈希表慢。OPs的问题是他误解了哈希表中的某些内容。@AdamSkywalker是的,它是-这是一个折衷方案,由于与元素区分性问题的相关性,您可能需要线性空间或O(nlogn)时间。如果线性空间是一个问题-你将需要O(nlogn)解决方案。是的,关于折衷是正确的,但根据OPs second算法,他仍然保留内存中的所有内容。@阿米特,请欣赏答案,因此结论是,如果数据集很小,使用哈希集是有意义的,因为它的时间复杂度是O(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]