Algorithm 我的哈希表是在O(n)时间内创建的吗?
我试图在O(n)时间内(n是字符串的长度)在OCaml中创建一个哈希表 这是我的密码:Algorithm 我的哈希表是在O(n)时间内创建的吗?,algorithm,ocaml,hashtable,big-o,Algorithm,Ocaml,Hashtable,Big O,我试图在O(n)时间内(n是字符串的长度)在OCaml中创建一个哈希表 这是我的密码: let fill_table set my_hash = for i = 0 to ((String.length set) - 1) do Hashtbl.add my_hash (Char.code set.[i]) (set.[i]) done ;; 其中,set是一个字符串(ex/“12345”),my_散列先前启动为: let my_hash = Hashtbl.create 2
let fill_table set my_hash =
for i = 0 to ((String.length set) - 1) do
Hashtbl.add my_hash (Char.code set.[i]) (set.[i])
done
;;
其中,set是一个字符串(ex/“12345”),my_散列先前启动为:
let my_hash = Hashtbl.create 255 (* Highest ASCII number possible *)
“填充表格”功能是否在O(n)时间内运行?请让我知道。谢谢 > P>因为您的表从不超过255个条目,所以您可以合理地认为时间是字符串长度的线性。 但是,您应该意识到,如果将旧值的新映射添加到OCaml哈希表中,它会将两个条目都保留在表中。这很奇怪,但OCaml哈希表一直都是这样工作的。在添加新条目之前,您可能需要检查表中是否有条目
# let h = Hashtbl.create 255;;
val h : ('_a, '_b) Hashtbl.t = <abstr>
# Hashtbl.add h 32 ' ';;
- : unit = ()
# Hashtbl.add h 32 ' ';;
- : unit = ()
# Hashtbl.iter (fun k v -> Printf.printf "saw %d\n" k) h;;
saw 32
saw 32
- : unit = ()
#让h=Hashtbl.create 255;;
值h:(“a”,“b”)Hashtbl.t=
#Hashtbl.add h 32'';;
-:单位=()
#Hashtbl.add h 32'';;
-:单位=()
#Hashtbl.iter(fun k v->Printf.Printf“saw%d\n”k)h;;
锯32
锯32
-:单位=()
作为旁白,我看不出有多少理由将字符代码映射到字符。您可以使用
Char.chr
在没有哈希表的情况下获得此结果,如果您添加字符串中所有字符都是唯一的条件(否则您的代码就更没有意义),那么此代码将在O(1)中运行,因为n@gosvonbrederlown“如果您添加字符串中所有字符都是唯一的条件”