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