Skip to content

Commit 51f041c

Browse files
committed
perf: ⚡ replace the Insert API's recursive implementation with an iterative implementation
The new iterative implementation provides a ~6% improvement in performance (i.e., `ns/op`) while the memory usage characteristics (i.e., `B/op` and `allocs/op`) remain the same.
1 parent 501cbd7 commit 51f041c

File tree

1 file changed

+15
-17
lines changed

1 file changed

+15
-17
lines changed

kdtree.go

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -358,26 +358,24 @@ func deleteNode[T Comparable[T]](d int, value T, cd int, r *kdNode[T]) (*kdNode[
358358
}
359359

360360
func insert[T Comparable[T]](d int, value T, cd int, r *kdNode[T]) bool {
361-
if value.Dist(r.value) == 0 {
362-
return false
363-
}
364-
365-
ncd := (cd + 1) % d
366-
rel := value.Order(r.value, cd)
367-
if rel < 0 {
368-
if r.left == nil {
369-
r.left = NewKDNode(value)
370-
} else {
371-
return insert(d, value, ncd, r.left)
372-
}
373-
} else {
374-
if r.right == nil {
375-
r.right = NewKDNode(value)
361+
for value.Dist(r.value) != 0 {
362+
rel := value.Order(r.value, cd)
363+
if rel < 0 {
364+
if r.left == nil {
365+
r.left = NewKDNode(value)
366+
return true
367+
}
368+
r = r.left
376369
} else {
377-
return insert(d, value, ncd, r.right)
370+
if r.right == nil {
371+
r.right = NewKDNode(value)
372+
return true
373+
}
374+
r = r.right
378375
}
376+
cd = (cd + 1) % d
379377
}
380-
return true
378+
return false
381379
}
382380

383381
func nearestNeighbor[T Comparable[T]](d int, v, nn *T, cd int, r *kdNode[T]) *T {

0 commit comments

Comments
 (0)