У меня есть цикл, в котором мне нужно вычислить расстояние между одной строкой и вектором из многих строк. Я использую пакет "stringdist" и функцию с тем же именем, которая работает хорошо.
Однако каждый раз для расчета расстояний требуется довольно много времени. Например, чтобы получить расстояние между одним словом и 3,5 миллионами других слов, требуется примерно 0,5 секунды. Это не так много, но 3,5 миллиона раз это займет слишком много времени.
Я не могу сделать матрицу расстояний, так как она будет слишком большой, и я разделю вычисления, чтобы избежать необходимости вычислять полную матрицу, которая была бы 3,5 миллиона на 3,5 миллиона.
Возможно ли как-то вычислить расстояния Левенштейна и / или Хэмминга, используя Rcpp для ускорения этого (много)?
Я попробовал пакет компилятора и использовал "cmpfun", но это не меняет скорость. Я предполагаю, что мне нужно написать функцию stringdist с использованием C ++? К сожалению, я понятия не имею, как.
StringDist - это часть цикла, которая занимает> 95% времени этого шага цикла, поэтому сокращение очень поможет.
Любая помощь будет оценена.
Редактировать 1:
Это небольшой вектор строк, например:
bioID
[1] "F" "FPhGLGcbLFF" "FhGWhSLYcmYF" "FhGcGbGYhF" "GGLcSFhGmhLYF" "GGbhhcLFF"
[7] "GLWGcGLmhcLFF" "GLYmcmFF" "GLbcmYF" "GLhhFGmGccmFF" "GLhhLGYLbGmFF" "GLhhLGbGchmYF"
[13] "GLhhLGmLYcmYF" "GLhhLLLGmcmFF" "GLhhLhGGGcmYF" "GLhhPPmmchmYF" "GLhhmGbGLcmYF" "GLhmYbGmmPmbF"
[19] "GLhmcbLFF" "GPhbhYmhPLbF" "GbhmLFF" "GhhYcmYF" "GmGhGYhcLFF" "GmbmbmhcLFF"
[25] "LGGYmcmFF" "LGLGmPmbF" "LGbF" "LGhbLchmYF" "LLGLYhGcLFF" "LLPGhhbPLmcmFF"
[31] "LLcmmPPmhcLFF" "LLhhLLGLhhYmcmFF" "LPPhcbLFF" "LYcmYF" "LbGmmPmbF" "LbLLGGccmYF"
[37] "LhPbGchmYF" "LhbGbmYGYhF" "LmhGLmLLhF" "PGYLhGcGYhF" "PLhhLLGLhhYmcmFF" "PLhhchhGhGLccmFF"
[43] "PLhmGLhhPmGGcmFF" "PbLhhbLmhGcLFF" "PbbcbGbcLGYhF" "PbhLcLGmhLYF" "PcLFF" "PcPcLFF"
[49] "PhbcLSmcmFF" "PmYcmYF" "PmbF" "SFFbmbhLYcmYF" "SGGGbhchmYF" "SGGPhLGcbLFF"
[55] "SGGmGcmhGcLFF" "SGLGcFGhcLFF" "SGLGmGLGcmYF" "SGLLGhGmhLYF" "SGLPbPmYmcmFF" "SGLWhGcGbLFF"
[61] "SGLmmLmhcLFF" "SGPLbbmmPmbF" "SGPmhLcbcchmYF" "SGSGGbLhchmYF" "SGWGYLGcmYF" "SGWhLbPLbcmYF"
[67] "SGbGGmhLYF" "SGcbLFGmmPmbF" "SGcmWGGGLLbF" "SGhLLGGLmcmYF" "SGhbhGPcYcmYF" "SGmGGLLFLYmcmFF"
[73] "SGmLGLLmPmbF" "SLFGGhGbbLcLFF" "SLFGbGFhcLFF" "SLFGmGGhGLmLLhF" "SLFPFbcLLLYcmYF" "SLFPLLGGhchmYF"
[79] "SLFSFbcLFF" "SLFbGhcmYGYhF" "SLFbGmLYGYhF" "SLFcGGLccbLFF" "SLFhGLLmhcLFF" "SLFmGLbcmGmcmFF"
[85] "SLFmPchmYcmYF" "SLFmbPLGLmLLhF" "SLGGGLLFYmcmFF" "SLGGGLLGmhcLFF" "SLGGGLmcbLFF" "SLGGGYmcmFF"
[91] "SLGGGhGLmLLhF" "SLGGGhLcYmcmFF" "SLGGGhhcLFF" "SLGGLGYhmcmFF" "SLGGLLGcYmcmFF" "SLGGLLhGcLFF"
[97] "SLGGLhFhcLFF" "SLGGSGLhGhhYmcmFF" "SLGGbLYcmYF" "SLGGbbcLYGYhF"
Редактировать 2: Я использовал комментарий Эндрю, чтобы переосмыслить проблему, и вот как я сейчас с ней работаю:
Так как сейчас мне все равно нужны только расстояния 1, я только вычисляю расстояние для моей строки под рукой, используя строки одинаковой длины, на одну букву короче или на одну букву длиннее. Это значительно сокращает время. Для больших наборов данных это все еще занимает очень много времени, но это уже помогает.