假设有很多二进制字符串
x <- c("0100100010101010", "0100110010101010","0111001000","010111")
我正在寻找 R 中的一种快速方法来输出一个矩阵,该矩阵包含从开始到结束的成对(不包括自匹配)最长公共子串。例如,解决方案可能如下所示
> mySolution(x)
[,1] [,2] [,3] [,4]
[1,] "" "01001" "01" "010"
[2,] "01001" "" "01" "010"
[3,] "01" "01" "" "01"
[4,] "010" "010" "01" ""
例如,位置 [1,2] 处的矩阵是从 和 开始的最长公共子串x[1]
。x[2]
请注意,生成的矩阵是对称的。因此,我们只需要计算它的一半。
我知道可以与类似函数一起使用substr,sub,grepl
,但由于我有很多字符串,我正在寻找一种非常有效的解决方案,需要很少的计算时间。也许可以将其转换为二进制数以提高性能?
也许性能不是那么好,但如果你有一个
helper
函数从一开始找到最长的公共子字符串,它应该可以按预期工作在其基础上,你还可以定义自定义函数
f1()
,f2()
例如,或者它的变体,但速度要快一点
使得
基准
节目
对于某些成本高昂的步骤,可以使用
data.table
每个线程进行扩展。仅打印上三角。输出
针对大型二进制字符串向量的快速解决方案。下面的函数
flcs
能够在大约 13 秒内对 10k 个二进制字符串执行所需的操作。思路是依次检查
k
每个字符串的第 字符,并将每个字符串放入一个0
容器或一个容器中。如果和在不同的容器中,则和1
之间的最长公共子串在或之前终止。i
j
k
i
j
flcs
返回成对公共子串的端点,可用于填充所需矩阵的底部三角形。演示:
根据输出构建最终矩阵的函数
flcs
:与并行比较每个字符串与其他字符串的解决方案进行比较。
在 10k 二进制字符串向量上对这两个函数进行计时。
flcs
在大约13秒内进行了近5000万次比较。