编程语言
首页 > 编程语言> > javascript-在两个(或多个)数组中查找匹配的单元格序列的最有效方法是什么?

javascript-在两个(或多个)数组中查找匹配的单元格序列的最有效方法是什么?

作者:互联网

例子1

假设我有两个数组:

('n','v','a','n','i','n','n','v','a','n')
('a','n','n','n','v','a','n','v','n')

我想找到两者之间的所有匹配序列(可能在两个单元格以上),而不是其他更长匹配的子匹配.这是我所看到的匹配项:

(‘n’,’n’,’v’,’a’,’n’)=数组1中的位置5和数组2中的位置3

数组1:(‘n’,’v’,’a’,’n’,’i’,’n’,’n’,’v’,’a’,’n’)

数组2 :(‘a’,’n’,’n’,’n’,’v’,’a’,’n’,’v’,’n’)

例子2

('n','v','a','n','i','n','n','v','i','n')
('a','n','i','n','p','v','i','n','v','n')

在这里,我们有多个序列,但是它们较短,如下所示:

(‘a’,’n’,’i’,’n’)=在数组1中的位置2在数组2中

(‘v’,’i’,’n’)=数组1中的位置7和数组2中的位置5

数组1:(‘n’,’v’,’a’,’n’,’i’,’n’,’a’,’v’,’i’,’n’)

数组2:(‘a’,’n’,’i’,’n’,’p’,’v’,’i’,’n’,’v’,’n’)

摘要

两个示例中都有多个匹配项,但它们都存在于至少一个数组的较大匹配项中.

那么,能达到此目的的最有效的代码(在低内存和高速之间取得平衡,请考虑移动设备)是什么? JavaScript代码示例将很棒!

解决方法:

这是我对普通LCS O(mn)时空版本的JavaScript尝试.由于我们逐行进行,因此可以通过仅重用两行来减少空间,完成后将第二行复制到第一行.

var example1 = [['n','v','a','n','i','n','n','v','a','n']
               ,['a','n','n','n','v','a','n','v','n']],

    example2 = [['n','v','a','n','i','n','n','v','i','n']
               ,['a','n','i','n','v','i','n','v','n']];

function f(as){
  var M = new Array(as[0].length),
      result = [];

  for (var i=0; i<as[0].length; i++){
    M[i] = new Array(as[1].length).fill(0);

    for (var j=0; j<as[1].length; j++){
      if (as[0][i] == as[1][j]){
        M[i][j] = M[i-1] && M[j-1] ? 1 + M[i-1][j-1] : 1;
      }
      if ((i == as[0].length - 1 || j == as[1].length - 1) && M[i][j] > 2){
        result.push([i - M[i][j] + 1,j - M[i][j] + 1,M[i][j]]);
      } else if (i > 1 && j > 1 && M[i][j] < M[i-1][j-1] && M[i-1][j-1] > 2){
        result.push([i - M[i-1][j-1],j - M[i-1][j-1],M[i-1][j-1]]);
      }
    }
  }

  return result;
}

console.log(JSON.stringify(f(example2))); // [[2,0,4],[6,3,4]]

标签:arrays,javascript,algorithm,pattern-matching
来源: https://codeday.me/bug/20191027/1942146.html