【问题标题】:More efficient way of searching through a two-dimensional array than nested for-loops?搜索二维数组比嵌套 for 循环更有效的方法?
【发布时间】:2015-05-07 09:30:45
【问题描述】:

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

代码如下:

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;
}

二维数组并没有那么大,大约 30 x 60。大多数单元格是空的或包含 1 个元素(名称)。有时它可以包含两个。

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

提前致谢!

编辑:示例表:

时间 |星期一 |星期二 |星期三 |星期四 |星期五 |星期六 |星期一 | ...
12:00| --name1 | ---名称2 | ----姓名3 | ---名称2 |名称4 | ----姓名1 |名称2 | ...
.
.
.

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

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

【问题讨论】:

  • 如果您用英语编写脚本,则更容易理解它在做什么。
  • @MightyPork 也许对你来说更容易,但对 OP 来说可能不是。真的一点点空格比放置变量名更有帮助(所有这些都很明显——tabell 是“表”,tekst 是“文本”,navn 是“名称”——我不知道'甚至不知道它是什么语言)用英语。
  • 是的,对不起。我现在编辑它。翻译它对我来说并不难,但我认为大多数变量都是显而易见的。顺便说一句,这是挪威语:)
  • 请输入表格样本,也许我们能想出一个聪明的方法。
  • @Gus Ortiz,当然。有没有办法在stackoverflow上格式化表格?

标签: javascript arrays


【解决方案1】:

抱歉,没有更快的方法可以做到这一点。您需要至少检查每个单元格一次。

【讨论】:

  • 我就是这么想的。我只是希望有一种我不知道的方法。哦,好吧:S
  • ……除非您对数据及其结构有更多了解,例如它是排序的。
【解决方案2】:

one 搜索不能更快。正如 Safari 指出的那样,您必须查看每个单元格一次,有 n^2 个单元格,所以...

但如果您要进行多次搜索,则将二维数组预处理为单个哈希数组可能是有意义的。所以一个 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;
  };
};

【讨论】:

  • 感谢您的帮助。你能解释一下代码是如何工作的吗?我真的很喜欢编程并且想了解更多。现在我只需要弄清楚如何在 google-spreadsheet 中实现它
  • 对于给定的表,代码生成一个名为 found 的关联数组。该数组将表中任何位置的每个字符串映射到该字符串在整个表中出现的次数的计数。然后它返回一个匿名函数,对于任何字符串,返回该字符串的 {{found}} 的内容,或者为零。这有帮助吗?请注意,这只匹配整个字符串,而不是子字符串或类似的东西。
【解决方案3】:

可能是把数组转成字符串,使用字符串的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, 'name3');

/* 返回值:(数字) 6 */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多