2019-01-31 10:39:17 +00:00
|
|
|
package plist
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/emirpasic/gods/utils"
|
|
|
|
)
|
|
|
|
|
|
|
|
// PriorityQueue 优先队列 适合数据量不大, 加索引
|
|
|
|
type PriorityQueue struct {
|
2019-02-13 18:42:14 +00:00
|
|
|
data *Tree
|
2019-02-13 08:47:11 +00:00
|
|
|
|
2019-02-13 18:42:14 +00:00
|
|
|
Head *AvlNode
|
|
|
|
Tail *AvlNode
|
2019-02-08 22:32:58 +00:00
|
|
|
comparator utils.Comparator
|
|
|
|
}
|
|
|
|
|
2019-01-31 10:39:17 +00:00
|
|
|
// NewWithInt compare use int
|
|
|
|
func NewWithInt() *PriorityQueue {
|
|
|
|
p := new(PriorityQueue)
|
2019-02-13 10:02:01 +00:00
|
|
|
|
2019-01-31 10:39:17 +00:00
|
|
|
p.comparator = func(a, b interface{}) int {
|
|
|
|
if a.(int) > b.(int) {
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
return -1
|
|
|
|
}
|
2019-02-13 10:02:01 +00:00
|
|
|
|
2019-02-13 18:42:14 +00:00
|
|
|
p.data = NewWith(p.comparator)
|
2019-02-13 10:02:01 +00:00
|
|
|
|
2019-01-31 10:39:17 +00:00
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
2019-02-08 22:32:58 +00:00
|
|
|
func (pq *PriorityQueue) String() string {
|
2019-02-13 18:42:14 +00:00
|
|
|
return pq.data.String()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pq *PriorityQueue) Top() (interface{}, bool) {
|
|
|
|
return pq.Head, pq.Head != nil
|
|
|
|
}
|
2019-01-31 19:57:40 +00:00
|
|
|
|
2019-02-13 18:42:14 +00:00
|
|
|
func (pq *PriorityQueue) Bottom() (interface{}, bool) {
|
|
|
|
return pq.Tail, pq.Tail != nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pq *PriorityQueue) Get(index int) (interface{}, bool) {
|
|
|
|
var cur *AvlNode
|
|
|
|
if index >= 0 {
|
|
|
|
cur := pq.Head
|
|
|
|
for index > 0 && cur != nil {
|
|
|
|
index--
|
|
|
|
cur = cur.Prev()
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
cur := pq.Tail
|
|
|
|
for index < -1 && cur != nil {
|
|
|
|
index++
|
|
|
|
cur = cur.Next()
|
2019-02-10 17:27:47 +00:00
|
|
|
}
|
2019-01-31 19:57:40 +00:00
|
|
|
}
|
2019-02-13 18:42:14 +00:00
|
|
|
|
|
|
|
return cur, cur != nil
|
2019-02-13 08:47:11 +00:00
|
|
|
}
|
|
|
|
|
2019-02-13 18:42:14 +00:00
|
|
|
func (pq *PriorityQueue) Push(v interface{}) {
|
|
|
|
|
|
|
|
pnode := pq.data.Put(v)
|
|
|
|
if pq.Head == nil {
|
|
|
|
pq.Head = pnode
|
|
|
|
pq.Tail = pnode
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if pq.comparator(v, pq.Head.Value) > 0 {
|
|
|
|
pq.Head = pnode
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if pq.comparator(v, pq.Tail.Value) < 0 {
|
|
|
|
pq.Tail = pnode
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pq *PriorityQueue) Remove(index int) interface{} {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pq *PriorityQueue) Values(index int) []interface{} {
|
|
|
|
return pq.data.Values()
|
|
|
|
}
|