initial import
This commit is contained in:
45
core/stat/topk.go
Normal file
45
core/stat/topk.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package stat
|
||||
|
||||
import "container/heap"
|
||||
|
||||
type taskHeap []Task
|
||||
|
||||
func (h *taskHeap) Len() int {
|
||||
return len(*h)
|
||||
}
|
||||
|
||||
func (h *taskHeap) Less(i, j int) bool {
|
||||
return (*h)[i].Duration < (*h)[j].Duration
|
||||
}
|
||||
|
||||
func (h *taskHeap) Swap(i, j int) {
|
||||
(*h)[i], (*h)[j] = (*h)[j], (*h)[i]
|
||||
}
|
||||
|
||||
func (h *taskHeap) Push(x interface{}) {
|
||||
*h = append(*h, x.(Task))
|
||||
}
|
||||
|
||||
func (h *taskHeap) Pop() interface{} {
|
||||
old := *h
|
||||
n := len(old)
|
||||
x := old[n-1]
|
||||
*h = old[0 : n-1]
|
||||
return x
|
||||
}
|
||||
|
||||
func topK(all []Task, k int) []Task {
|
||||
h := new(taskHeap)
|
||||
heap.Init(h)
|
||||
|
||||
for _, each := range all {
|
||||
if h.Len() < k {
|
||||
heap.Push(h, each)
|
||||
} else if (*h)[0].Duration < each.Duration {
|
||||
heap.Pop(h)
|
||||
heap.Push(h, each)
|
||||
}
|
||||
}
|
||||
|
||||
return *h
|
||||
}
|
||||
Reference in New Issue
Block a user