structure_old/priority_queue/priority_queue.go
2019-02-15 18:51:21 +08:00

75 lines
1.2 KiB
Go

package plist
import (
"github.com/emirpasic/gods/trees/avltree"
"github.com/emirpasic/gods/utils"
)
// PriorityQueue 优先队列 适合数据量不大, 加索引
type PriorityQueue struct {
avl *avltree.Tree
size int
comparator utils.Comparator
splitlimit int
}
func NewWithIntComparator() *PriorityQueue {
pq := new(PriorityQueue)
pq.comparator = func(v1, v2 interface{}) int {
if v1.(int) > v2.(int) {
return 1
} else if v1.(int) < v2.(int) {
return -1
}
return 0
}
pq.avl = avltree.NewWith(pq.comparator)
pq.size = 0
return pq
}
func (pq *PriorityQueue) Push(value interface{}) {
var pl *PriorityList
pq.size++
floor, ok := pq.avl.Floor(value)
if ok {
pl = floor.Value.(*PriorityList)
cur := pl.head
pl.size++
if pq.comparator(value, cur.value) > 0 {
temp := pl.head
pl.head = &Node{value: value}
pl.head.next = temp
return
}
for cur.next != nil {
if pq.comparator(value, cur.next.value) >= 0 {
temp := cur.next
cur.next = &Node{value: value}
cur.next.next = temp
return
}
cur = cur.next
}
// next == nil
cur.next = &Node{value: value}
return
}
pl = &PriorityList{}
pl.head = &Node{value: value}
pl.size++
pq.avl.Put(pl.head.value, pl)
return
}