在两组文本文件之间找到一个不同关键字的最快方法/算法

时间:2009-04-05 00:12:10

标签: .net algorithm diff

我有4个文本文件,其中2个包含其他2个文本文件没有的关键字。

在前2个文本文件中共享此“关键字”但在其他2个文件中不存在的最快方式/算法是什么?

我可以想到很慢的方式,例如逐字逐句,然后用IndexOf等搜索。但听起来它会非常慢。特别是如果文件编号增加。

额外1:关键字可以是单个词,例如“apple”或句子“你见过苹果树吗?”。只要其他两个文本文件不包含此关键字,就没关系。但我认为表现明智更短会更好。

额外2:这些文本文件实际上是简单的HTML源,因此预计会很大。

3 个答案:

答案 0 :(得分:4)

如果您只有一个关键字(或关键短语),那么您最好只使用indexOf()或类似的简单现有函数调用。你的瓶颈不是CPU甚至是内存带宽,而只是磁盘速度。您的CPU搜索速度比磁盘可以提供的速度快10倍。

如果您的文件已经在内存,并且您需要快速扫描,那么正确的算法可能是Boyer MooreKMP。但是,首先不要理会它,尝试简单的indexOf()类型的原语,看看这对你来说是否真的太慢了​​。电脑很快,你可能会感到惊讶。

答案 1 :(得分:2)

这似乎是哈希表完美的东西。在O(1)时间内可以存储和检索哈希表条目,并且可以在这里非常有效地使用。我建议尝试类似以下算法:

  1. 创建一个Dictionary<string, int>(这实际上是一个通用哈希表,从.NET 2.0开始提供)。这将用于跟踪每个关键字的出现次数(该值将作为位字段)。
  2. 加载每个文本文件并读取所有关键字,为找到关键字的相应文本文件设置适当的位。 例如:

    dict[keyword] |= (1 << curTextFileIndex);
    

    其中curTextFileIndex在您的情况下会从0变为3。

  3. 迭代字典中的所有条目,查找适当的值(位字段)。在您的情况下,因为您正在寻找前两个文件中出现但而不是最后两个的关键字,您要搜索的值为0011(或3)十进制)。找到此条目即可获得关键字。
  4. 除非我弄错了,否则此算法会在O(n)时间运行,其中n是所有文本文件中关键字的总数。我不认为你会比这更好,真实。

    希望有所帮助。如果您需要更多详细信息,请与我们联系......

    编辑:嗯...我似乎错过了关于你的“关键字”,可能包含多个实际单词。如果已知这些“关键字”短于某些(低)字数,那么我认为这种解决方案可能仍然可行,只需进行少量修改即可。否则,你需要一些更聪明的东西,它会出现。

答案 2 :(得分:1)

首先,生成每个文件中的所有关键字。 (我猜这是非常好的样板)

现在,创建一个集合或散列集(基本上,它允许您非常快速地检查字符串是否是集合的一部分)每个文件的关键字。 (谷歌代码/细节,几乎所有语言)

完成此操作后,您所要做的就是遍历每个可能的关键字并检查它是否恰好存在于两个文件中。由于您使用的是散列集,因此每次查找只需要几次操作 - 总体而言,这应该非常快。