Erlang展平函数时间复杂度

Erlang展平函数时间复杂度,erlang,time-complexity,flatten,Erlang,Time Complexity,Flatten,我需要以下方面的帮助: flatten ([]) -> []; flatten([H|T]) -> H ++ flatten(T). 输入列表包含其他长度不同的列表 例如: flatten([[1,2,3],[4,7],[9,9,9,9,9,9]]). 这个函数的时间复杂度是多少? 为什么 我得到了O(n),其中n是输入列表中的许多元素 例如: flatten([[1,2,3],[4,7],[9,9,9,9,9,9]]) n=3 flatten([[1,2,3],[4,

我需要以下方面的帮助:

flatten ([]) -> [];

flatten([H|T]) -> H ++ flatten(T).
输入列表包含其他长度不同的列表

例如:

flatten([[1,2,3],[4,7],[9,9,9,9,9,9]]).
这个函数的时间复杂度是多少? 为什么

我得到了O(n),其中n是输入列表中的许多元素

例如:

flatten([[1,2,3],[4,7],[9,9,9,9,9,9]])    n=3

flatten([[1,2,3],[4,7],[9,9,9,9,9,9],[3,2,4],[1,4,6]])    n=5

谢谢你的帮助

首先,我不确定您的代码是否能正常工作,至少不能像标准库那样工作。您可以将您的函数与
列表:展平/1
进行比较,并可能改进您的实现。尝试将
[a[b,c]]
[a]、[b[c]]、[d]]
等列表作为输入,并验证是否返回了预期的结果

关于复杂性,由于该语言的
++
运算符和函数(不可变)性质,它不太复杂。Erlang中的所有列表都是链表(不像C++中的数组),您不能只在一个列表的末尾添加一些内容而不修改它;在它指向列表末尾之前,现在您希望它链接到其他内容。同样,由于它不是可变语言,您必须复制
++
运算符左侧的整个列表,这增加了该运算符的复杂性

您可以说
A++B
的复杂度是
length(A)
,它使函数的复杂度稍微大一点。它将类似于
length(FirstElement)+(lenght(FirstElement)+length(SecondElement))+…
直到(没有)last,经过一些数学运算,它可以简化为
(n-1)*1/2*k*k
,其中
n
是元素的数量,
k
是元素的平均长度。或
O(n^3)

如果你是新手,这可能看起来有点奇怪,但通过一些练习,你可以掌握它。我建议使用一些资源:

  • 好的列表及其创建方法
  • 关于带有DODO零件的文档
  • 缺少
    ++
    操作员神话和最佳实践
  • 关于递归和尾部递归以及使用
    ++
    运算符的示例