smallheap.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. // 最小堆存放数据项
  2. // 并实现了一个时序队列,支持添加、删除、修改等操作
  3. // 实现了heap.Interface接口,提供O(logn)的插入和删除操作
  4. // 同时使用map提供O(1)的查找操作
  5. // 修改时间:2024-12-26
  6. package smallheap
  7. import (
  8. "container/heap"
  9. "errors"
  10. )
  11. type SortItem interface {
  12. SetIndex(index int)
  13. GetIndex() int
  14. GetSortKey() int64
  15. GetUniqueKey() int64
  16. }
  17. type SmallHeap[T SortItem] struct {
  18. Items []T
  19. QueryTable map[int64]T
  20. // sequence *snowflake.Node //1MS生成400万个,不分节点
  21. }
  22. var (
  23. ErrItemExists = errors.New("item already exists")
  24. ErrItemNotFound = errors.New("item not found")
  25. )
  26. func (h SmallHeap[T]) Len() int {
  27. return len(h.Items)
  28. }
  29. func (h SmallHeap[T]) Less(i, j int) bool {
  30. return h.Items[i].GetSortKey() < h.Items[j].GetSortKey()
  31. }
  32. func (h SmallHeap[T]) Swap(i, j int) {
  33. h.Items[i], h.Items[j] = h.Items[j], h.Items[i]
  34. h.Items[i].SetIndex(i)
  35. h.Items[j].SetIndex(j)
  36. }
  37. func (h *SmallHeap[T]) Push(x interface{}) {
  38. v, ok := x.(T)
  39. if ok {
  40. v.SetIndex(len(h.Items))
  41. h.Items = append(h.Items, v)
  42. }
  43. }
  44. func (h *SmallHeap[T]) Pop() interface{} {
  45. n := len(h.Items)
  46. x := h.Items[n-1]
  47. h.Items = h.Items[:n-1]
  48. return x
  49. }
  50. func NewSmallHeap[T SortItem]() *SmallHeap[T] {
  51. sh := new(SmallHeap[T])
  52. sh.Items = make([]T, 0, 16)
  53. sh.QueryTable = make(map[int64]T)
  54. // seq, err := snowflake.NewMsNode(0, 0)
  55. // if err != nil {
  56. // panic("NewSmallHeap init sequence error")
  57. // return nil
  58. // }
  59. // sh.sequence = seq
  60. heap.Init(sh)
  61. return sh
  62. }
  63. func (h *SmallHeap[T]) Clear() {
  64. h.Items = make([]T, 0)
  65. h.QueryTable = make(map[int64]T)
  66. }
  67. // 使用接口
  68. // 添加
  69. func (h *SmallHeap[T]) Add(it T) error {
  70. // 检查元素是否已存在
  71. if _, exists := h.QueryTable[it.GetUniqueKey()]; exists {
  72. return ErrItemExists
  73. }
  74. heap.Push(h, it)
  75. k := it.GetUniqueKey()
  76. h.QueryTable[k] = it
  77. return nil
  78. }
  79. // 删除
  80. func (h *SmallHeap[T]) Remove(index int) T {
  81. if index < 0 || index >= h.Len() {
  82. var t T
  83. return t
  84. }
  85. it := heap.Remove(h, index)
  86. v, ok := it.(T)
  87. if ok {
  88. v.SetIndex(-1)
  89. delete(h.QueryTable, v.GetUniqueKey())
  90. return v
  91. }
  92. var t T
  93. return t
  94. }
  95. func (h *SmallHeap[T]) RemoveByUniqueKey(uniqueKey int64) T {
  96. v, ok := h.QueryTable[uniqueKey]
  97. if !ok {
  98. var t T
  99. return t
  100. }
  101. return h.Remove(v.GetIndex())
  102. }
  103. // 重新排序
  104. func (h *SmallHeap[T]) Resort(t1 T) bool {
  105. old, ok := h.GetByUniqueKey(t1.GetUniqueKey())
  106. if ok {
  107. heap.Fix(h, old.GetIndex())
  108. return true
  109. }
  110. return false
  111. }
  112. // 查看切片中的元素
  113. func (h *SmallHeap[T]) Get(pos int) (T, error) {
  114. var zero T
  115. if pos < 0 || pos >= h.Len() {
  116. return zero, ErrItemNotFound
  117. }
  118. return h.Items[pos], nil
  119. }
  120. func (h *SmallHeap[T]) GetByUniqueKey(uniqueKey int64) (T, bool) {
  121. v, ok := h.QueryTable[uniqueKey]
  122. return v, ok
  123. }
  124. // Size 返回堆中元素数量
  125. // 时间复杂度: O(1)
  126. func (h *SmallHeap[T]) Size() int {
  127. return len(h.Items)
  128. }