mirror of
https://github.com/sjwhitworth/golearn.git
synced 2025-04-25 13:48:49 +08:00
84 lines
1.5 KiB
Go
84 lines
1.5 KiB
Go
package kdtree
|
|
|
|
type heapNode struct {
|
|
value []float64
|
|
length float64
|
|
srcRowNo int
|
|
}
|
|
|
|
type heap struct {
|
|
tree []heapNode
|
|
}
|
|
|
|
// newHeap return a pointer of heap.
|
|
func newHeap() *heap {
|
|
h := &heap{}
|
|
h.tree = make([]heapNode, 0)
|
|
return h
|
|
}
|
|
|
|
// maximum return the max heapNode in the heap.
|
|
func (h *heap) maximum() heapNode {
|
|
if len(h.tree) == 0 {
|
|
return heapNode{}
|
|
}
|
|
|
|
return h.tree[0]
|
|
}
|
|
|
|
// extractMax remove the Max heapNode in the heap.
|
|
func (h *heap) extractMax() {
|
|
if len(h.tree) == 0 {
|
|
return
|
|
}
|
|
|
|
h.tree[0] = h.tree[len(h.tree)-1]
|
|
h.tree = h.tree[:len(h.tree)-1]
|
|
|
|
target := 1
|
|
for true {
|
|
largest := target
|
|
if target*2-1 >= len(h.tree) {
|
|
break
|
|
}
|
|
if h.tree[target*2-1].length > h.tree[target-1].length {
|
|
largest = target * 2
|
|
}
|
|
|
|
if target*2 < len(h.tree) {
|
|
if h.tree[target*2].length > h.tree[largest-1].length {
|
|
largest = target*2 + 1
|
|
}
|
|
}
|
|
|
|
if largest == target {
|
|
break
|
|
}
|
|
h.tree[largest-1], h.tree[target-1] = h.tree[target-1], h.tree[largest-1]
|
|
target = largest
|
|
}
|
|
}
|
|
|
|
// insert put a new heapNode into heap.
|
|
func (h *heap) insert(value []float64, length float64, srcRowNo int) {
|
|
node := heapNode{}
|
|
node.length = length
|
|
node.srcRowNo = srcRowNo
|
|
node.value = make([]float64, len(value))
|
|
copy(node.value, value)
|
|
h.tree = append(h.tree, node)
|
|
|
|
target := len(h.tree)
|
|
for target != 1 {
|
|
if h.tree[(target/2)-1].length >= h.tree[target-1].length {
|
|
break
|
|
}
|
|
h.tree[target-1], h.tree[(target/2)-1] = h.tree[(target/2)-1], h.tree[target-1]
|
|
target /= 2
|
|
}
|
|
}
|
|
|
|
func (h *heap) size() int {
|
|
return len(h.tree)
|
|
}
|