前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go优先级队列实现

go优先级队列实现

原创
作者头像
Johns
修改2022-08-11 10:28:39
1.5K0
修改2022-08-11 10:28:39
举报
文章被收录于专栏:代码工具

实现

使用container/heap实现一个简单的优先级队列.

代码语言:go
复制
package main

import (
	"container/heap"
	"fmt"
)

type ListNode struct {
	Val  int
	Next *ListNode
}

// 定义一个优先级队列
type PriorityQueue []*ListNode

func (p PriorityQueue) Len() int {
	return len(p)
}

// 小于(<)就是小顶堆, 大于(>)就是大顶堆
func (p PriorityQueue) Less(i, j int) bool {
	return p[i].Val < p[j].Val
}
func (p PriorityQueue) Swap(i, j int) {
	p[i], p[j] = p[j], p[i]
	return
}

func (p *PriorityQueue) Push(x interface{}) {
	*p = append(*p, x.(*ListNode))
}

func (p *PriorityQueue) Pop() interface{} {
	old := *p
	n := len(old)
	x := old[n-1]
	*p = old[0 : n-1]
	return x
}

func main() {
	p := &PriorityQueue{}
	heap.Init(p)
	node1 := &ListNode{Val: 4}
	node2 := &ListNode{Val: 3}
	node3 := &ListNode{Val: 2}
	node4 := &ListNode{Val: 6}
	node5 := &ListNode{Val: 1}
	heap.Push(p, node1)
	heap.Push(p, node2)
	heap.Push(p, node3)
	heap.Push(p, node4)
	heap.Push(p, node5)

	for p.Len() > 0 {
		node := heap.Pop(p)
		fmt.Print(node.(*ListNode).Val, " ")
	}
}

输出:

代码语言:txt
复制
1 2 3 4 6

合并K个有序链表

最近在leetcode刷题, 遇到一个合并K个升序链表的问题, 就是把K个有序链表合并成一个有序链表

有了上面定义好的优先级队列, 我们可以开始解决问题了

代码语言:go
复制
func mergeKLists(lists []*ListNode) *ListNode {
    if len(lists)==0{
        return nil
    }
	dummy := &ListNode{Val: -1}
	p1 := dummy
	// 使用一个优先级队列(小根堆), 每次把堆顶元素(最小值)弹出来
	p := &PriorityQueue{}
	heap.Init(p)
	for i := 0; i < len(lists); i++ {
        if lists[i]!=nil{
            heap.Push(p, lists[i])
        }	
	}

	for p.Len() > 0 {
		v := heap.Pop(p).(*ListNode)
		p1.Next = v
        if v.Next!=nil{
            heap.Push(p, v.Next)
        }
		p1 = p1.Next
	}
	return dummy.Next

}

// 测试
func main() {
	node1 := &ListNode{Val: 3}
	node2 := &ListNode{Val: 4}
	node1.Next = node2

	node3 := &ListNode{Val: 1}
	node4 := &ListNode{Val: 2}
	node3.Next = node4
	node5 := &ListNode{Val: 6}
	node4.Next = node5

	v := mergeKLists([]*ListNode{node1, node3})
	fmt.Println(v)
}

原因

我目前使用的是go1.16.5版本, 这个版本的go还不支持泛型, 所以官方被迫使用interface{}作为容器的参数来保持其兼容性和拓展性, 这就导致目前go的container只能处于一个半成品的状态, go在1.18开始提供了泛型, 易用性将会得到很大的改善.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现
  • 合并K个有序链表
  • 原因
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档