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:
2025-01-22 18:22:34 +00:00
parent c8c1818d24
commit 174a99a5a0
4 changed files with 90 additions and 208 deletions

View File

@@ -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)