【问题标题】:Is there a more efficient algorithm to flatten an array?有没有更有效的算法来展平数组?
【发布时间】:2017-02-11 17:16:03
【问题描述】:

我知道使用 递归 方法来展平嵌套数组。 stackoverflow 上有几种解决方案(javajavascript - 一些使用内置库)。

但是这些解决方案的时间复杂度是 O(n^2)! 我想知道是否有一种算法可以做得更好。

提前感谢您的帮助!

【问题讨论】:

  • 它们看起来像 O(n),其中 n 是元素的数量。我不知道你会如何变得更好。
  • 你指的是数组的 n 维吗?但如果 n 是元素的数量,则它被认为是 O(n)
  • 您链接的那个 JavaScript 问题中“亚当”的答案是线性的,而不是二次的。 @VinceEmigh 如果在线性时间内完成它是微不足道的,这是不合理的:)
  • @PeterLawrey 使用某种数组连接函数的版本并不是真正的线性,但是如果您忽略动态大小数组的成本,通过构建单个累加器数组来实现它是线性的。

标签: javascript java arrays algorithm


【解决方案1】:

您要么弄错了,要么将 n 定义为要处理的元素数量的平方根。

数组展平问题的所有合理解决方案都是 O(n),其中 n 取决于元素的总数(因为本质上,您需要扫描所有元素,每个元素只扫描一次)。扁平化数组不是算法问题,只是将其放入“优雅”的 sn-p 中的问题。

【讨论】:

  • 我明白了。如果我错了,请纠正我,但可以肯定地说它是伪多项式吗?
  • @KarthikVasishta big-O 始终是多项式的最高阶。
  • 谢谢@PeterLawrey
  • “您需要将它们全部扫描,每个只扫描一次。对于 Java 来说,情况并非如此。由于 Java 数组是固定大小的,因此您必须预先扫描数组以找到结果的元素总数,然后才能开始构建它。仍然O(n)
  • @Andreas:我很欣赏你的挑剔 :-) 但是如果我们在这个级别上解释事情,这个问题就不是真的有效 - Javascript 中没有“数组”(除非你计算 Typed Arrays API,它不是 ECMA 的一部分)——因此,仅将 N 个元素添加到 javascript“数组”的成本可能会让我们绕过 NlogN(以支付增长数组的费用)。在我的回复中,我假设 Javascript“数组”的等价物是 Java 的 LinkedList :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多