【发布时间】:2015-08-21 22:41:37
【问题描述】:
据我了解,Haskell 中的 List 类似于 C 语言中的 Linked-List。
所以对于下面的表达式:
a = [1,2,3]
b = [4,5,6]
a ++ b
Haskell 以这样的递归方式实现它:
(++) (x:xs) ys = x:xs ++ ys
时间复杂度为O(n)..
但是,我想知道为什么我不能更有效地实现++。
最有效的方法可能是这样的:
复制(fork)
a,我们称之为a',在O(1)时间可能会有一些技巧来做到这一点使
a'的最后一个元素指向b的第一个元素。这可以在O(1)时间轻松完成..
有人对此有想法吗?谢谢!
【问题讨论】:
-
我喜欢依赖于“可能有一些技巧可以在恒定时间内做到这一点”的算法。 :)
-
您使用的语言(“指针”、“复制”、“链表”)在 Haskell 语义的上下文中没有多大意义。
[a]根本不是一个链表,尽管它可能类似于 GHC 在内存中的布局方式(或者它可能不是,或者它可能根本不存在于内存中) -
你打算如何在不花费 O(n) 时间的情况下复制 n 个东西?
-
@immibis @jalf 只复制后面要修改的部分,也就是
a的最后一个元素 -
@hanfeisun 但是倒数第二个元素需要指向新的最后一个元素。然后倒数第三个元素需要指向新的倒数第二个元素。
标签: list pointers haskell recursion functional-programming