我试图在O(n)时间内在OCaml中创建Hashtable(n是字符串的长度)。
这是我的代码:
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_hash以前是以:
启动的let my_hash = Hashtbl.create 255 (* Highest ASCII number possible *)
'fill_table'函数是否在O(n)时间内运行?请告诉我。谢谢!
答案 0 :(得分:0)
由于你的表永远不会超过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 = ()
作为旁注,我没有太多理由将字符代码映射到角色。您可以使用Char.chr
在没有哈希表的情况下获得此内容。