我在某处读到 Hashtbl.create 的复杂性是 O(nlogn)。
我觉得这很奇怪,因为 Hashtbl 是作为数组实现的,而 Array.create 的复杂度为 O(n)。所以我查看了源代码:
let rec power_2_above x n =
if x >= n then x
else if x * 2 > Sys.max_array_length then x
else power_2_above (x * 2) n
let create ?(random = !randomized) initial_size =
let s = power_2_above 16 initial_size in
let seed = if random then Random.State.bits (Lazy.force prng) else 0 in
{ initial_size = s; size = 0; seed = seed; data = Array.make s Empty }
在我看来,它首先找到*initial_size* 之上的最小 2 次方,然后从中创建一个数组。这听起来不像O(n logn)......我在想像O(2 **(logn +1))这样的东西。
有任何想法吗?
谢谢。