golang之TopN算法

朱雀 2022-06-13 07:26 317阅读 0赞

相信大家已经了解了TOPN算法的原理了
不多说 直接上代码,其中[]leveldb.UserExp 看需求来定义

  1. //h[root] parentNode h[root/2] childNode h[root*2+1] h[root*2+2]
  2. func GetTopN(n int, a []leveldb.UserExp) ([]leveldb.UserExp, error) {
  3. h := make([]leveldb.UserExp, 0)
  4. lenA := len(a)
  5. if n >= lenA {
  6. return h, errors.New("the top n greater than the length of a")
  7. }
  8. for i := 0; i < lenA; i++ {
  9. if 0 <= i && i < n {
  10. h = append(h, a[i]) //build the heap
  11. if i == n-1 {
  12. for j := n - 1; j >= 0; j-- {
  13. HeapAdjust(h, j, n)
  14. fmt.Println(h)
  15. }
  16. }
  17. } else {
  18. //算法开始
  19. if a[i].Exp > h[0].Exp {
  20. h[0].Exp = a[i].Exp
  21. p := 0 //下标
  22. HeapAdjust(h, p, n)
  23. }
  24. //算法结束
  25. }
  26. }
  27. return h, nil
  28. }
  29. //h是待调整的堆数组,p是待调整的数组元素的位置,n是数组的长度
  30. //本函数功能是:根据数组h构建min根堆
  31. func HeapAdjust(h []leveldb.UserExp, p, n int) {
  32. //下标
  33. for p < n { //排序条件 不能超出n
  34. q := p<<1 | 1 //h[p]的左子树
  35. if q >= n {
  36. break //已经大于最大的树的节点的下标[0,n-1]
  37. }
  38. if (q < n-1) && (h[q+1].Exp < h[q].Exp) { //q<n-1 确保q+1不超出不超出n-1 左大于右
  39. q = q + 1 //用相邻的两个值的小值的下标
  40. }
  41. if h[q].Exp < h[p].Exp { //用最小的值比较 确保最小的值放在数组的最前面
  42. t := h[p] //交换
  43. h[p] = h[q]
  44. h[q] = t
  45. p = q //存的是最小的值
  46. } else {
  47. break
  48. }
  49. }
  50. }

发表评论

表情:
评论列表 (有 0 条评论,317人围观)

还没有评论,来说两句吧...

相关阅读

    相关 golangTopN算法

    相信大家已经了解了TOPN算法的原理了 不多说 直接上代码,其中\[\]leveldb.UserExp 看需求来定义 //h[root] parentNode h

    相关 Hadoop——topN

    本节目标: 1、通过一个求topN的案例,掌握MR的开发流程。 2、学会查看[官方API][API] 根据已知的数据集,数据集每一行的文本内容是不同年月和时间对应的温度。