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)
如果你是新手,这可能看起来有点奇怪,但通过一些练习,你可以掌握它。我建议使用一些资源:
- 好的列表及其创建方法
- 关于带有DO和DO零件的文档
- 缺少
操作员神话和最佳实践++
- 关于递归和尾部递归以及使用
运算符的示例++