所以我有一个接受二维数组和字符串的函数。然后它搜索表并计算找到给定字符串的次数。
以下是代码:
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 | ...
。
。
。
(忽略破折号,它们仅用于格式化目的,所以你们“看到”表格)
基本上就是这样。只是一张有名字的桌子。顶行和左列不是发送到函数的表的一部分。只是名字。有些单元格是空的,(因此对我和我的同事来说更容易阅读)
答案 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 * /