为什么找不到我在 HashTable 中的条目?
Why is my entry in the HashTable not found?
我有以下代码:
let to_permutation pairs max_el =
let tbl = Hashtbl.create 100 in
let rec aux i collector =
if i > max_el then collector
else
match Hashtbl.find_opt tbl i with
None ->
ignore (Printf.printf "NOT found \n");
Hashtbl.add tbl i 1;
aux (i + 1) (List.append (List.hd collector) [List.assoc i pairs] :: List.tl collector)
| Some _ ->
ignore (Printf.printf "Found\n");
aux (i + 1) (List.append [[]] collector)
in
aux 1 [[]];;
它应该做什么:当我给函数一个成对列表时,我希望它为我生成映射整数的循环(基于成对。)
示例:to_permutation [(1, 6); (2, 3); (3, 5); (4, 1); (5, 2); (6, 4)] 6;;
应该 return 类似于 [[1; 6; 4]; [2; 3; 5]];
。
但是我什至没有接近这个,因为检查我是否已经访问过一个元素(并因此检测到一个循环)的查找失败了。程序输出:
to_permutation [(1, 6); (2, 3); (3, 5); (4, 1); (5, 2); (6, 4)] 6;;
NOT found
NOT found
NOT found
NOT found
NOT found
NOT found
- : int list list = [[6; 3; 5; 1; 2; 4]]
尽管我插入到散列 table 中,但它从未找到任何元素。我做错了什么?
通过调用 aux i
,您维护了 table tbl
仅包含严格低于 i
的键的不变性。因此 find_opt tbl i
始终 return None
,并且在调用 aux (i+1)
之前将 i
键添加到 tbl
以保留前面所述的不变量。
我有以下代码:
let to_permutation pairs max_el =
let tbl = Hashtbl.create 100 in
let rec aux i collector =
if i > max_el then collector
else
match Hashtbl.find_opt tbl i with
None ->
ignore (Printf.printf "NOT found \n");
Hashtbl.add tbl i 1;
aux (i + 1) (List.append (List.hd collector) [List.assoc i pairs] :: List.tl collector)
| Some _ ->
ignore (Printf.printf "Found\n");
aux (i + 1) (List.append [[]] collector)
in
aux 1 [[]];;
它应该做什么:当我给函数一个成对列表时,我希望它为我生成映射整数的循环(基于成对。)
示例:to_permutation [(1, 6); (2, 3); (3, 5); (4, 1); (5, 2); (6, 4)] 6;;
应该 return 类似于 [[1; 6; 4]; [2; 3; 5]];
。
但是我什至没有接近这个,因为检查我是否已经访问过一个元素(并因此检测到一个循环)的查找失败了。程序输出:
to_permutation [(1, 6); (2, 3); (3, 5); (4, 1); (5, 2); (6, 4)] 6;;
NOT found
NOT found
NOT found
NOT found
NOT found
NOT found
- : int list list = [[6; 3; 5; 1; 2; 4]]
尽管我插入到散列 table 中,但它从未找到任何元素。我做错了什么?
通过调用 aux i
,您维护了 table tbl
仅包含严格低于 i
的键的不变性。因此 find_opt tbl i
始终 return None
,并且在调用 aux (i+1)
之前将 i
键添加到 tbl
以保留前面所述的不变量。