使用Golang创建优先队列的程序
优先队列是一种队列,其中元素被分配了优先级,优先级较高的元素比优先级较低的元素先弹出。
在本文中,我们将编写Golang程序来创建优先队列。它们可以使用堆、切片、树等实现,并用于执行诸如将元素推入队列和从队列中移除元素等操作。
语法
func make ([] type, size, capacity)
Go语言中的make函数用于创建数组/映射,它接受要创建的变量的类型、大小和容量作为参数。
func append(slice, element_1, element_2…, element_N) []T
append函数用于向数组切片添加值。它接受多个参数。第一个参数是要向其添加值的数组,后跟要添加的值。然后,该函数返回包含所有值的最终数组切片。
func len(v Type) int
len()函数用于获取任何参数的长度。它接受一个参数作为要查找其长度的数据类型变量,并返回一个整数,即该变量的长度。
算法
步骤 1 - 创建一个名为Item的结构体,其中包含三个字段:value(项目的值,类型为字符串)、priority(项目的优先级,类型为整数)和index(项目的索引,类型为整数)。
步骤 2 - 然后,创建一个名为PriorityQueue的类型,作为Item的切片,并带有指向它的指针。
步骤 3 - 实现Len()方法、Less()方法、Swap()方法、Push()方法、Pop()方法。
步骤 4 - 最后,实现update方法来更新队列元素的优先级和值。
步骤 5 - 在main函数中,创建一个名为piq的空优先队列,类型为PriorityQueue。
步骤 6 - 在此步骤中,使用heap包中的Push()函数将项目推入优先队列,并使用PriorityQueue的Update()方法更新项目的优先级。
步骤 7 - 在这里,从heap包中的优先队列中弹出项目,直到队列为空。打印每个弹出项目的value和priority。
示例 1
在本例中,我们将编写一个Golang程序,使用二叉堆创建优先队列。项目的切片将被创建为指向它的指针。
package main import ( "container/heap" "fmt" ) type Item struct { value string priority int index int } type PriorityQueue []*Item func (piq PriorityQueue) Len() int { return len(piq) } func (piq PriorityQueue) Less(i, j int) bool { return piq[i].priority > piq[j].priority } func (piq PriorityQueue) Swap(i, j int) { piq[i], piq[j] = piq[j], piq[i] piq[i].index = i piq[j].index = j } func (piq *PriorityQueue) Push(x interface{}) { n := len(*piq) item := x.(*Item) item.index = n *piq = append(*piq, item) } func (piq *PriorityQueue) Pop() interface{} { old := *piq n := len(old) item := old[n-1] item.index = -1 *piq = old[0 : n-1] return item } func (piq *PriorityQueue) Update(item *Item, value string, priority int) { item.value = value item.priority = priority heap.Fix(piq, item.index) } func main() { piq := make(PriorityQueue, 0) heap.Push(&piq, &Item{value: "Item 1", priority: 30}) heap.Push(&piq, &Item{value: "Item 2", priority: 10}) heap.Push(&piq, &Item{value: "Item 3", priority: 20}) item := piq[2] piq.Update(item, item.value, 40) for piq.Len() > 0 { item := heap.Pop(&piq).(*Item) fmt.Printf("Value: %s, Priority: %d\n", item.value, item.priority) } }
输出
Value: Item 3, Priority: 40 Value: Item 1, Priority: 30 Value: Item 2, Priority: 10
示例 2
在本例中,我们将编写一个Golang程序,使用Item结构体的切片来实现优先队列。
package main import ( "fmt" ) type Item struct { value string priority int } type PriorityQueue []Item func (piq PriorityQueue) Len() int { return len(piq) } func (piq PriorityQueue) Less(i, j int) bool { return piq[i].priority > piq[j].priority } func (piq PriorityQueue) Swap(i, j int) { piq[i], piq[j] = piq[j], piq[i] } func (piq *PriorityQueue) Push(x interface{}) { item := x.(Item) *piq = append(*piq, item) } func (piq *PriorityQueue) Pop() interface{} { old := *piq n := len(old) item := old[n-1] *piq = old[0 : n-1] return item } func main() { piq := make(PriorityQueue, 0) piq.Push(Item{value: "Item 1", priority: 30}) piq.Push(Item{value: "Item 2", priority: 10}) piq.Push(Item{value: "Item 3", priority: 20}) for piq.Len() > 0 { item := piq.Pop().(Item) fmt.Printf("Value: %s, Priority: %d\n", item.value, item.priority) } }
输出
Value: Item 3, Priority: 20 Value: Item 2, Priority: 10 Value: Item 1, Priority: 3
结论
在本文中,我们编译并执行了创建优先队列的程序,使用了两个示例。在第一个示例中,我们使用堆创建了一个“priorityqueue”,在第二个示例中,我们使用了切片和自定义函数。优先队列可以用于任务调度、霍夫曼编码、迪杰斯特拉算法等等。