List.assoc的OCaml复杂性

List.assoc的OCaml复杂性,ocaml,complexity-theory,lookup,Ocaml,Complexity Theory,Lookup,在OCaml的列表模块中,如何实现:val assoc:'a->('a*'b)List->'b,因此,此操作的复杂性是什么?是否有隐藏在幕后的hashtbl?代码可在此处在线获取: 正如您所看到的,它被实现为对列表的线性搜索。代码可在此处在线获取: 正如您所看到的,它被实现为列表上的线性搜索。搜索是线性的。类型('a*'b)列表是显式的,不显示哈希表。assoc是否会从构建哈希表中获益?(否)关联列表是不可变的,可通过共享公共尾部来隐藏以前的值。假设您想临时将一个键绑定到一个值,您只需要将新条目

在OCaml的列表模块中,如何实现:
val assoc:'a->('a*'b)List->'b
,因此,此操作的复杂性是什么?是否有隐藏在幕后的hashtbl?

代码可在此处在线获取:


正如您所看到的,它被实现为对列表的线性搜索。

代码可在此处在线获取:


正如您所看到的,它被实现为列表上的线性搜索。

搜索是线性的。类型
('a*'b)列表是显式的,不显示哈希表。
assoc
是否会从构建哈希表中获益?(否)关联列表是不可变的,可通过共享公共尾部来隐藏以前的值。假设您想临时将一个键绑定到一个值,您只需要将新条目放在现有列表的前面。哈希表是O(1),列表是O(n),但对于小的n,差异可以忽略不计。搜索是线性的。类型
('a*'b)列表是显式的,不显示哈希表。
assoc
是否会从构建哈希表中获益?(否)关联列表是不可变的,可通过共享公共尾部来隐藏以前的值。假设您想临时将一个键绑定到一个值,您只需要将新条目放在现有列表的前面。哈希表是O(1),列表是O(n),但对于小的n,差异可以忽略不计。
let rec assoc x = function
    [] -> raise Not_found
  | (a,b)::l -> if compare a x = 0 then b else assoc x l