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;
}
正如注释中所指出的,由于每个元素实际上只被触及一次,时间复杂度直观地为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)
来自push
ing2结果,这是两个长度n/2
的数组。
主定理指出,在这种情况下T(N)=O(N log N)
,而不是像预期的那样O(N)
。
1)非平凡意味着没有元素被不必要地包装,例如[[a]]]
.
2)这隐含地假定k
push操作是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在某种技术中实现了时间复杂性,我正在试图确定这些技术的时间复杂性。