A keyed priority queue is a data structure that allows you to associate keys with priority values and efficiently retrieve, update, and remove elements based on their priorities. This package offers concurrent-safe operations that leverages a binary heap to maintain the priority queue. Operations like Push, Pop, Update and Remove have O(log n) time complexity, where n is the size of the priority queue. The use of a map ensures fast lookups by key. Operations like Peek, Contains and ValueOf have O(1) time complexity.
go get github.com/rdleal/go-priorityq Importing the package:
import "github.com/rdleal/go-priorityq/kpq"Creating a priority queue with string as the key type, and int as the priority value type:
// Create a new KeyedPriorityQueue with a custom comparison function cmp := func(a, b int) bool { return a < b } pq := kpq.NewKeyedPriorityQueue[string](cmp)Pushing elements into the priority queue:
pq.Push("key1", 42) pq.Push("key2", 30) pq.Push("key3", 50)Popping the element with the highest priority:
key, value, ok := pq.Pop() if !ok { log.Fatal("priority queue is empty") }Updating the priority of an element:
if err := pq.Update("key3", 20); err != nil { log.Fatalf("got unexpected error: %v\n", err) }Removing an element from the priority queue:
pq.Remove("key1")Checking if a key exists in the priority queue:
exists := pq.Contains("key3") fmt.Println("Key 'key3' exists:", exists)For more operations, check out the GoDoc page.
Run unit tests:
go test -v -cover -race ./...