设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间13 现在时间13 缓存数据 05|快乐缺点勇气 浪漫缺点诗意\你低头不说一句\你朝着灰色走去\你住进混沌深海\你开始无望等待|词曲/编混:陈粒

05|快乐缺点勇气 浪漫缺点诗意\你低头不说一句\你朝着灰色走去\你住进混沌深海\你开始无望等待|词曲/编混:陈粒 -- 光

查看: 962|回复: 1

golang中的container/heap包使用

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:232
  • 打卡月天数:0
  • 打卡总奖励:4143
  • 最近打卡:2025-04-20 08:44:27
等级头衔

等級:晓枫资讯-上等兵

在线时间
4 小时

积分成就
威望
0
贡献
474
主题
442
精华
0
金钱
5571
积分
988
注册时间
2023-1-3
最后登录
2025-6-1

发表于 2025-6-1 05:15:55 | 显示全部楼层 |阅读模式
包 heap 为所有实现了 heap.Interface 的类型提供堆操作。 一个堆即是一棵树, 这棵树的每个节点的值都比它的子节点的值要小, 而整棵树最小的值位于树根(root), 也即是索引 0 的位置上。
包 heap 采样接口的形式来满足不同的类型的比较。
  1. type Interface interface {
  2.         sort.Interface
  3.         Push(x any) // add x as element Len()
  4.         Pop() any   // remove and return element Len() - 1.
  5. }
  6. // sort.Interface
  7. type Interface interface {
  8.     Len() int
  9.     Less(i, j int) bool
  10.     Swap(i, j int)
  11. }
复制代码
因此,你要比较的对象要先实现
  1. heap.Interface
复制代码

简单排序
  1. type myHeap []int

  2. func (h *myHeap) Less(i, j int) bool {
  3.         return (*h)[i] < (*h)[j]
  4. }

  5. func (h *myHeap) Swap(i, j int) {
  6.         (*h)[i], (*h)[j] = (*h)[j], (*h)[i]
  7. }

  8. func (h *myHeap) Len() int {
  9.         return len(*h)
  10. }

  11. // 把最后一个弹出,因为最小的值已经被换到了最后
  12. func (h *myHeap) Pop() (v any) {
  13.         *h, v = (*h)[:h.Len()-1], (*h)[h.Len()-1]
  14.         return
  15. }

  16. func (h *myHeap) Push(v any) {
  17.         *h = append(*h, v.(int))
  18. }

  19. // 从小到大排序
  20. func HeapSort(data []int) []int {
  21.         hp := &myHeap{}
  22.         for _, v := range data {
  23.                 heap.Push(hp, v)
  24.         }
  25.         heap.Init(hp)
  26.         res := make([]int, hp.Len())
  27.         for i := 0; hp.Len() > 0; i++ {
  28.                 res[i] = heap.Pop(hp).(int)
  29.         }

  30.         return res
  31. }

  32. // data = 6, 0, 1, 7, 9, 4, 3, 8, 2, 5
  33. // hp 中存储的是 0, 2, 1, 6, 5, 4, 3, 8, 7, 9
复制代码
优先队列

使用一个 priority 字段来表示优先级大小,使用 index 字段来表示索引。
  1. type Item struct {
  2.         value    string
  3.         priority int
  4.         index    int
  5. }
  6. type PriorityQueue []*Item

  7. func (pq PriorityQueue) Len() int { return len(pq) }

  8. func (pq PriorityQueue) Less(i, j int) bool {
  9.         return pq[i].priority > pq[j].priority
  10. }

  11. func (pq PriorityQueue) Swap(i, j int) {
  12.         pq[i], pq[j] = pq[j], pq[i]
  13.         pq[i].index = i
  14.         pq[j].index = j
  15. }

  16. func (pq *PriorityQueue) Push(x any) {
  17.         n := len(*pq)
  18.         item := x.(*Item)
  19.         item.index = n
  20.         *pq = append(*pq, item)
  21. }

  22. func (pq *PriorityQueue) Pop() any {
  23.         old := *pq
  24.         n := len(old)
  25.         item := old[n-1]
  26.         old[n-1] = nil  // avoid memory leak
  27.         item.index = -1 // for safety
  28.         *pq = old[0 : n-1]
  29.         return item
  30. }

  31. func (pq *PriorityQueue) update(item *Item, value string, priority int) {
  32.         item.value = value
  33.         item.priority = priority
  34.         heap.Fix(pq, item.index)
  35. }

  36. func PriorityQueueTest() {
  37.         items := map[string]int{
  38.                 "banana": 3, "apple": 2, "pear": 4,
  39.         }

  40.         pq := make(PriorityQueue, len(items))
  41.         i := 0
  42.         for value, priority := range items {
  43.                 pq[i] = &Item{
  44.                         value:    value,
  45.                         priority: priority,
  46.                         index:    i,
  47.                 }
  48.                 i++
  49.         }
  50.         heap.Init(&pq)

  51.         item := &Item{
  52.                 value:    "orange",
  53.                 priority: 1,
  54.         }
  55.         heap.Push(&pq, item)
  56.         pq.update(item, item.value, 5)

  57.         for pq.Len() > 0 {
  58.                 item := heap.Pop(&pq).(*Item)
  59.                 fmt.Printf("%.2d:%s ", item.priority, item.value)
  60.         }
  61. }
复制代码
按时间排序
  1. type TimeSortedQueueItem struct {
  2.         Time  int64
  3.         Value interface{}
  4. }

  5. type TimeSortedQueue []*TimeSortedQueueItem

  6. func (q TimeSortedQueue) Len() int           { return len(q) }
  7. func (q TimeSortedQueue) Less(i, j int) bool { return q[i].Time < q[j].Time }
  8. func (q TimeSortedQueue) Swap(i, j int)      { q[i], q[j] = q[j], q[i] }

  9. func (q *TimeSortedQueue) Push(v interface{}) {
  10.         *q = append(*q, v.(*TimeSortedQueueItem))
  11. }

  12. func (q *TimeSortedQueue) Pop() interface{} {
  13.         n := len(*q)
  14.         item := (*q)[n-1]
  15.         *q = (*q)[0 : n-1]
  16.         return item
  17. }

  18. func NewTimeSortedQueue(items ...*TimeSortedQueueItem) *TimeSortedQueue {
  19.         q := make(TimeSortedQueue, len(items))
  20.         for i, item := range items {
  21.                 q[i] = item
  22.         }
  23.         heap.Init(&q)
  24.         return &q
  25. }

  26. func (q *TimeSortedQueue) PushItem(time int64, value interface{}) {
  27.         heap.Push(q, &TimeSortedQueueItem{
  28.                 Time:  time,
  29.                 Value: value,
  30.         })
  31. }

  32. func (q *TimeSortedQueue) PopItem() interface{} {
  33.         if q.Len() == 0 {
  34.                 return nil
  35.         }

  36.         return heap.Pop(q).(*TimeSortedQueueItem).Value
  37. }
复制代码
到此这篇关于golang中的container/heap包使用的文章就介绍到这了,更多相关golang container/heap包内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
15
积分
10
注册时间
2022-12-26
最后登录
2022-12-26

发表于 昨天 23:50 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表