Erlang压扁功能时间复杂度

时间:2017-09-08 08:58:33

标签: 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,7],[9,9,9,9,9,9],[3,2,4],[1,4,6]])    n=5

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

首先,我不确定您的代码是否有效,至少不是标准库的工作方式。您可以将您的函数与lists:flatten/1进行比较,并可能改进您的实现。尝试使用[a, [b, c]][[a], [b, [c]], [d]]等列表作为输入,并验证您是否返回了预期。

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

你可以说A ++ B的复杂性是length(A),它会使你的函数的复杂性变得更大。它会像length(FirstElement) + (lenght(FirstElement) + length(SecondElement)) + ....最后(没有)最后一样,经过一些数学魔术可以简化为(n -1) * 1/2 * k * k,其中n是元素数量,k是平均值元素的长度。或O(n^3)

如果你是新手,这似乎有点奇怪,但通过一些练习,你可以得到它。我建议通过几个资源:

  • 列表的explanation好以及如何创建
  • list handling DO 部分的文档
  • ++ ++运算符神话和最佳做法的简短description
  • Chapter关于使用@Optional()运算符
  • 的示例进行递归和尾递归