優(yōu)先級(jí)隊(duì)列
優(yōu)先級(jí)隊(duì)列是一種特殊隊(duì)列财异。于對(duì)進(jìn)入隊(duì)列的數(shù)據(jù),指定該數(shù)據(jù)的優(yōu)先級(jí)priority癌蚁,然后根據(jù)隊(duì)列的優(yōu)先級(jí)順序幻梯,進(jìn)行提取數(shù)據(jù)。
同等優(yōu)先級(jí)的數(shù)據(jù)努释,可以是FIFO碘梢、LIFO等,需要開發(fā)者自行定義伐蒂。
priority queue
先來(lái)看實(shí)例
復(fù)制下面代碼煞躬,執(zhí)行go mod vendor
安裝依賴,然后在運(yùn)行逸邦。
package main
import (
"fmt"
"github.com/czasg/go-queue"
)
func main() {
// 指定隊(duì)列生成方式恩沛,此處生成FIFO內(nèi)存隊(duì)列
factory := func() queue.Queue {
return queue.NewFifoMemoryQueue(1024)
}
// 創(chuàng)建優(yōu)先級(jí)隊(duì)列
q := queue.NewPriorityQueueFactory(nil, factory)
defer q.Close()
// push數(shù)據(jù)
_ = q.Push([]byte{1}, 1) // 優(yōu)先級(jí)1
_ = q.Push([]byte{10}, 10) // 優(yōu)先級(jí)10
_ = q.Push([]byte{5}, 5) // 優(yōu)先級(jí)5
// pop數(shù)據(jù),優(yōu)先級(jí)越高的數(shù)據(jù)最先被獲取
fmt.Println(q.Pop()) // []byte{10}
fmt.Println(q.Pop()) // []byte{5}
fmt.Println(q.Pop()) // []byte{1}
}
``
我們可以看到push數(shù)據(jù)時(shí)順序是亂序的缕减,然后pop出的數(shù)據(jù)雷客,卻是按照優(yōu)先級(jí)進(jìn)行排序的。這就是一種優(yōu)先級(jí)隊(duì)列的實(shí)現(xiàn)烛卧。
# 原理
優(yōu)先級(jí)隊(duì)列的本質(zhì)是內(nèi)部維護(hù)有多個(gè)隊(duì)列佛纫,每個(gè)隊(duì)列都有一個(gè)屬性priority,然后有一個(gè)游標(biāo)总放,用于記錄當(dāng)前優(yōu)先級(jí)最高的隊(duì)列呈宇。即可實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列的順序pop功能。
有興趣可以參考[源碼](https://github.com/czasg/go-queue)