现有n 个乱序数,都大于 1000 ,让取排行榜前十,时间复杂度为o(n), top10, 或者 topK,应用场景榜单Top:10,堆实现Top k
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]
从一大堆数据里面输出前十,或者前 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的更多相关文章
- 最快效率求出乱序数组中第k小的数
题目:以尽量高的效率求出一个乱序数组中按数值顺序的第k 的元素值 思路:这里很容易想到直接排序然后顺序查找,可以使用效率较高的快排,但是它的时间复杂度是O(nlgn),我们这里可以用一种简便的方法,不 ...
- Oracle 查询 in条件个数大于1000的解决方案
Oracle 查询 in条件个数大于1000的解决方案,我所了解的有如下四种: 1. 把in分组再or: 思路:如果list的长度为2000,可以500个分一组,就有4个组,这4个组之间再or即可. ...
- 存储过程:当基站ID大于1000的时候,把ID通过存储过程插入表,然后处理
不推荐这么弄,没办法,项目逼到这了,以后尽量避免这样的需求发生! CREATE OR REPLACE PROCEDURE insert_tempStation_proc(v_instr in clob ...
- [关于SQL]查询成绩都大于80分的学生
1.用一条SQL语句 查询出每门课都大于80分的学生姓名name kecheng fenshu张三 语文 81张三 数学 75李四 语文 76李四 数学 90王五 语文 81王五 数学 100王五 英 ...
- 用一条SQL语句查出每门课都大于80分的学生的姓名
用一条SQL语句查出每门课都大于80分的学生的姓名,数据表结构如下: 建表SQL如下: ; -- ---------------------------- -- Table structure for ...
- 一个SQL查询出每门课程的成绩都大于80的学生姓名
name kecheng fenshu 张三 语文 81 张三 数学 75 李四 语文 76 李四 数学 90 王五 ...
- 【mysql经典题目】科目成绩都大于80分\每个科目的第一名\总成绩排名
参考:http://blog.csdn.net/lifushan123/article/details/44948135 1.查询出科目成绩都大于80分的学生的名字? drop table if EX ...
- 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满 ...
- orancle数据库 插入数量 值大于 1000 解决方案
存储过程:当基站ID大于1000的时候,把ID通过存储过程插入表,然后处理 不推荐这么弄,没办法,项目逼到这了,以后尽量避免这样的需求发生! CREATE OR REPLACE PROCEDURE i ...
随机推荐
- Linux CFS调度器之虚拟时钟vruntime与调度延迟--Linux进程的管理与调度(二十六)
1 虚拟运行时间(今日内容提醒) 1.1 虚拟运行时间的引入 CFS为了实现公平,必须惩罚当前正在运行的进程,以使那些正在等待的进程下次被调度. 具体实现时,CFS通过每个进程的虚拟运行时间(vrun ...
- c/c++ 标准容器 forward_list resize 操作
c/c++ 标准容器 forward_list, resize, 重新定位迭代器 1,forward_list特有的方法: insert_after emplace_after erase_after ...
- 类中的 this关键字
this可用于区分局部变量和成员变量,因为构造函数中如果使用 this.成员变量 = 参数值, 那么可以在new对象时,将初始化值赋值给成员变量,否则成员变量赋值失败, 所以this可以区分成员变量和 ...
- [BZOJ 2759] 一个动态树好题
[BZOJ 2759] 一个动态树好题 题目描述 首先这是个基环树. 然后根节点一定会连出去一条非树边.通过一个环就可以解除根的答案,然后其他节点的答案就可以由根解出来. 因为要修改\(p_i\),所 ...
- vue methods 中方法的相互调用
vue在同一个组件内:方法之间经常需要互相调用. methods中的一个方法如何调用methods中的另外一个方法呢? 可以在调用的时候使用 this.$options.methods.test2( ...
- [找工作] 2019秋招|从春招到秋招,Java岗经验总结(收获AT)
转自(有更多) https://blog.csdn.net/zj15527620802/article/month/2018/10 前言 找工作是一件辛酸而又难忘的历程.经历过焦虑.等待.希望,我们最 ...
- 002_浅析python 中__name__ = '__main__' 的作用
很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...
- java通过百度AI开发平台提取身份证图片中的文字信息
废话不多说,直接上代码... IdCardDemo.java package com.wulss.baidubce; import java.io.BufferedReader; import jav ...
- app前端代码打包步骤
一.搭建项目环境 1.安装node.js 在网上找到nodejs压缩包,下载解压后安装node-v8.9.3-x64.msi文件. 安装完毕后,在windows的cmd控制台输入node -v或nod ...
- JAVA Exception
博客背景音乐设置 晴天博客(酷)