【问题标题】:Finding the Longest Common Substring in a Large Data Set在大型数据集中查找最长的公共子串
【发布时间】:2011-05-11 16:01:56
【问题描述】:

在过去的几天里,我对此进行了广泛的研究,阅读了很多东西,以至于我现在比以往任何时候都更加困惑。如何在大型数据集中找到最长的公共子字符串?这个想法是从这个数据集中删除重复的内容(长度不同,所以算法需要连续运行)。大型数据集是指大约 100mb 的文本。

后缀树?后缀数组?拉宾-卡普?最好的方法是什么?那里有可以帮助我的图书馆吗?

真的希望得到一个好的回应,我的头很痛。谢谢! :-)

【问题讨论】:

  • 为什么需要连续运行?数据有变化吗?
  • 为什么不使用现成的压缩软件?
  • jonderry:我可能不太清楚,我的意思是每次通过后它都需要找到下一个最长的子字符串,依此类推。
  • jason:哪些压缩算法可以做到这一点?

标签: algorithm string large-files suffix-tree


【解决方案1】:

我一直在使用后缀数组。因为我一直被告知这是最快的方式。

如果运行算法的机器内存不足,您可以随时将数组保存在硬盘驱动器上的文件中。它会大大减慢算法的速度,但至少会提供结果。

而且我认为库不会比编写良好且干净的算法做得更好。

LE:顺便说一句,您无需删除任何数据即可找到最长的公共子字符串。

来自Longest Common Substring Problem

function LCSubstr(S[1..m], T[1..n])
    L := array(1..m, 1..n)
    z := 0
    ret := {}
    for i := 1..m
        for j := 1..n
            if S[i] = T[j]
                if i = 1 or j = 1
                    L[i,j] := 1
                else
                    L[i,j] := L[i-1,j-1] + 1
                if L[i,j] > z
                    z := L[i,j]
                    ret := {}
                if L[i,j] = z
                    ret := ret ∪ {S[i-z+1..i]}
    return ret

您不需要对任何内容进行排序,您只需解析一次 100MB 数据,并构建一个 n*m 字符数组来存储您的计算。 还要检查this page

LE:Rabin-Karp 是一种模式匹配算法,这里不需要。

【讨论】:

  • 您能提供一些示例代码或指向资源吗?我只是认为对一个 100mb 项目的数组进行排序需要很长时间,也许我错了。
  • 上面的文章很完美。最大复杂度为 O(nm),其中 n 和 m 是比较字符串的长度。我认为没有更快的方法。
  • 听起来问题是关于在单个文件中删除重复的文本位(我认为),在这种情况下你会想要for j := i+1..n。此外,绝对只存储最后一行和当前行,否则L 的大小约为 1e16!
猜你喜欢
  • 2014-04-16
  • 1970-01-01
  • 2012-10-07
  • 2014-04-14
  • 2012-05-02
  • 2015-06-23
  • 1970-01-01
  • 2016-06-03
  • 2010-11-28
相关资源
最近更新 更多