switch implementation of heap from being based on heap.sml (heap as described by one of Chris Okasaki's papers) to being based on bin-vec.sml (simple vector storing elements in sorted order); more performant this way for cache reasons
This commit is contained in:
@@ -12,13 +12,16 @@ sig
|
||||
type elem
|
||||
|
||||
val empty: elem vector
|
||||
val isEmpty: elem vector -> bool
|
||||
|
||||
val sub: elem vector * int -> elem
|
||||
val contains: elem * elem vector -> bool
|
||||
val findMin: elem vector -> elem
|
||||
|
||||
val findInsPos: elem * elem vector -> int
|
||||
val insert: elem vector * elem * int -> elem vector
|
||||
val delete: elem vector * elem -> elem vector
|
||||
val deleteMin: elem vector -> elem vector
|
||||
val updateAtIdx: elem vector * elem * int -> elem vector
|
||||
|
||||
val fromList: elem list -> elem vector
|
||||
@@ -30,8 +33,23 @@ struct
|
||||
|
||||
val empty = Vector.fromList []
|
||||
|
||||
fun isEmpty vec = Vector.length vec = 0
|
||||
|
||||
fun deleteMin vec =
|
||||
if Vector.length vec <= 1 then
|
||||
Vector.fromList []
|
||||
else
|
||||
let
|
||||
val len = Vector.length vec - 2
|
||||
val slice = VectorSlice.slice (vec, 1, SOME len)
|
||||
in
|
||||
VectorSlice.vector slice
|
||||
end
|
||||
|
||||
val sub = Vector.sub
|
||||
|
||||
fun findMin vec = Vector.sub (vec, 0)
|
||||
|
||||
fun reverseLinearSearch (pos, findNum, vec) =
|
||||
if pos < 0 then
|
||||
~1
|
||||
@@ -183,3 +201,15 @@ structure ValSet =
|
||||
|
||||
fun g ({distance = a, ...}: elem, {distance = b, ...}: elem) = a > b
|
||||
end)
|
||||
|
||||
structure DistVec =
|
||||
MakeBinVec
|
||||
(struct
|
||||
type elem = {distance: int, id: int, comesFrom: int}
|
||||
|
||||
fun l ({distance = a, ...}: elem, {distance = b, ...}: elem) = a < b
|
||||
|
||||
fun eq ({distance = a, ...}: elem, {distance = b, ...}: elem) = a = b
|
||||
|
||||
fun g ({distance = a, ...}: elem, {distance = b, ...}: elem) = a > b
|
||||
end)
|
||||
|
||||
Reference in New Issue
Block a user