关于来自noobie功能程序员的列表访问的问题

时间:2011-05-14 06:31:13

标签: data-structures haskell programming-languages functional-programming ocaml

这可能是一个愚蠢而明显的问题,但为什么列表访问算法示例在线性时间内实现?据我所知,大多数应用程序涉及遍历列表而不是随机访问它们,但是如果要在随机访问的列表上执行访问会怎么样?

2 个答案:

答案 0 :(得分:10)

因为列表是按照设计的线性结构。它们是规范的递归数据类型,定义为:

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

即空列表或cons节点,由一个元素和一个尾部组成,它也是一个列表。

这种结构与数学中的归纳定义完全对应,相应地,将许多函数写成简单的递归调用变得微不足道。

然而,递归数据类型不允许在非线性时间内随机访问。为此你需要硬件支持(我们都有),以及更复杂的数据类型(或者不太复杂,取决于你的观点)。

摘要:列表是计算机科学将归纳编码为递归数据结构。它是基础,你需要它,但它不会随机访问。

答案 1 :(得分:9)

Haskell列表对应于命令式语言中的链接列表;它们本质上是顺序的,因为你只能访问头部并需要遍历以找到其他元素。

如果您想要随机访问,则应选择其他一些数据类型。也许来自Data.Array或Data.IntMap。