OCaml中List.nth的复杂性是多少?我们可以在O(1)中找到OCaml中的第n个元素吗?

时间:2014-04-01 21:06:01

标签: list ocaml selection time-complexity

我发现OCaml List模块的手册没有说明List.nth的作用。它是否像一些简单的递归实现一样花费O(1)或O(n)。如果List.nth是O(n),我们可以编写一个函数来在OCaml的O(1)时间内找到第n个元素吗?

3 个答案:

答案 0 :(得分:8)

标准列表是"单链接",所以它总是O(n)。

答案 1 :(得分:3)

O(n)

只要它是standard linked-list,就无法在任何语言中找到O(1)中的第n个元素。

答案 2 :(得分:1)

1)如果我们在https://github.com/janestreet/core_kernel/blob/master/lib/core_list.ml(第193到200行)中查看List.nth的实现,我们会看到它调用尾递归函数,该函数使用cons(::)运算符重复提取头部元件。因此,我们可以肯定它确实是O(n)。

2)如果我们使用的列表很大,我们可以使用to_array将它们转换为数组(val to_array:' at - >'数组)并使用这些数组进行更有效的查找。但是这种方法只适用于我们首先构建整个列表然后执行查找的非常简单的情况。我想将这些数组视为列表的索引;就像在关系数据库实现中一样,我们必须在基础数据发生变化时更新索引。