【问题标题】:What's the best way to find the shortest array in a two dimensional array?在二维数组中找到最短数组的最佳方法是什么?
【发布时间】:2013-08-19 02:57:35
【问题描述】:

例如,我有一个如下所示的数组:

var myArray = [[1,2,3],[1,2,3,4],[1,2],[1,2]];

我试图在myArray 中找到第一个最短的数组,在这种情况下是myArray[2]

显然我可以编写一个循环,检查每个数组的长度并返回最小的那个。我想知道是否有一种非常干净或更简洁的方法可以在 javascript 中执行此操作。类似这样的东西:http://ejohn.org/blog/fast-javascript-maxmin/

谢谢!

【问题讨论】:

  • 除非外部数组已排序或其他内容,否则您将始终需要循环。 Resig 的实现并不是真的更快(就复杂性而言),它只是比显式循环的代码更短。
  • 没有。但是您可以在更新时使用伴随的哈希表和数组来索引和记录大小和顺序。创建一个行为类似于列表但实现返回最空容器的方法的类。您可以在将某些内容推入容器或弹出某些内容时更新此值。

标签: javascript


【解决方案1】:

如果最好你的意思是最快的时间。你不会得到比 O(N) 更好的解决方案,因为你必须检查数组中的每个元素(假设它是未排序的)。

由于您无法获得比 O(N) 更好的结果,我认为没有理由不执行以下操作:

var myArray = [[1,2,3],[1,2,3,4],[1,2],[1,2]];

var shortestIndex = 0;

for( var i=1; i< myArray.length; i++){
    if(myArray[shortestIndex].length > myArray[i].length)
        shortestIndex = i;
}

现在myArray[shortestIndex] 是最短的数组。

【讨论】:

  • 使用变量shortestArray 对我来说更具可读性。
  • “既然你无法实现比 O(N) 更好的东西......”当然,在复杂性方面并没有更好,但一个 O(N) 可能仍然比另一个 O(N) 慢 1000 倍)。我不确定这是否微不足道。
【解决方案2】:

你可以这样做:

var shortest = myArray.reduce(function(p,c) {return p.length>c.length?c:p;},{length:Infinity});

这使用内部循环,因此比手动运行自己的循环更快,但需要 shim 才能在旧浏览器中工作。

【讨论】:

  • i==0 有什么用?无论如何,您都没有传递 init 参数。
  • 需要什么垫片?减少功能? “旧浏览器”到底是什么意思?
  • 我找到了我自己问题的答案:Array.reduce 在任何早于 9 的 IE、早于 3 的 FireFox 和早于 4 的 Safari 中都不起作用。
  • @Bergi 因为您要寻找最短的,所以 init 参数必须是一个数组,例如 arr.length === Infinity。显然,这是不可能的,因此需要一些技巧来模拟第一步。
  • @Kolink:但是如果你明确地想要跳过它,你仍然需要传入一些 init 参数。如果没有提供 init 参数,JavaScript 的 fold 就像 fold1 一样工作,因此您实际上跳过了 myArray[0]。所以删除i==0||,并可选择传递{length:-Infinity}(如果myArray 为空,则会有所不同)
【解决方案3】:

您正在寻找使用 max 或 min 的方式如下所示。

Math.max.apply(Math, $.map(array, function (index) { return index.length }));

诀窍是映射到内部数组长度属性。

【讨论】:

  • 那么最短的值是怎么得到的呢?
  • @Vatev: array.filter(function(a){return a.length==maxlength;}) :-)
  • 是的,这就是我试图实现 Resig 的示例。
猜你喜欢
  • 2016-04-26
  • 2020-08-11
  • 2021-05-20
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
  • 2016-11-07
相关资源
最近更新 更多