基于Python3的数据结构与算法 - 06 topk问题

一、引入

问题:目前共有n个数,设计算法得到前k大的数。(m<n)

解决思路:

  1. 排序后切片:O(n*logn+m) = O(n*logn)
  2. 排序LowB三人组:O(mn)  例如冒泡排序,交换m次,即可取前m大的数字;对于插入排序,维护一个长度为100的列表,将其排好序,再依次遍历其他数,将插入的数字放入其中,后面的数字往后挪;选择排序我们选择100次。
  3. 堆排序:O(nlogk)

二、堆排序解决思路

  1. 取列表前k个元素建立一个小根堆(从小到大),其堆顶就是目前第K大的元素。
  2. 依次向后遍历原列表,对于列表中的元素,如果小于堆顶,则忽略该元素;如果大于堆顶,则将堆顶更换为该元素,并且对堆进行一次调整。
  3. 最后能确保小根堆是我们需要的前K大的数。
  4. 遍历列表的所有元素后,倒序(因为是小根堆)弹出列表。

示例代码如下:

import random# 调整为小根堆
def sift(li, low, high):  # 向下调整函数;初始条件应该为除了根节点,下面的子堆默认为有序的i = low  # i最开始指向根节点j = 2 * i + 1  # 左孩子tmp = li[low]  # 将堆顶元素存起来while j <= high:  # 只要j上面有数,没跑到结构外if j + 1 <= high and li[j + 1] < li[j]:  # 存在右孩子,且右孩子比左孩子大;不能交换j = j + 1  # j指向有孩子if li[j] < tmp:li[i] = li[j]  # 换数i = j  # 往下看一层j = 2 * i + 1else:  # 此时tmp更大,将tmp放回原位li[i] = tmpbreak  # 直接退出,因为sift默认下面就是堆的情况下else:  # 两种退出循环的条件;当其越界li[i] = tmpdef topk(li, k):heap = li[0:k]# 1.取前K个元素构建小根堆for i in range((k - 2) // 2, -1, -1):sift(heap, i, k - 1)# 依次向后遍历原列表,如果小于堆顶,忽略;如果大于堆顶,进行交换,交换之后再进行一次调整for i in range(k, len(li)):if li[i] > heap[0]:heap[0] = li[i]sift(heap, 0, k - 1)# 遍历完所有元素后,倒序弹出for i in range(k - 1, -1, -1):heap[0], heap[i] = heap[i], heap[0]sift(heap, 0, i - 1)return heapli = [i for i in range(1000)]
random.shuffle(li)
print(li)
print(topk(li, 10))

输出结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/499323.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

印刷行业实施MES管理系统有哪些重要的意义

随着科技的飞速发展和市场需求的不断变化&#xff0c;印刷行业正面临着前所未有的挑战和机遇。为了在激烈的市场竞争中立于不败之地&#xff0c;印刷企业急需通过引入先进的管理系统来提升生产效率、优化资源配置、确保产品质量。而万界星空科技MES正是这样一种能够帮助印刷企业…

力扣:9. 回文数

力扣&#xff1a;9. 回文数 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&#xf…

面试经典150题——合并区间

​"Do not wait to strike till the iron is hot; but make it hot by striking." - William Butler Yeats 1. 题目描述 2. 题目分析与解析 2.1 思路一 还是先来分析题目&#xff0c;观察一下重叠的区间和不重叠的区间数组之间的关系是什么&#xff1a; 比如区间…

Mendix 开发实践指南|Mendix的核心概念

在当今快速变化的技术环境中&#xff0c;Mendix平台以模型驱动开发方法&#xff0c;重新定义了应用程序的构建过程。本章内容&#xff0c;将深入探讨Mendix的几大核心概念&#xff1a;模型驱动开发、微流、纳流 、 实体模型和页面&#xff0c;旨在帮助我们全面理解Mendix平台的…

Windows虚拟主机如何开启网页debug模式

前不久&#xff0c;有客户咨询想要知道如何开启网页debug模式,以便后期他网站出现异常可以自行排查。这边了解到他当前使用的是Hostease 的Windows 虚拟主机&#xff0c;而开启网页debug模式的操作步骤如下&#xff1a; 1.Hostease的Windows虚拟主机都是带Plesk面板的,因此需要…

本届挑战赛亚军方案:面向微服务架构系统中无标注、多模态运维数据的异常检测、根因定位与可解释性分析

CheerX团队来自于南瑞研究院系统平台研发中心&#xff0c;中心主要从事NUSP电力自动化通用软件平台的关键技术研究与软件研发。 选题分析 图1 研究现状 本次CheerX团队的选题紧密贴合了目前的运维现状。实际运维中存在多种问题导致运维系统的不可用。比如故障发生时&#xff…

C语言:字符函数 字符串函数 内存函数

C语言&#xff1a;字符函数 & 字符串函数 & 内存函数 字符函数字符分类函数字符转换函数tolowertoupper 字符串函数strlenstrcpystrcatstrcmpstrstrstrtok 内存函数memcpymemmovememsetmemcmp 字符函数 顾名思义&#xff0c;字符函数就是作用于字符的函数&#xff0c;…

1.1 编程环境的安装

汇编语言 汇编语言环境部署 第二个运行程序直接双击安装一直下一步即可MASM文件复制到D盘路径下找到dosbox安装路径&#xff1a;C:\Program Files (x86)\DOSBox-0.74找到该文件双击打开它&#xff0c;修改一下窗口大小 把这两行改成如下所示 运行dos&#xff0c;黑框中输入mou…

打造去中心化透明储蓄罐:Solidity智能合约的又一实践

一、案例背景 传统的储蓄罐通常是由个人或家庭使用&#xff0c;用于存放硬币或小额纸币。然而&#xff0c;这样的储蓄罐缺乏透明性&#xff0c;用户无法实时了解储蓄情况&#xff0c;也无法确保资金的安全性。 通过Solidity智能合约&#xff0c;我们可以构建一个去中心化…

园区能耗监测管控平台

园区能耗监测管控平台是一种基于先进科技的能源管理系统&#xff0c;旨在帮助园区实现能源消耗的精准监测和高效管控。这一平台集成了能耗监测、数据分析、远程控制等功能&#xff0c;为园区管理者提供了全方位的能源管理解决方案&#xff0c;助力园区实现节能减排、降低成本的…

vue3使用echarts绘制地图

vue3使用echarts绘制地图 安装echarts npm install echarts下载地图的json数据【我这里是把json数据单独粘出来然后新建了一个文件china.json】 下载中国及各个省份的地图数据引入 import chinaJson from ./china.json绘制地图 <template><div ref"myChart&q…

Windows WMI详解

WMI简介 WMI ( Windows Management Instrumentation, Windows管理规范)是Windows 2000/XP管理系统的核心&#xff0c;属于管理数据和操作的基础模块。设计WMI的初衷是达到一种通用性&#xff0c;通过WM操作系统、应用程序等来管理本地或者远程资源。它支持分布式组件对象模型(…