一、topK python实现
def topk(k, lst):
top = [0 for i in range(k)] #生成一个长度为K 的有序列表
for item in lst: #循环将要取 排行榜的列表
for i in range(k-1,-1, -1):
if item > top[i]: #在top 表中找到他的位置并插入
top.insert(i+1,item)
top.pop(0) #删除值最小 索引为0的元素
break #找到了就打断 print(top)
return top import random
lst = [i for i in range(100)]
random.shuffle(lst) #打乱列表
print(lst) topk(10,lst) # 运行结果:
[73, 63, 1, ......, 57, 9, 16, 85...... 40, 20, 97,... 84, 76, 87, 22, ......, 65, 93]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

 

二、小根堆实现Topk 排行榜

###堆排序原理点击这儿查看本文

从一大堆数据里面输出前十,或者前 k 排行榜

- 实现思路:

取列表前十(k)构造一个小根堆 新列表, 然后从列表的第 10+1 (k+1)个位置往后循环,将每一个元素都同小根堆,根节点最小值做比较,如果比他大,说明该值应该在排行榜中,

将原根节点去掉换成换成该值,然后调整一次堆,直到拿来排行的列表循环结束,里面存储了Top 10 (k)然后将存了top值的小根堆排序,返回就好了

  • 下面程序,堆实现Top4, 你传入什么就实现什么
def heapsort(data, parent , high):

    new_par_node = parent
j = 2*parent +1 while j <= high: if j< high and data[j+1] < data[j]: #建立小根堆
j += 1
if data[j] < data[new_par_node]: #建立小根堆
data[j], data[new_par_node] = data[new_par_node], data[j]
new_par_node = j
j = 2*j +1
else:
break def topk(k, lst):
data = lst[:k]
last_par_node = k//2 -1
for node in range(last_par_node,-1, -1):
heapsort(data, node, k-1) for item in lst[k:]: #每一次从排行列表中选择一个元素出来
if item > data[0]: #如果他比 根节点大,说明他在排行榜中,把小顶(根节点最小值)去掉
data[0] = item
heapsort(data, 0, k-1) #再 重调整 小根堆 index = len(data) -1
while index >= 0:
# 将小根堆降序 排序, 交换 根节点和最后的索引值
data[0], data[index] = data[index], data[0]
heapsort(data, 0, index-1) #重调整 小根堆
index = index -1 #无序区减一, 有序区多了一个 return data top4 = topk(4, [2, 4, 1, 10, 23, 3, 4, 43,17])
print(top4) # Top 4 排行榜前四为
[43, 23, 17, 10]

现有n 个乱序数,都大于 1000 ,让取排行榜前十,时间复杂度为o(n), top10, 或者 topK,应用场景榜单Top:10,堆实现Top k的更多相关文章

  1. 最快效率求出乱序数组中第k小的数

    题目:以尽量高的效率求出一个乱序数组中按数值顺序的第k 的元素值 思路:这里很容易想到直接排序然后顺序查找,可以使用效率较高的快排,但是它的时间复杂度是O(nlgn),我们这里可以用一种简便的方法,不 ...

  2. Oracle 查询 in条件个数大于1000的解决方案

    Oracle 查询 in条件个数大于1000的解决方案,我所了解的有如下四种: 1. 把in分组再or: 思路:如果list的长度为2000,可以500个分一组,就有4个组,这4个组之间再or即可. ...

  3. 存储过程:当基站ID大于1000的时候,把ID通过存储过程插入表,然后处理

    不推荐这么弄,没办法,项目逼到这了,以后尽量避免这样的需求发生! CREATE OR REPLACE PROCEDURE insert_tempStation_proc(v_instr in clob ...

  4. [关于SQL]查询成绩都大于80分的学生

    1.用一条SQL语句 查询出每门课都大于80分的学生姓名name kecheng fenshu张三 语文 81张三 数学 75李四 语文 76李四 数学 90王五 语文 81王五 数学 100王五 英 ...

  5. 用一条SQL语句查出每门课都大于80分的学生的姓名

    用一条SQL语句查出每门课都大于80分的学生的姓名,数据表结构如下: 建表SQL如下: ; -- ---------------------------- -- Table structure for ...

  6. 一个SQL查询出每门课程的成绩都大于80的学生姓名

    name   kecheng    fenshu 张三     语文     81 张三     数学     75 李四     语文     76 李四     数学     90 王五     ...

  7. 【mysql经典题目】科目成绩都大于80分\每个科目的第一名\总成绩排名

    参考:http://blog.csdn.net/lifushan123/article/details/44948135 1.查询出科目成绩都大于80分的学生的名字? drop table if EX ...

  8. Help Tomisu UVA - 11440 难推导+欧拉函数,给定正整数N和M, 统计2和N!之间有多少个整数x满足,x的所有素因子都大于M (2<=N<=1e7, 1<=M<=N, N-M<=1E5) 输出答案除以1e8+7的余数。

    /** 题目:Help Tomisu UVA - 11440 链接:https://vjudge.net/problem/UVA-11440 题意:给定正整数N和M, 统计2和N!之间有多少个整数x满 ...

  9. orancle数据库 插入数量 值大于 1000 解决方案

    存储过程:当基站ID大于1000的时候,把ID通过存储过程插入表,然后处理 不推荐这么弄,没办法,项目逼到这了,以后尽量避免这样的需求发生! CREATE OR REPLACE PROCEDURE i ...

随机推荐

  1. Ubuntu下启动 Redis时, 提示 "Can't open the log file: Permission denied failed"

    问题来源:在删除var目录下的log文件时,将redis文件夹删除了.然后在重启时:/etc/init.d/redis-server start,提示: Starting redis-server: ...

  2. LeetCode算法题-Single Number(Java实现)

    这是悦乐书的第175次更新,第177篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第34题(顺位题号是136).给定一个非空的整数数组,除了一个元素外,每个元素都会出现两 ...

  3. vue原理简介

    写vue也有一段时间了,对vue的底层原理虽然有一些了解,这里总结一下. vue.js中有两个核心功能:响应式数据绑定,组件系统.主流的mvc框架都实现了单向数据绑定,而双向绑定无非是在单向绑定基础上 ...

  4. iOS弹出UIViewController小视图

    在TestViewController1中弹出TestViewController2 在TestViewController中点击按钮或者什么触发方法里面写入以下代码 TestViewControll ...

  5. PHP 缓存技术(一)

    移除光盘

  6. SQL INNER JOIN 关键字

    SQL INNER JOIN 关键字 在表中存在至少一个匹配时,INNER JOIN 关键字返回行. INNER JOIN 关键字语法 SELECT column_name(s) FROM table ...

  7. swift Class的内存布局

    class Human { //8 type or isa //retainCount var age: Int?//16 var name: String?//16 var nicknames: [ ...

  8. java读取properties中文乱码

    1 确认properties文件的编码是utf-8 2 采用流的方式读取文件,设置编码为utf-8 public class ErrorCodeConfig { static Properties p ...

  9. Python字符串 u"string",r"string"的写法含义

    1.字符串前加 u = unicode编码 例:u"我是含有中文字符组成的字符串." 作用:后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格 ...

  10. BZOJ3110:[ZJOI2013]K大数查询(整体二分)

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位 ...