我需要以下帮助:
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
感谢您的帮助。
答案 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)
。
如果你是新手,这似乎有点奇怪,但通过一些练习,你可以得到它。我建议通过几个资源:
++
++
运算符神话和最佳做法的简短description @Optional()
运算符