搜索二维数组比嵌套for循环更有效的方法?

时间:2015-03-05 20:57:51

标签: javascript arrays

所以我有一个接受二维数组和字符串的函数。然后它搜索表并计算找到给定字符串的次数。

以下是代码:

function getNumberShifts(table, name) {

  var amount = 0;

  for(i = 0; i < table.length; i++){
    for(j = 0; j < table[i].length; j++){

      var text = table[i][j].toString();

      if(text.indexOf(name)>-1){
        amount += 1;
      }
    }
  }
  return amount;
}

2D阵列不是那么大,大约30 x 60.大多数单元格是空的或包含1个元素(名称)。有时它可以包含两个。

是否有比O(n ^ 2)更有效的方法? (这是Google表格脚本)

提前致谢!

编辑:示例表:

时间|星期一|星期二|星期三|星期四|星期五|星期六|星期一| ...
12:00 | --name1 | --- name2 | ---- name3 | --- name2 | name4 | ---- name1 | name2 | ...


(忽略破折号,它们仅用于格式化目的,所以你们“看到”表格)

基本上就是这样。只是一张有名字的桌子。顶行和左列不是发送到函数的表的一部分。只是名字。有些单元格是空的,(因此对我和我的同事来说更容易阅读)

3 个答案:

答案 0 :(得分:2)

抱歉,但没有更快的方法。您需要至少检查一次每个单元格。

答案 1 :(得分:0)

一次搜索无法更快地完成。正如Safari指出的那样,你必须在每个细胞中查看一次,有n ^ 2个细胞,所以......

但是如果你多次搜索,将2D数组预处理成单个哈希数组可能是有意义的。所以n ^ 2设置时间,但每次搜索只有log(n)查找时间。

var getNumberShiftsFinder = function(table) {
  var found = {};

  for(var i = 0; i < table.length; i++){
    for(var j = 0; j < table[i].length; j++) {
      var text = table[i][j].toString();
      found[text] = 1 + ( found[text] || 0 );
    }
  }
  return function(name) {
      return found[name] || 0;
  };
};

答案 2 :(得分:0)

可能是将数组转换为字符串并使用字符串的indexOf,

每次比赛后递增索引,比

更省力

遍历数组。

function getNumberShifts(table, name){
    var i= 0, amount= 0, text= table.join(' ');
    while((i= text.indexOf(name,i)+1)){
        ++amount;
    }

    return amount;
}


var A1= [
    [0, "name2"], [1, ""], [2, "name2"], [3, ""], 
    [4, "name3"], [5, ""], [6, "name2"], [7, ""], [8, "name2"], [9, "name3"], 
    [10, "name2"], [11, ""], [12, "name2"], [13, ""], [14, "name3"], [15, ""], 
    [16, "name2"], [17, ""], [18, "name2"], [19, "name3"], [20, "name2"], 
    [21, ""], [22, "name2"], [23, ""], [24, "name3"], [25, ""], 
    [26, "name2"], [27, ""], [28, "name2"], [29, "name3"]
]

getNumberShifts(A1,&#39; name3&#39;);

/ *返回值:(Number) 6 * /