美文网首页
TOP-N搜索排序算法

TOP-N搜索排序算法

作者: 罗泽坤 | 来源:发表于2020-03-26 20:44 被阅读0次

此算法应用场景:
比如在各种搜索引擎中输入关键词之后与之相匹配的数据有成千上万甚至几百万条,但这么多的数据中其实能让用户真正感兴趣有价值的也就这么N条,那么搜索引擎中如何把最有价值的N条数据优先展现给用户嘞?大家肯定会想到根据各种指标比如热度,点击率等等来进行一个排序,那么从技术角度来说我们关注的当然就是如何排序更有效率,比如传统的冒泡排序,快速排序,等等,这些算法当然都是可以的,但是这些算法的排序通常都是针对所有数据来说的,当数据量很大的时候其时间复杂度就有点惊人了,冒泡排序的时间复杂度为o(n^2),快速排序的时间复杂度为nlogn级别的,而下面介绍的top-N算法其时间复杂度为nlogN级别的。

此算法的中心思想及实现过程:
一、先构建一个N个节点的最小顶堆二叉树,使得父节点的
值比其左右孩子 的节点值都小,此时的二叉树的N个节点中顶端节点的值最小。
二、将N个节点以外的元素与根节点作比较如果比根节点大则把该元素变成新的根节点
三、调整新根节点树使得其满足最小顶堆二叉树
四、重复二三过程直至遍历所有数据
此算法只关心最有价值的N条数据忽略其他的数据原算法并没有对这N条数据排序,为了更好的给用户推荐内容可以对TOP-N条数据进行排序推荐给用户。具体代码实现如下。

class TopN:
    def parent(self,n):
        #父节点下标
        return int((n-1)/2)
    def left(self,n):
       # 左节点下标
        return 2*n+1
    # 右节点下标
    def right(self,n):
        return 2*n+2
    # 构建小顶堆保证左右子节点小于其父节点
    def MinTopTree(self,n,data):
        for i in range(1,n):
            j = i
            while j!=0 and data[j]<data[self.parent(j)]:
                temp = 0
                temp = data[self.parent(j)]
                data[self.parent(j)] = data[j]
                data[j] = temp
                j = self.parent(j)
        return data
    # 将其他值与最小顶推比较替换data[0]值
    def ReMinTopTree(self,size,n,data):
        #data = self.MinTopTree(n,data)
        for i in range(n,size):
            if data[i]>data[0]:
              #  temp = 0
                temp = data[0]
                data[0] = data[i]
                data[i] = temp
                t = 0
                #(data[t]>data[self.right(t)] and self.right(t)<n) or (data[t]>data[self.left(t)] and data[self.left(t)]<n)这样会越界
                #(self.left(t) < n and data[self.left(t)] < data[t]) or (self.right(t) < n and data[self.right(t)] < data[t])
                while ((self.left(t) < n and data[self.left(t)] < data[t]) or (self.right(t) < n and data[self.right(t)] < data[t])):
                    # 替换右孩子
                    if data[self.right(t)]<data[self.left(t)] and self.right(t)<n:
                        #temp = 0
                        temp = data[t]
                        data[t] = data[self.right(t)]
                        data[self.right(t)] = temp
                        t = self.right(t)
                        
                    else:
                       #替换左孩子
                        # temp = 0
                        temp = data[t]
                        data[t] = data[self.left(t)]
                        data[self.left(t)] = temp
                        t = self.left(t)
                        
        return data

top = TopN()
data = [21,1,10,17,28,19,9,30,27,6,44,20]
r1 = top.MinTopTree(7,data)
print(r1)
r2 = top.ReMinTopTree(n=7,size=12,data=r1)
print(r2)
[1, 17, 9, 21, 28, 19, 10, 30, 27, 6, 44, 20]
[19, 21, 20, 44, 28, 27, 30, 1, 9, 6, 10, 17]

github 代码地址

https://github.com/luozekun1230/MyPyhonProgram/tree/master/Python%E5%9F%BA%E7%A1%80

相关文章

  • TOP-N搜索排序算法

    此算法应用场景:比如在各种搜索引擎中输入关键词之后与之相匹配的数据有成千上万甚至几百万条,但这么多的数据中其实能让...

  • 学习js数据结构与算法8—排序与搜索算法

    排序和搜索算法 排序算法

  • 程序员应该掌握哪些算法

    程序员必须掌握的常用算法,主要包括以下内容: 算法: 1、排序算法:快速排序、归并排序、计数排序 2、搜索算法:回...

  • 算法汇总

    关于算法: 基础技巧:分治、二分、贪心排序算法:快速排序、归并排序、计数排序搜索算法:回溯、递归、深度优先遍历,广...

  • 算法与数据结构简介

    0x01 算法 基础技巧:分治、二分、贪心 排序算法:快速排序、归并排序、计数排序 搜索算法:回溯、递归、深度优先...

  • 离散数学及应用——算法、整数、矩阵

    算法 算法是进行一项计算或解决一个问题的一组有限多条准确的指令。 搜索算法 线性搜索 二分搜索 排序 冒泡排序 冒...

  • 数据结构与算法 - 排序与搜索

    文章来源:数据结构与算法(Python) 排序与搜索排序算法(英语:Sorting algorithm)是一种能将...

  • day17_选择排序_数组的搜索算法

    选择排序 规律: 数组的搜索算法之二分搜索法

  • iOS数组排序方法

    先回忆一下,大学期间学到的排序算法你还记得多少??那先充电一下常用排序算法总结,当然,google搜索"排序算法"...

  • 淘宝SEO最新揭秘

    “现在的搜索将从原来以产品为维度的排序算法,慢慢转变为以店铺为维度的算法”——逍遥子 淘宝搜索里单个商品的排序更多...

网友评论

      本文标题:TOP-N搜索排序算法

      本文链接:https://www.haomeiwen.com/subject/vorhuhtx.html