mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 11:15:31 -05:00
bugfixes in BTree (insertion should work now)
This commit is contained in:
parent
84c8295b8e
commit
abef0be6bd
1 changed files with 20 additions and 12 deletions
|
|
@ -114,9 +114,11 @@ module Make(X : ORDERED) = struct
|
||||||
size = 1;
|
size = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
(* slice of [l] starting at indices [i], of length [len] *)
|
(* slice of [l] starting at indices [i], of length [len]. Only
|
||||||
|
copies inner children (between two keys in the range). *)
|
||||||
let _make_slice l i len =
|
let _make_slice l i len =
|
||||||
assert (len>0);
|
assert (len>0);
|
||||||
|
assert (i+len<=l.size);
|
||||||
let k = l.keys.(i) and v = l.values.(i) in
|
let k = l.keys.(i) and v = l.values.(i) in
|
||||||
let l' = {
|
let l' = {
|
||||||
keys = Array.make _len_node k;
|
keys = Array.make _len_node k;
|
||||||
|
|
@ -138,6 +140,7 @@ module Make(X : ORDERED) = struct
|
||||||
| E -> ()
|
| E -> ()
|
||||||
| L n ->
|
| L n ->
|
||||||
for i=0 to n.size-1 do
|
for i=0 to n.size-1 do
|
||||||
|
assert (n.children.(i) = E);
|
||||||
acc := f !acc n.keys.(i) n.values.(i)
|
acc := f !acc n.keys.(i) n.values.(i)
|
||||||
done
|
done
|
||||||
| N n ->
|
| N n ->
|
||||||
|
|
@ -145,7 +148,7 @@ module Make(X : ORDERED) = struct
|
||||||
_fold f acc n.children.(i);
|
_fold f acc n.children.(i);
|
||||||
acc := f !acc n.keys.(i) n.values.(i);
|
acc := f !acc n.keys.(i) n.values.(i);
|
||||||
done;
|
done;
|
||||||
acc := f !acc n.keys.(n.size) n.values.(n.size)
|
_fold f acc n.children.(n.size)
|
||||||
|
|
||||||
let fold f acc t =
|
let fold f acc t =
|
||||||
let acc = ref acc in
|
let acc = ref acc in
|
||||||
|
|
@ -190,8 +193,11 @@ module Make(X : ORDERED) = struct
|
||||||
|
|
||||||
(* sorted insertion into a leaf that has room and doesn't contain the key *)
|
(* sorted insertion into a leaf that has room and doesn't contain the key *)
|
||||||
let _insert_sorted l k v i =
|
let _insert_sorted l k v i =
|
||||||
|
assert (not (_full_node l));
|
||||||
(* make room by shifting to the right *)
|
(* make room by shifting to the right *)
|
||||||
let len = l.size - i in
|
let len = l.size - i in
|
||||||
|
assert (i+len<=l.size);
|
||||||
|
assert (len>=0);
|
||||||
Array.blit l.keys i l.keys (i+1) len;
|
Array.blit l.keys i l.keys (i+1) len;
|
||||||
Array.blit l.values i l.values (i+1) len;
|
Array.blit l.values i l.values (i+1) len;
|
||||||
l.keys.(i) <- k;
|
l.keys.(i) <- k;
|
||||||
|
|
@ -215,27 +221,29 @@ module Make(X : ORDERED) = struct
|
||||||
then (
|
then (
|
||||||
(* split. [k'] and [v']: separator for split *)
|
(* split. [k'] and [v']: separator for split *)
|
||||||
let j = _len_node/2 in
|
let j = _len_node/2 in
|
||||||
let k' = l.keys.(j) in
|
|
||||||
let v' = l.values.(j) in
|
|
||||||
let left = _make_slice l 0 j in
|
let left = _make_slice l 0 j in
|
||||||
let right = _make_slice l (j+1) (_len_node-j-1) in
|
let right = _make_slice l (j+1) (_len_node-j-1) in
|
||||||
(* insert in proper sub-leaf *)
|
(* insert in proper sub-leaf *)
|
||||||
(if i<j
|
(if i+1<j
|
||||||
then _insert_sorted left k v i
|
then _insert_sorted left k v (i+1)
|
||||||
else _insert_sorted right k v (i-j)
|
else _insert_sorted right k v (i-j)
|
||||||
);
|
);
|
||||||
|
let k' = l.keys.(j) in
|
||||||
|
let v' = l.values.(j) in
|
||||||
Split (L left, k', v', L right)
|
Split (L left, k', v', L right)
|
||||||
) else (
|
) else (
|
||||||
(* just insert at sorted position *)
|
(* just insert at sorted position *)
|
||||||
_insert_sorted l k v i;
|
_insert_sorted l k v (i+1);
|
||||||
Add
|
Add
|
||||||
)
|
)
|
||||||
|
|
||||||
let _insert_node n i k v sub1 sub2 =
|
let _insert_node n i k v sub1 sub2 =
|
||||||
assert (not(_full_node n));
|
assert (not(_full_node n));
|
||||||
Array.blit n.keys i n.keys (i+1) (n.size-i);
|
let len = n.size - i in
|
||||||
Array.blit n.values i n.values (i+1) (n.size-i);
|
assert (len>=0);
|
||||||
Array.blit n.children (i+1) n.children (i+2) (n.size-i);
|
Array.blit n.keys i n.keys (i+1) len;
|
||||||
|
Array.blit n.values i n.values (i+1) len;
|
||||||
|
Array.blit n.children (i+1) n.children (i+2) len;
|
||||||
n.keys.(i) <- k;
|
n.keys.(i) <- k;
|
||||||
n.values.(i) <- v;
|
n.values.(i) <- v;
|
||||||
(* erase subtree with sub1,sub2 *)
|
(* erase subtree with sub1,sub2 *)
|
||||||
|
|
@ -334,8 +342,8 @@ module Make(X : ORDERED) = struct
|
||||||
let t = T.of_list (CCList.(1--1000) |> List.map (fun x->x, string_of_int x)) in \
|
let t = T.of_list (CCList.(1--1000) |> List.map (fun x->x, string_of_int x)) in \
|
||||||
T.get 3 t = Some "3"
|
T.get 3 t = Some "3"
|
||||||
let module T = Make(CCInt) in \
|
let module T = Make(CCInt) in \
|
||||||
let t = T.of_list (CCList.(1--1000) |> List.map (fun x->x, string_of_int x)) in \
|
let t = T.of_list (CCList.(1--100) |> List.map (fun x->x, string_of_int x)) in \
|
||||||
T.get 4 t = None
|
T.get 400 t = None
|
||||||
*)
|
*)
|
||||||
|
|
||||||
(* remove the key if present. TODO
|
(* remove the key if present. TODO
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue