当前位置: 首页 > 知识库问答 >
问题:

反向深度展平的时间复杂度

隗轶
2023-03-14
const arr = [
  [14, [45, 60], 6, [47, [1, 2, [14, [45, 60], 6, [47, [1, 2]], 9]]], 9],
];

function flatten(items) {
  const flat = [];

  items.forEach(item => {
    if (Array.isArray(item)) {
      flat.push(...flatten(item));
    } else {
      flat.push(item);
    }
  });

  return flat;
}

共有1个答案

郦祺
2023-03-14

正如注释中所指出的,由于每个元素实际上只被触及一次,时间复杂度直观地为O(N)

但是,因为每个对flatten的递归调用都会创建一个新的中间数组,所以运行时在很大程度上依赖于输入数组的结构。

这种情况的一个非平凡的1示例是,数组的组织类似于完整的二叉树

[[[a,b],[c,d]],[[e,f],[g,h]]],[[i,j],[k,l]],[[m,n],[o,p]]]

               |
        ______ + ______
       |               |
    __ + __         __ + __
   |       |       |       |
 _ + _   _ + _   _ + _   _ + _
| | | | | | | | | | | | | | | | 
a b c d e f g h i j k l m n o p

时间复杂度递推关系为:

T(n) = 2 * T(n / 2) + O(n)

其中2*T(n/2)来自对flatten子树的递归调用,而O(n)来自pushing2结果,这是两个长度n/2的数组。

主定理指出,在这种情况下T(N)=O(N log N),而不是像预期的那样O(N)

1)非平凡意味着没有元素被不必要地包装,例如[[a]]].

2)这隐含地假定kpush操作是o(k)摊销的,这不是标准所保证的,但对于大多数实现来说仍然是正确的。

“true”O(N)解决方案将直接追加到最终输出数组,而不是创建中间数组:

function flatten_linear(items) {
  const flat = [];

  // do not call the whole function recursively
  // ... that's this mule function's job
  function inner(input) {
     if (Array.isArray(input))
        input.forEach(inner);
     else
        flat.push(input);
  }

  // call on the "root" array
  inner(items);  

  return flat;
}

对于前面的示例,递归变为T(n)=2*T(n/2)+O(1),这是线性的。

同样假设1)和2)。

 类似资料:
  • 问题内容: 我已经看到了此页面 https://wiki.python.org/moin/TimeComplexity, 但是我没有看到列表中的函数。什么是时间的时间复杂度的? 我对时间的实验表明,它适用于较大的尺寸。有人可以确认吗? timeit反转大小列表的时间 问题答案: 是的,您是对的,它是O(n),其中n- 列表长度。在此处查找更多信息:https : //www.ics.uci.edu

  • 主要内容:时间复杂度,空间复杂度《 算法是什么》一节提到,解决一个问题的算法可能有多种,这种情况下,我们就必须对这些算法进行取舍,从中挑选出一个“最好”的。 算法本身是不分“好坏”的,所谓“最好”的算法,指的是最适合当前场景的算法。挑选算法时,主要考虑以下两方面因素: 执行效率:根据算法所编写的程序,执行时间越短,执行效率就越高; 占用的内存空间:不同算法编写出的程序,运行时占用的内存空间也不相同。如果实际场景中仅能使用少量的内

  • 有人能帮我了解一下这个代码片段的时间和空间复杂性吗?请参考leetcode问题-单词中断II。给定一个非空字符串s和一个包含非空单词列表的字典单词dict,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。返回所有这些可能的句子。

  • 假设T是具有n个节点和高度h的二叉查找树。T的每个节点x存储一个实数x。键。给出以下算法Func1(T. root)的最坏情况时间复杂度。你需要证明你的答案。 x.left() 对于最坏情况下的运行时,我认为这将是O(树的高度),因为这基本上类似于最小()或最大()二元搜索树算法。然而,它是递归的,所以我对是否将O(h)作为最坏的运行时编写有点犹豫。 当我考虑它时,最坏的情况是如果函数执行if(s

  • 问题内容: 是Java中的数组还是列表?什么是get操作的时间复杂度,是它还是? 问题答案: 一个在Java是一种由一个支持。 该方法是恒定时间的操作。 直接从Java库获取以下代码: 基本上,它只是直接从后备数组中返回一个值。()也是固定时间)

  • Java中Math.sqrt实现的时间复杂性是什么?Java在某种技术中实现了时间复杂性,我正在试图确定这些技术的时间复杂性。