You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
705 B
Go
46 lines
705 B
Go
4 years ago
|
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
|
||
|
}
|