W-shingling实施 - 存储带状疱疹

时间:2012-02-07 19:46:04

标签: java

我需要实现w-shingling(用Java)来比较两个html文档的相似性。问题是如何收集和存储带状疱疹。让我们假设(a,rose,is,a,rose,is,a,rose)就是这些文档中的一个。我想我的算法(使用LinkedList)不会是最快的:

  1. 从文件(a)中获取下一个单词 - 如果没有其他单词,请在此处停止。
  2. 检查(a)带状疱疹列表中的发生情况
  3. 如果它出现在那里,请转到第一步
  4. 如果不是,请将其附加到列表并转到第一步
  5. 正如我预测的那样,对于大型文档来说,这可能会非常慢。你能给我一些提示,让它更快......?

1 个答案:

答案 0 :(得分:1)

根据算法,您必须首先创建所有可能的w-shingling - w - 文档中出现的字长序列。您需要维护一个从文档中读取的 w - 字序列的窗口(即在读取 w + 1个字后,您可以丢弃缓冲区中的第一个字)。

对于存储w-shingling,您可以创建不可变类并实现equals()hashCode()以提高比较性能。当您构建带状疱疹时,您可以将它们存储在Set中,以便在运行中摆脱重复。