在过去的几天里,我对此进行了广泛的研究,我读了很多东西,以至于我现在比以往任何时候都更加困惑。如何在大型数据集中找到最长的公共子字符串?这个想法是从这个数据集中删除重复的内容(长度不同,所以算法需要连续运行)。大型数据集是指大约 100mb 的文本。
后缀树?后缀数组?拉宾-卡普?最好的方法是什么?那里有可以帮助我的图书馆吗?
真的希望得到一个好的回应,我的头很痛。谢谢!:-)
在过去的几天里,我对此进行了广泛的研究,我读了很多东西,以至于我现在比以往任何时候都更加困惑。如何在大型数据集中找到最长的公共子字符串?这个想法是从这个数据集中删除重复的内容(长度不同,所以算法需要连续运行)。大型数据集是指大约 100mb 的文本。
后缀树?后缀数组?拉宾-卡普?最好的方法是什么?那里有可以帮助我的图书馆吗?
真的希望得到一个好的回应,我的头很痛。谢谢!:-)
我一直在使用后缀数组。因为我一直被告知这是最快的方式。
如果您在运行算法的机器上内存不足,您可以随时将数组保存在硬盘驱动器上的文件中。它会大大减慢算法的速度,但至少会提供结果。
而且我不认为一个库会比一个好的书面和干净的算法做得更好。
LE:顺便说一句,您无需删除任何数据即可找到最长的公共子字符串。
从最长公共子串问题:
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 字符数组来存储您的计算。还要检查这个页面
LE:Rabin-Karp 是一种模式匹配算法,这里不需要它。