golang之TopN算法

golang 专栏收录该内容
25 篇文章 1 订阅

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


//h[root] parentNode h[root/2] childNode  h[root*2+1] h[root*2+2]
func GetTopN(n int, a []leveldb.UserExp) ([]leveldb.UserExp, error) {
    h := make([]leveldb.UserExp, 0)
    lenA := len(a)
    if n >= lenA {
        return h, errors.New("the top n  greater than the length of a")
    }
    for i := 0; i < lenA; i++ {
        if 0 <= i && i < n {
            h = append(h, a[i]) //build the heap
            if i == n-1 {
                for j := n - 1; j >= 0; j-- {
                    HeapAdjust(h, j, n)
                    fmt.Println(h)
                }
            }
        } else {
            //算法开始
            if a[i].Exp > h[0].Exp {
                h[0].Exp = a[i].Exp
                p := 0 //下标
                HeapAdjust(h, p, n)
            }
            //算法结束
        }
    }

    return h, nil
}

//h是待调整的堆数组,p是待调整的数组元素的位置,n是数组的长度
//本函数功能是:根据数组h构建min根堆
func HeapAdjust(h []leveldb.UserExp, p, n int) {
    //下标
    for p < n { //排序条件 不能超出n
        q := p<<1 | 1 //h[p]的左子树
        if q >= n {
            break //已经大于最大的树的节点的下标[0,n-1]
        }
        if (q < n-1) && (h[q+1].Exp < h[q].Exp) { //q<n-1 确保q+1不超出不超出n-1 左大于右
            q = q + 1 //用相邻的两个值的小值的下标
        }

        if h[q].Exp < h[p].Exp { //用最小的值比较 确保最小的值放在数组的最前面
            t := h[p] //交换
            h[p] = h[q]
            h[q] = t
            p = q //存的是最小的值
        } else {
            break
        }
    }
}
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页

打赏作者

qinzhao168

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值