X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=Parasitemia%2FParasitemiaCore%2FHeap.fs;h=350164bf3ebddac11f3c228f9c6357a0b9dbf10e;hb=b87b35b922551f122228df1fd9c530bbb807935a;hp=c23cdbbcb652e05182f0d9b4b8421d47d05dc283;hpb=97c24aa168f06f507fdff79429038d78a2c33326;p=master-thesis.git diff --git a/Parasitemia/ParasitemiaCore/Heap.fs b/Parasitemia/ParasitemiaCore/Heap.fs index c23cdbb..350164b 100644 --- a/Parasitemia/ParasitemiaCore/Heap.fs +++ b/Parasitemia/ParasitemiaCore/Heap.fs @@ -2,60 +2,52 @@ open System.Collections.Generic -let inline private parent (i: int) : int = (i - 1) / 2 -let inline private left (i: int) : int = 2 * (i + 1) - 1 -let inline private right (i: int) : int = 2 * (i + 1) +let inline private parent (i : int) : int = (i - 1) / 2 +let inline private left (i : int) : int = 2 * (i + 1) - 1 +let inline private right (i : int) : int = 2 * (i + 1) [] type private Node<'k, 'v> = - val mutable key: 'k - val value: 'v + val mutable key : 'k + val value : 'v new (k, v) = { key = k; value = v } - override this.ToString () = sprintf "%A -> %A" this.key this.value + override this.ToString () = sprintf "%O -> %O" this.key this.value /// -/// An heap min or max depending of the comparer. -/// The goal is to have a set of data and be able to get the value associated with the min (or max) key. +/// An heap min or max depending of the given key comparer. +/// The goal is to have a set of data and be able to get the value associated with the min (or max) key value. /// type Heap<'k, 'v> (kComparer : IComparer<'k>) = let a = List>() - let rec heapUp (i: int) = + let rec heapUp (i : int) = let l, r = left i, right i // Is the left child greater than the parent? let mutable max = if l < a.Count && kComparer.Compare(a.[l].key, a.[i].key) > 0 then l else i // Is the right child greater than the parent and the left child? - if r < a.Count && kComparer.Compare(a.[r].key, a.[max].key) > 0 - then + if r < a.Count && kComparer.Compare(a.[r].key, a.[max].key) > 0 then max <- r // If a child is greater than the parent. - if max <> i - then + if max <> i then let tmp = a.[i] a.[i] <- a.[max] a.[max] <- tmp heapUp max // Check the integrity of the heap, use for debug only. - let rec checkIntegrity (i: int) : bool = + let rec checkIntegrity (i : int) : bool = let l, r = left i, right i let leftIntegrity = - if l < a.Count - then - if kComparer.Compare(a.[l].key, a.[i].key) > 0 - then false - else checkIntegrity l + if l < a.Count then + if kComparer.Compare(a.[l].key, a.[i].key) > 0 then false else checkIntegrity l else true let rightIntegrity = - if r < a.Count - then - if kComparer.Compare(a.[r].key, a.[i].key) > 0 - then false - else checkIntegrity r + if r < a.Count then + if kComparer.Compare(a.[r].key, a.[i].key) > 0 then false else checkIntegrity r else true leftIntegrity && rightIntegrity @@ -80,7 +72,7 @@ type Heap<'k, 'v> (kComparer : IComparer<'k>) = a.RemoveAt(a.Count - 1) heapUp 0 - member this.Add (key: 'k) (value: 'v) = + member this.Add (key : 'k) (value : 'v) = a.Add(Node(key, value)) let mutable i = a.Count - 1 @@ -98,5 +90,3 @@ type Heap<'k, 'v> (kComparer : IComparer<'k>) = max.key, max.value member this.Clear () = a.Clear() - -