list - 为什么 Haskell 列表的 `++` 是递归实现的并且花费 O(n) 时间?

标签 list pointers haskell recursion functional-programming

据我了解,Haskell 中的列表类似于 C 语言中的链接列表。

所以对于下面的表达式:

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) 中轻松完成时间..

  • 有人对此有想法吗?谢谢!

    最佳答案

    这几乎就是递归解决方案所做的。是a的复制品这需要 O(n) (其中 na 的长度。b 的长度不会影响复杂性)。

    复制 n 的列表确实没有“技巧”。 O(1) 时间内的元素。

    关于list - 为什么 Haskell 列表的 `++` 是递归实现的并且花费 O(n) 时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30692645/

    相关文章:

    python - 在python中将文件作为列表读取

    python - 在列表中的确切位置插入一个元素,而无需在 Python 中调整数组大小?

    python - 在C++中找到满足给定条件的 vector 元素的位置

    haskell - 简单的应用仿函数示例

    haskell - 如何将 CheckingFuelMonad 与 Hoopl 中的 State monad 结合起来?

    python - 将列表的值插入到mysql Python的不同列中

    python - 从python中的字符串中获取特定的子字符串

    arrays - 如何在 Haskell 中打印列表的内存地址

    Python YAML 转储指针引用

    haskell - 为什么有一个用于 exceptT 的 MonadMask 实例?