Arrays 哈斯克尔。为什么数组比列表快?
我在学习哈斯克尔。我有下一个问题: 列表类型是Haskell中的基本类型。Arrays 哈斯克尔。为什么数组比列表快?,arrays,performance,list,data-structures,haskell,Arrays,Performance,List,Data Structures,Haskell,我在学习哈斯克尔。我有下一个问题: 列表类型是Haskell中的基本类型。 Haskell中的数组基于列表。这是索引列表[Ix a]和表-对列表[(Ix a,值)]显示的函数。如果数组中使用列表,为什么数组比列表快?恐怕你错了 Haskell中有很多数组,但据我所知,它们都是在连续内存数组之上实现的。因此,有可能O(1)访问元素进行读取 数组和列表之间的相似性只存在于操作集级别。恐怕你错了 Haskell中有很多数组,但据我所知,它们都是在连续内存数组之上实现的。因此,有可能O(1)访问元素进行
Haskell中的数组基于列表。这是索引列表[Ix a]和表-对列表[(Ix a,值)]显示的函数。如果数组中使用列表,为什么数组比列表快?恐怕你错了 Haskell中有很多数组,但据我所知,它们都是在连续内存数组之上实现的。因此,有可能O(1)访问元素进行读取
数组和列表之间的相似性只存在于操作集级别。恐怕你错了 Haskell中有很多数组,但据我所知,它们都是在连续内存数组之上实现的。因此,有可能O(1)访问元素进行读取
数组和列表之间的相似性只存在于操作集级别。数组不是基于列表的,它们的实现类似于其他编程语言,具有连续的内存区域
创建它们最常用的方法是,数组函数将索引、值对列表作为参数,当您打印它们时,它们也会像这样的列表一样显示。这是因为Haskell中的数组不仅可以由整数索引,还可以由实现Ix typeclass的任何东西索引,例如(Int,Int)-对、布尔、Char和许多其他版本。因此[(索引,值)]表示法实际上是唯一明智、一致的方法,可以像Haskell中的数组一样显示数组。数组是而不是基于列表,它们的实现与其他编程语言类似,具有连续的内存区域
创建它们最常用的方法是,数组函数将索引、值对列表作为参数,当您打印它们时,它们也会像这样的列表一样显示。这是因为Haskell中的数组不仅可以由整数索引,还可以由实现Ix typeclass的任何东西索引,例如(Int,Int)-对、布尔、Char和许多其他版本。因此[(索引,值)]表示法实际上是唯一明智、一致的方法,可以像Haskell中的表示法一样显示数组。数组不是基于列表的。列表是一种常规的递归数据类型:
data [] a = [] | a : [a]
而各种阵列库,如uvector、array、vector、carray、hmatrix,则使用低级读写操作来表示阵列接口。除了两种数据结构都可以表示序列之外,没有什么相似之处,尽管它们的复杂性不同。数组不是基于列表的。列表是一种常规的递归数据类型:
data [] a = [] | a : [a]
而各种阵列库,如uvector、array、vector、carray、hmatrix,则使用低级读写操作来表示阵列接口。除了两种数据结构都可以表示序列之外,没有什么相似之处,尽管它们的复杂性不同。什么操作更快?您如何知道它更快?例如,添加到(数组/列表)的末尾,或获取i元素。无论是
Data.array
还是Data.list
都需要“复制所有内容”才能添加到(数组/列表)的末尾。是的,Data.array.MArray
都有固定的边界。如果要更改元素的数量,必须创建一个新数组。哪些操作更快?您如何知道它更快?例如,添加到(数组/列表)的末尾,或获取i元素。无论是Data.array
还是Data.list
都需要“复制所有内容”才能添加到(数组/列表)的末尾。是的,Data.array.MArray
都有固定的边界。如果要更改元素的数量,必须创建一个新数组。因此,不要在haskell上设计更快的数据结构。所有好的“数据结构”都是用其他语言编写的。可以是С\С++。我说的对吗?@Anton:不,很棒的数据结构(如手指树)可以在纯Haskell中实现。推荐阅读:因此,不要在Haskell上设计更快的数据结构。所有好的“数据结构”都是用其他语言编写的。可以是С\С++。我说得对吗?@Anton:不,可怕的数据结构(如手指树)可以在纯Haskell中实现。推荐阅读:Haskell不是具有连续内存区域的语言吗?@Anton:Haskell'98语言规范要求存在Array
模块(以及相关的类、类型和函数)。除了“程序员可以合理地期望快速访问组件”之外,它没有提到实现,但这通常是一个连续随机存取内存的接口。haskell语言不是具有连续内存区域吗?@Anton:haskell'98语言规范要求存在Array
模块(以及相关的类、类型和函数)。除了“程序员可以合理地期望快速访问组件”之外,它对实现没有任何说明,但这通常被视为连续随机访问内存的接口。