【问题标题】:Haskell. Why are arrays faster than lists?哈斯克尔。为什么数组比列表快?
【发布时间】:2010-12-07 00:43:02
【问题描述】:

我正在学习 Haskell。我有下一个问题:

List 类型是 Haskell 中的基本类型。 Haskell 中的数组是基于列表的。这是索引 [Ix a] 的列表和按表格呈现的函数 - 对列表 [(Ix a,Value)]。如果数组内部使用列表,为什么数组比列表快?

【问题讨论】:

  • 哪些操作更快?你怎么知道它更快?
  • 例如添加到 (array/list) 的末尾,或者获取 i 元素。
  • Data.ArrayData.List 都需要“复制所有内容”才能添加到(数组/列表)的末尾。
  • 是的,Data.Array.MArray 有固定的界限。如果你想改变元素的数量,你必须创建一个新数组。

标签: arrays performance list data-structures haskell


【解决方案1】:

数组不是基于列表的。列表是一种常规的递归数据类型:

data [] a = [] | a : [a]

虽然各种数组库,如 uvector、array、vector、carray、hmatrix,使用低级读写操作来呈现数组的接口。除了两种数据结构都可以表示序列之外,没有相似之处,尽管复杂度不同。

【讨论】:

    【解决方案2】:

    数组不是基于列表,它们的实现方式与其他编程语言类似,具有连续的内存区域。

    创建它们的最常用方法是,array 函数将索引、值对的列表作为参数,当您打印它们时,它们也会像这样的列表一样显示。这是因为 Haskell 中的数组不仅可以通过整数索引,还可以通过任何实现 Ix 类型类的索引,例如 (Int, Int)-pairs、Booleans、Char's 和许多其他版本。因此,[(index, value)] 表示确实是显示与 Haskell 中的数组一样通用的数组的唯一合理、一致的方式。

    【讨论】:

    • haskell 不是具有连续内存区域的语言吗?
    • @Anton:Haskell'98 语言规范要求存在Array 模块(以及相关的类、类型和函数)。除了“程序员可能合理地期望快速访问组件”之外,它没有说明实现,但这通常是连续随机存取存储器的接口。
    【解决方案3】:

    恐怕你错了。

    Haskell 中有several implementations 的数组,但据我了解,它们都是在连续的内存数组之上实现的。因此,有可能 O(1) 访问元素以进行读取。

    数组和列表的相似之处只存在于操作集层面。

    【讨论】:

    • 因此,不要在haskell上设计更快的数据结构。所有用其他语言编写的好的“数据结构”。可能是С\С++。我说的对吗?
    • @Anton:不,很棒的数据结构(比如手指树)可以在纯 Haskell 中实现。
    • 推荐阅读:books.google.com/…
    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    相关资源
    最近更新 更多