binary heap
OCamlのスキルを磨くために、OCamlに使用リストを実装しています。
リストを使うのはとても難しいと感じており、2日間苦労した後、提案やヒントを得るためにここに来なければなりません。
これが私のこれまでの考えです
明らかに、array based
listを使用して実装するために元のアルゴリズムを使用することはできません。
私が利用しようとしているのはですbinary tree
。私はinvariant
、ノードがそのレベルよりも低いノードよりも大きくなければならないことを維持しています。
insert
正しいかどうかはわかりませんが、実装方法を大まかに理解しました。
二分木の場合、各ノードにはがあり、two children
これはノードの総数です。これは、ツリーのバランスを取るために使用されます。value
size n
offsprings
n
を挿入するときx
、私はノードと比較します(ルートから、再帰的に)。仮定x < the value of the node
し、次に
ノードの子の一方または両方がである場合、そのリーフの場所にLeaf
を挿入します。x
ノードの子の1つがLeafの場合none
、nが小さい子を選択してからrecursively insert
。
これが私のコードです
type 'a heap =
| Node of 'a * 'a heap * 'a heap * int
| Leaf
exception EmptyHeapException
let create_heap () = Leaf;;
let rec insert x = function
| Leaf -> Node (x, Leaf, Leaf, 0)
| Node (v, l, r, n) ->
let (stay, move) = if x > v then (x, v) else (v, x)
in
match (l, r) with
| (Leaf, Leaf) ->
Node (stay, Node (move, Leaf, Leaf, 0), Leaf, 1)
| (Leaf, _) ->
Node (stay, Node (move, Leaf, Leaf, 0), r, n+1)
| (_, Leaf) ->
Node (stay, l, Node (move, Leaf, Leaf, 0), n+1)
| (Node (_, _, _, n1), Node (_, _, _, n2)) ->
if n1 <= n2 then
Node (stay, (insert move l), r, n1+1)
else
Node (stay, l, (insert move r), n2+1);;
わかりました、次の質問があります。
- 私は正しい方向に向かっていますか?私の考えや実装は正しいですか?
- 関数の実装に行き詰まり
get_top
ます。続行する方法がわかりません。ヒントはありますか? - ocamlバッテリーは効率的なbatHeap.mlを実装しました。見てみましたが、自分とは全く違う感じで理解できません。誰かが私がそれを理解するのを手伝ってくれる?