structure_old/priority_queue/priority_queue.go

150 lines
2.4 KiB
Go
Raw Normal View History

2019-01-31 10:39:17 +00:00
package plist
import (
2019-02-08 22:32:58 +00:00
"github.com/davecgh/go-spew/spew"
2019-01-31 10:39:17 +00:00
"github.com/emirpasic/gods/utils"
)
// PriorityQueue 优先队列 适合数据量不大, 加索引
type PriorityQueue struct {
2019-02-08 22:32:58 +00:00
index *Index
indexlimit int
node *Node
size int
comparator utils.Comparator
}
type Index struct {
node *Node
next *Index
nlen int
}
type Node struct {
value interface{}
prev *Node
next *Node
2019-01-31 10:39:17 +00:00
}
// NewWithInt compare use int
func NewWithInt() *PriorityQueue {
p := new(PriorityQueue)
2019-02-08 22:32:58 +00:00
p.indexlimit = 10
2019-01-31 10:39:17 +00:00
p.comparator = func(a, b interface{}) int {
if a.(int) > b.(int) {
return 1
}
return -1
}
return p
}
2019-02-08 22:32:58 +00:00
func (pq *PriorityQueue) String() string {
content := ""
for cur := pq.node; cur != nil; cur = cur.next {
var prevcontent string
if cur.prev != nil {
prevcontent = "(" + spew.Sprint(cur.prev.value) + "<-)"
2019-01-31 19:57:40 +00:00
} else {
2019-02-08 22:32:58 +00:00
prevcontent = "(nil)"
2019-01-31 19:57:40 +00:00
}
2019-02-08 22:32:58 +00:00
content += spew.Sprint(cur.value) + prevcontent + "-"
2019-01-31 19:57:40 +00:00
}
2019-02-08 22:32:58 +00:00
if content[len(content)-1] == '-' {
content = content[:len(content)-1]
}
return content
2019-01-31 19:57:40 +00:00
}
2019-01-31 10:39:17 +00:00
func (pq *PriorityQueue) Push(v interface{}) {
2019-02-08 22:32:58 +00:00
node := new(Node)
node.value = v
2019-02-01 11:18:48 +00:00
2019-02-08 22:32:58 +00:00
if pq.node == nil {
//创建索引
index := new(Index)
index.nlen = 1
index.node = node
2019-02-01 11:18:48 +00:00
2019-02-08 22:32:58 +00:00
return
}
// find the node of index to start
idx := pq.index
2019-01-31 10:39:17 +00:00
2019-02-08 22:32:58 +00:00
for {
2019-01-31 10:39:17 +00:00
2019-02-08 22:32:58 +00:00
if idx.next == nil {
break
}
2019-01-31 10:39:17 +00:00
2019-02-08 22:32:58 +00:00
if pq.comparator(v, idx.next.node.value) > 0 {
break
}
2019-01-31 10:39:17 +00:00
2019-02-08 22:32:58 +00:00
idx = idx.next
}
2019-01-31 10:39:17 +00:00
2019-02-08 22:32:58 +00:00
cur := idx.node
2019-01-31 10:39:17 +00:00
2019-02-08 22:32:58 +00:00
//cur := pq.node
if pq.comparator(v, pq.node.value) > 0 {
pq.node = node
node.next = cur
2019-02-01 11:18:48 +00:00
2019-02-08 22:32:58 +00:00
pq.index.node = pq.node
2019-01-31 10:39:17 +00:00
2019-02-08 22:32:58 +00:00
// cur.prev = node
return
}
2019-02-01 11:18:48 +00:00
2019-02-08 22:32:58 +00:00
for cur.next != nil {
2019-02-01 11:18:48 +00:00
2019-02-08 22:32:58 +00:00
if pq.comparator(v, cur.next.value) > 0 {
temp := cur.next
cur.next = node
node.next = temp
// node.prev = cur
// temp.prev = node
2019-02-01 11:18:48 +00:00
2019-02-08 22:32:58 +00:00
idx.nlen++
2019-02-01 11:18:48 +00:00
2019-02-08 22:32:58 +00:00
return
2019-01-31 10:39:17 +00:00
}
2019-02-01 11:18:48 +00:00
2019-02-08 22:32:58 +00:00
cur = cur.next
2019-01-31 10:39:17 +00:00
}
2019-01-31 19:57:40 +00:00
2019-02-08 22:32:58 +00:00
cur.next = node
// node.prev = cur
2019-01-31 10:39:17 +00:00
pq.size++
2019-02-08 22:32:58 +00:00
}
2019-01-31 10:39:17 +00:00
2019-02-08 22:32:58 +00:00
// func (pq *PriorityQueue) Top() (interface{}, bool) {
// return pq.Get(0)
2019-01-31 19:57:40 +00:00
// }
2019-01-31 10:39:17 +00:00
2019-02-08 22:32:58 +00:00
// func (pq *PriorityQueue) Bottom() (interface{}, bool) {
// return pq.Get(pq.right - 1)
2019-01-31 19:57:40 +00:00
// }
2019-01-31 10:39:17 +00:00
2019-02-08 22:32:58 +00:00
// func (pq *PriorityQueue) Get(index int) (interface{}, bool) {
// if index < pq.size {
// return pq.Values()[index], true
// }
// return nil, false
// }
2019-01-31 10:39:17 +00:00
2019-02-08 22:32:58 +00:00
// func (pq *PriorityQueue) Values() []interface{} {
// // values := pq.datas[pq.left:pq.right]
// // if !pq.isSorted {
// // utils.Sort(values, pq.comparator)
// // pq.isSorted = true
// // }
// return pq.datas[pq.left:pq.right]
// }