算法与数据结构(二十五)TopK问题:基于快排的Python模板

首先,先写partition模板

def partition(nums, left, right):pivot = nums[left]#初始化一个待比较数据i,j = left, rightwhile(i < j):while(i<j and nums[j]>=pivot): #从后往前查找,直到找到一个比pivot更小的数j-=1nums[i] = nums[j] #将更小的数放入左边while(i<j and nums[i]<=pivot): #从前往后找,直到找到一个比pivot更大的数i+=1nums[j] = nums[i] #将更大的数放入右边#循环结束,i与j相等nums[i] = pivot #待比较数据放入最终位置 return i #返回待比较数据最终位置

1. 快速排序

复习一下快速排序:

#快速排序
def quicksort(nums, left, right):if left < right:index = partition(nums, left, right)quicksort(nums, left, index-1)quicksort(nums, index+1, right)arr = [1,3,2,2,0]
quicksort(arr, 0, len(arr)-1)
print(arr) 

2. topk切分

将快速排序改成快速选择,即我们希望寻找到一个位置,这个位置左边是k个比这个位置上的数更小的数,右边是n-k-1个比该位置上的数大的数,我将它命名为topk_split,找到这个位置后停止迭代,完成了一次划分。

def topk_split(nums, k, left, right):#寻找到第k个数停止递归,使得nums数组中index左边是前k个小的数,index右边是后面n-k个大的数if (left<right):index = partition(nums, left, right)if index==k:return elif index < k:topk_split(nums, k, index+1, right)else:topk_split(nums, k, left, index-1)

接下来就依赖于上面这两个函数解决所有的topk问题

3. 获得前k小的数

#获得前k小的数
def topk_smalls(nums, k):topk_split(nums, k, 0, len(nums)-1)return nums[:k]arr = [1,3,2,3,0,-19]
k = 2
print(topk_smalls(arr, k))
print(arr)

4. 获取第k小的数

#获得第k小的数
def topk_small(nums, k-1):topk_split(nums, k, 0, len(nums)-1)return nums[k] arr = [1,3,2,3,0,-19]
k = 3
print(topk_small(arr, k))
print(arr)

5. 获得前k大的数

#获得前k大的数 
def topk_larges(nums, k):#parttion是按从小到大划分的,如果让index左边为前n-k个小的数,则index右边为前k个大的数topk_split(nums, len(nums)-k, 0, len(nums)-1) #把k换成len(nums)-kreturn nums[len(nums)-k:] arr = [1,3,-2,3,0,-19]
k = 3
print(topk_larges(arr, k))
print(arr)

6. 获得第k大的数

#获得第k大的数 
def topk_large(nums, k):#parttion是按从小到大划分的,如果让index左边为前n-k个小的数,则index右边为前k个大的数topk_split(nums, len(nums)-k, 0, len(nums)-1) #把k换成len(nums)-kreturn nums[len(nums)-k] arr = [1,3,-2,3,0,-19]
k = 2
print(topk_large(arr, k))
print(arr)

7. 只排序前k个小的数

#只排序前k个小的数
#获得前k小的数O(n),进行快排O(klogk)
def topk_sort_left(nums, k):topk_split(nums, k, 0, len(nums)-1) topk = nums[:k]quicksort(topk, 0, len(topk)-1)return topk+nums[k:] #只排序前k个数字arr = [0,0,1,3,4,5,0,7,6,7]
k = 4
topk_sort_left(arr, k)

8. 只排序后k个大的数

#只排序后k个大的数
#获得前n-k小的数O(n),进行快排O(klogk)
def topk_sort_right(nums, k):topk_split(nums, len(nums)-k, 0, len(nums)-1) topk = nums[len(nums)-k:]quicksort(topk, 0, len(topk)-1)return nums[:len(nums)-k]+topk #只排序后k个数字arr = [0,0,1,3,4,5,0,-7,6,7]
k = 4
print(topk_sort_right(arr, k))

参考文献

[1] Leetcode 题解

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

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

相关文章

自然语言处理:电脑如何理解我们的语言?

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 ​ 文章目录 ​编辑 常见方法 1.基于词典的方法 2.基于计数的方法 基于推理的方法 Bert input_ids attention_mask token_type_ids 结语 在广…

世岩清上:学校课件视频制作的要点

学校课件视频制作是一项结合教学理念、内容设计和多媒体技术的综合性工作。以下是一些要点&#xff0c;帮助你更好地进行课件视频制作。 一、明确教学目标 在制作课件视频前&#xff0c;要明确教学目标和内容&#xff0c;确保视频能够满足学生的学习需求。同时&#xff0c;要…

iosapp网站是干什么的呢?

iOSAPP网站是指针对苹果iOS系统的应用程序下载和分享网站。由于iOS系统的封闭性和严格的审核机制&#xff0c;使得iOSAPP的下载和分享相对较难。因此&#xff0c;一些专门的iOSAPP网站应运而生&#xff0c;为用户提供方便快捷的下载和分享服务。 在线生成ipa文件 一、iOSAPP网…

排序算法介绍(五)归并排序

0. 简介 归并排序&#xff08;Merge Sort&#xff09;是一种分治思想的应用&#xff0c;它将待排序的数组不断拆分成小数组&#xff0c;直到每个小数组只有一个元素&#xff0c;然后将小数组两两合并&#xff0c;直到最终得到有序的数组。 1. 归并排序的实现 归并排序的基本思…

【2021研电赛】基于EAIDK310的视觉导航自动驾驶小车

本作品介绍参与极术社区的有奖征集|分享研电赛作品扩大影响力&#xff0c;更有重磅电子产品免费领取! 团队价绍 参赛单位&#xff1a;上海应用技术大学 参赛队伍&#xff1a;EAIDK666 指导老师&#xff1a;蒋文萍 丁肇红 参赛队员&#xff1a;温晓静 孙亦劼 杜为栋 获奖情况&a…

JS防抖与节流

防抖 防抖是什么&#xff1f; 单位时间内&#xff0c;频繁触发事件&#xff0c;只执行最后一次 通俗易懂点就是把防抖想象成MOBA游戏的回城&#xff0c;在回城过程中被打断就要重来 例子&#xff1a;我们来做一个效果&#xff0c;我们鼠标在盒子上移动&#xff0c;数字就变化 …

Python爬虫:使用Scrapy框架进行高效爬取

Python爬虫可使用的架构有很多&#xff0c;对于我而言&#xff0c;经常使用Scrapy异步处理框架Twisted&#xff0c;其实意思很明确&#xff0c;Scrapy可以实现多并发处理任务&#xff0c;同一时间将可以处理多个请求并且大大提高工作效率。 Scrapy是一个强大且高效的Python爬虫…

鸿蒙Watch 页面跳转

新建页面 config.json 回自动注册 添加跳转 <button type"capsule" onclick"toStatusMonitor">状态检测</button>写跳转方法 import router from system.router;export default {data: {},onInit() {},onShow() {},toStatusMonitor() {rou…

深度学习——第3章 Python程序设计语言(3.2 Python程序流程控制)

无论是在机器学习还是深度学习中&#xff0c;Python已经成为主导性的编程语言。而且&#xff0c;现在许多主流的深度学习框架&#xff0c;例如PyTorch、TensorFlow也都是基于Python。本课程主要是围绕“理论实战”同时进行&#xff0c;所以本章将重点介绍深度学习中Python的必备…

pandas、numpy的几个示例

这里写自定义目录标题 Pandas 示例NumPy 示例数据分析案例: Iris 数据集 Pandas 示例 Pandas 是一个数据处理和分析的库&#xff0c;它提供了 DataFrame 和 Series 这两种主要数据结构。 # 从字典创建 DataFrame import pandas as pd# 创建一个字典 data {Name: [Alice, Bob…

C++学习之路(十七)C++ 用Qt5实现一个工具箱(增加托盘图标并且增加显示和退出菜单)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《为屏幕颜色提取功能增加一个点击复制的功能》功能。今天我们增加一个比较正式点的功能&#xff0c;就是增加托盘图标并且增加显示和退出菜单&#xff08;越来越像回事了吧 &#x1f601; &#xff09;。下面我们就来…

【CMD】关于在for中SET变量失效的问题

如题&#xff0c;在for中进行一些细化操作时发现SET变量一直不成功(尤其在读取文件时)   简单搜了下看到有个帖子(BAT求助与讨论-SET变量失效)是讨论这个问题的&#xff0c;然后有个老哥给出的解答&#xff0c;其中使用了使用CALL&#xff0c;这让我想起几天前看到的一个博客…

二维table表的快速使用

<el-table :data"sentimentData" style"width: 680px"><el-table-columnfixedprop"name"label"区域"width"100"><template slot-scope"scope">{{ scope.row.name }}</template></el-t…

Linux4.7、环境变量

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 基本概念 见见环境变量 指令原理 常见环境变量及其测试 环境变量相关指令 环境变量组织方式 通过代码获取环境变量 通过系统变量获取环境变量以及设置环境变量 环境变量的全局属性 基本概念 首先&#xff0c;…

什么?居然可以免费使用Jetbrains?!

JetBrains是一家捷克的软件开发公司&#xff0c;该公司位于捷克的布拉格&#xff0c;并在俄罗斯的圣彼得堡及美国麻州波士顿都设有办公室&#xff0c;该公司最为人所熟知的产品是Java编程语言开发撰写时所用的集成开发环境&#xff1a;IntelliJ IDEA。 如下是jetbrains旗下的产…

【笔记】Clion 中运行 C/C++11 之 CMakeLists.txt 的配置

该文章记录第一次使用 Clion 时&#xff0c;对 CMakeLists 的配置&#xff0c;使其能够运行 C/C11 的代码。 一. CMakeLists.txt 的配置 1、首先我们在需要新建一个项目 2、填写新建项目相关的信息 3、修改 CMakeLists.txt 文件内容 替换文本&#xff1a; # 使用此 CMakeLis…

帆软报表不能增加SAP连接方式 通过插件一致性检测 同步至本地解决

帆软报表开发人员需要增加一个SAP数据连接方式&#xff1a;SAP_ECC_600环境 在服务器端不能直接增加&#xff0c;而在帆软报表设计器切换到远程模式时&#xff0c;又不能显示SAP连接&#xff0c;导致不能增加。 解决&#xff1a;重新进入帆软报表报计器时报以下错误&#xff0c…

开源运维监控系统-Nightingale(夜莺)应用实践(未完)

一、前言 某业务系统因OS改造,原先的Zabbix监控系统推倒后未重建,本来计划用外部企业内其他监控系统接入,后又通知需要自建才能对接,考虑之前zabbix的一些不便,本次计划采用一个类Prometheus的监控系统,镜调研后发现Nightingale兼容Prometheus,又有一些其他功能增强,又…

jvm的2种赋值机制

jvm两种赋值机制&#xff1a; 1 基本类型赋值 值传递&#xff1a;值拷贝 这个值就是数据&#xff0c;而且相互不影响 独立空间 栈中 int n110; n2n1; n280; //n2的变化不会影响n…

java封装详解

/*** Description 封装详解*/ package com.oop;import com.oop.demo04.Student; /*1.提高程序的安全性&#xff0c;保护数据2.隐藏代码的实现细节3.统一接口4.系统可维护增加了*/ public class Application {public static void main(String[] args) {Student s1 new Student(…