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












网友评论