Suponha que existam muitas cadeias binárias
x <- c("0100100010101010", "0100110010101010","0111001000","010111")
Estou procurando um método rápido em R para gerar uma matriz contendo a substring comum mais longa em pares (excluindo autocorrespondências) desde o início . Por exemplo, uma solução poderia ser assim
> mySolution(x)
[,1] [,2] [,3] [,4]
[1,] "" "01001" "01" "010"
[2,] "01001" "" "01" "010"
[3,] "01" "01" "" "01"
[4,] "010" "010" "01" ""
Por exemplo, a matriz na posição [1,2] é a maior substring comum do início de x[1]
e x[2]
. Note que a matriz resultante é simétrica. Então, precisamos calcular apenas metade dela.
Eu sei que isso poderia funcionar com funções como substr,sub,grepl
, mas como tenho muitas strings, estou procurando uma solução muito eficiente que exija pouco tempo de computação. Talvez seja uma opção converter para números binários para melhorar o desempenho?
Talvez não seja tão eficiente, mas deve funcionar como esperado se você tiver uma
helper
função para encontrar a maior substring comum desde o inícioe além disso você pode definir funções personalizadas
f1()
ouf2()
, por exemplo,ou sua variante, mas um pouco mais rápida
tal que
Referência
mostra
Usar
data.table
para alguns passos custosos pode escalar por thread. Imprimindo apenas o triângulo superior.saída
Uma solução rápida para grandes vetores de strings binárias. A função
flcs
abaixo é capaz de executar a operação desejada em strings de caracteres binários de 10k em cerca de 13 segundos.A ideia é verificar sequencialmente o
k
caractere th de cada string e colocar cada string em um0
bin ou um1
bin. A maior substring comum entrei
ej
termina em ou antesk
sei
ej
estiverem em bins diferentes.flcs
retorna o ponto final da substring comum em pares, que pode ser usada para preencher o triângulo inferior da matriz desejada.Demonstrando:
Uma função para construir a matriz final a partir da saída de
flcs
:Compare com uma solução que compara cada string com cada outra string em paralelo.
Cronometre as duas funções em um vetor de 10k strings binárias.
flcs
realizou quase 50 milhões de comparações em cerca de 13 segundos.