OCaml中List.nth的复杂性是什么?我们能在O(1)中找到OCaml中的第n个元素吗?

OCaml中List.nth的复杂性是什么?我们能在O(1)中找到OCaml中的第n个元素吗?,list,ocaml,selection,time-complexity,List,Ocaml,Selection,Time Complexity,我发现OCaml列表模块的手册没有说明List.nth是如何工作的。它的成本是O(1)还是O(n),就像一些简单的递归实现一样。如果List.nth是O(n),我们可以在OCaml中编写一个函数来查找O(1)时间内的第n个元素吗?标准列表是“单独链接的”,因此它将始终是O(n)。它是O(n) 只要它是一个标准链表,在任何语言中都找不到O(1)中的第n个元素。1)如果我们查看list.nth在(第193到200行)中的实现,我们会看到它调用一个尾部递归函数,该函数使用cons(::)操作符重复提取

我发现OCaml列表模块的手册没有说明List.nth是如何工作的。它的成本是O(1)还是O(n),就像一些简单的递归实现一样。如果List.nth是O(n),我们可以在OCaml中编写一个函数来查找O(1)时间内的第n个元素吗?

标准列表是“单独链接的”,因此它将始终是O(n)。

它是O(n)

只要它是一个
标准链表
,在任何语言中都找不到O(1)中的第n个元素。

1)如果我们查看list.nth在(第193到200行)中的实现,我们会看到它调用一个尾部递归函数,该函数使用cons(::)操作符重复提取head元素。因此,我们可以确定它确实是O(n)


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

那么,如果我想在O(1)中找到第n个元素,我们应该使用什么类型?@Indicator数组。这就是说,您可能首先要考虑您的用例是否真的需要随机访问。随机访问是否会为函数式编程语言带来额外的成本?@指示符数组在OCaml中与任何其他语言相同,因此,没有。列表(在开始时)可以在O(1)空间和时间中扩展,数组在这两种语言中都是O(n)。如果像在函数式编程中经常做的那样,以增量方式(归纳式)构造容器,则列表的容器总数为O(n),而普通数组的容器总数为O(n^2)。相关的列表允许在不同的容器/扩展之间共享(在空间中),而阵列不允许。