查找大型数据集中最长的公共子字符串

时间:2010-11-17 20:34:02

标签: algorithm string large-files suffix-tree

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

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

真的希望有一个好的回应,我的头很疼。谢谢! : - )

1 个答案:

答案 0 :(得分:4)

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

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

我认为图书馆不会比一个好的书面和干净的算法做得更好。

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是一种模式匹配算法,你在这里不需要它。