当前位置: 首页 > news >正文

算法与数据结构(二十五)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 题解

相关文章:

  • 使用正则表达式时-可能会导致性能下降的情况
  • 文字处理工具Word mac软件特点
  • 【LeeCode】438.找到字符串中所有字母异位词
  • Opencv获取笔记本摄像头
  • 知识点滴 - 什么是AECS-PRM
  • JVM中 Minor GC 和 Full GC 的区别
  • 【报名】2023产业区块链生态日暨 FISCO BCOS 开源六周年生态大会
  • centos用什么命令可查看版本号
  • 【西南交大swjtu微机与接口技术实验】D/A变换实验实验三:波形发生器
  • 【DevOps】Jenkins:配置jenkins 流水线/多分支流水线任务构建成功通知企业微信@相关人(二)
  • 【超详细教程】基于html+js实现轮播图
  • 关于如何解决问题?代码习惯。
  • Jupyter NoteBook未授权访问漏洞
  • 制作一个RISC-V的操作系统三-编译与链接
  • 后端部署-阿里云服务器-开设端口-域名解析-安全证书-备案
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Android交互
  • ESLint简单操作
  • Javascript 原型链
  • JavaScript设计模式系列一:工厂模式
  • Java读取Properties文件的六种方法
  • js 实现textarea输入字数提示
  • leetcode98. Validate Binary Search Tree
  • MYSQL 的 IF 函数
  • nfs客户端进程变D,延伸linux的lock
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • SQLServer之创建数据库快照
  • 包装类对象
  • 读懂package.json -- 依赖管理
  • 分享几个不错的工具
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 计算机在识别图像时“看到”了什么?
  • 记录:CentOS7.2配置LNMP环境记录
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 微信小程序实战练习(仿五洲到家微信版)
  • 转载:[译] 内容加速黑科技趣谈
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • (2)(2.10) LTM telemetry
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (六)激光线扫描-三维重建
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • .NET 4.0中的泛型协变和反变
  • .net6 webapi log4net完整配置使用流程
  • .Net6使用WebSocket与前端进行通信
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • [AIGC] MySQL存储引擎详解
  • [Asp.net mvc]国际化
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [C语言][PTA基础C基础题目集] strtok 函数的理解与应用
  • [HarmonyOS]第一课:从简单的页面开始