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

2023-12-05

首先,先写partition模板

def partition(nums, left, right):
    pivot = nums[left]#初始化一个待比较数据
    i,j = left, right
    while(i < j):
        while(i<j and nums[j]>=pivot): #从后往前查找,直到找到一个比pivot更小的数
            j-=1
        nums[i] = nums[j] #将更小的数放入左边
        while(i<j and nums[i]< pivot): #从前往后找,直到找到一个比pivot更大的数
            i+=1
        nums[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)-k
    return 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)-k
    return 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 题解

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 将 3D 矩阵转换为级联 2D 矩阵

    我有一个3Dpython中的矩阵如下 import numpy as np a np ones 2 2 3 a 0 0 0 2 a 0 0 1 3 a 0 0 2 4 我想转换这个3D矩阵到一组2D矩阵 我努力了np reshape但这并没
  • 添加图例到散点图

    这个问题已经被问到了 但我想找到一个更清晰的解决方案 给定 X 是 100x2 数据 标签是标签向量 从 1 到 9 我绘制散点图如下 pl scatter X 0 X 1 c labels pl show 如何仅用一行代码添加图例来解释颜
  • 我是否必须覆盖子类中的所有数学运算符?

    我想在 Python 3 7 程序中创建一个简单的 Point2d 类 仅实现一些功能 我在一个 SO 答案中看到 我现在找不到 创建 Point 类的一种方法是重写complex所以我写了这个 import math class Poin
  • Python - 对象 MagicMock 不能在“await”表达式中使用

    当我尝试使用 MagicMock 在单元测试中模拟异步函数时 出现以下异常 类型错误 对象 MagicMock 不能在 await 表达式中使用 示例代码如下 source code class Service async def comp
  • XGBoost 产生预测结果和概率

    我可能正在文档中查看它 但我想知道 XGBoost 是否有办法生成结果的预测和概率 就我而言 我正在尝试预测多类分类器 如果我能返回Medium 88 那就太好了 分类器 中 预测概率 88 参数 params max depth 3 ob
  • TypeError:无法在 re.findall() 中的类似字节的对象上使用字符串模式

    我正在尝试学习如何自动从页面获取网址 在下面的代码中 我试图获取网页的标题 import urllib request import re url http www google com regex r pattern re compile
  • 使用 Pandas 读取带有额外逗号且没有 quotechar 的 CSV?

    Data from io import StringIO import pandas as pd s ID Level QID Text ResponseID responseText date key 375280046 S D3M Wh
  • 如何将字符串列表转换为正确的 Python 类型?

    给定一个 python 字符串列表 如何自动将它们转换为正确的类型 意思是 如果我有 hello 3 3 64 1 我希望将其转换为列表 hello 3 3 64 1 其中第一个元素是字符串 第二个元素是 int 第三个元素是 float
  • Python 字典不按顺序排列

    我创建了一个字母表字典 其值从0开始 并根据单词文件增加一定的量 我对最初的字典进行了硬编码 我希望它保持按字母顺序排列 但事实并非如此 我希望它按字母顺序返回字典 基本上与初始字典保持相同 我怎样才能保持秩序 from wordData
  • Python OO程序结构规划

    我是 OOP 的初学者 我想创建一个包含三个类 A B 和 C 的程序 该类的每个实例都由一组特征 Achar1 Achar2 等定义 该程序应该创建uses由 A 元素 B 元素和 C 元素以及开始日期和结束日期组成 A 和 B 都有子类
  • 如何在 Pandas 中将多列乘以一列

    我想拥有 df income 1 income 2 df mtaz proportion 返回这些列乘以df mtaz proportion 这样我就可以设置 df mtaz income 1 mtaz income 2 df income
  • 如何在 pygame 中水平翻转图像?

    这是在 pygame 如何翻转图像 假设一个图像 猪向右看 时向左看 我按向左箭头键 然后保持这样 即使我不按任何键或者按向上和向下箭头键 那么 当我按向右箭头键时 如何再次将其切换回向右看 并使其保持这种状态 即使我不按任何键或按向上和向
  • 如何在Python中将字符串转换为包含一个元素的列表[重复]

    这个问题在这里已经有答案了 我有一个字符串 我想将其转换为其中只有一个元素的列表 a abc print list a output a b c Expected o p abc 正确的做法是什么 只需使用 a abc b a print
  • 在地图类型中创建 DataFrame 分组列

    My 数据框具有以下结构 df spark createDataFrame B a 10 B b 20 C c 30 Brand Type Amount df show Brand Type Amount B a 10 B b 20 C c
  • 在硬件级别模拟按键 - Windows

    我正在寻找一种语言或库 使我能够在最大可能的水平上模拟击键 而无需实际按下按键 我对击键级别的具体衡量标准是 当我的计算机已经运行按键侦听器 例如鼠标键和粘滞键 时 它是否会产生与物理按键相同的输出 我尝试过很多击键模拟的方法 java A
  • 用python在pygame中制作一个8*8的棋盘

    我想用 python 在 pygame 中制作一个棋盘 只是带有 for 循环的棋盘 我尝试了多种方法来做到这一点 但我不知道它到底是什么 这是我的代码 import pygame pygame init set color with rg
  • API 调用时出现 UnicodeEncodeError (json)

    我正在尝试打印此 API 调用的结果 但收到 UnicodeEncodeError 可能是超级菜鸟问题 但非常感谢任何帮助 import http client import json api key hidden connection h
  • Pandas - 过滤器和正则表达式搜索 DataFrame 的索引

    我有一个 DataFrame 其中列是 MultiIndex 索引是名称列表 即index Andrew Bob Calvin 我想创建一个函数来返回数据帧中使用名称 Bob 或以字母 A 开头或以小写字母开头的所有行 如何才能做到这一点
  • 在ActivePython-2.6中安装pyCurl?

    我过去曾使用过 pyCurl 并让它与我的系统默认 python 安装一起使用 但是 我有一个项目需要 python 更具可移植性 并且我正在使用 ActivePython 2 6 到目前为止 我安装任何其他模块都没有问题 但安装 pyCu
  • 为什么 Pytest 对夹具参数执行嵌套循环

    使用 Pytest 我想编写一个测试函数 该函数接受多个装置作为参数 每个灯具都有几个参数 例如 test demo py 中是一个函数test squared is less than 10需要固定装置 negative integer

随机推荐

  • Windows命令行系列:网络命令

    ping ipconfig all 显示计算机网络情况 包括IP地址 DNA DHCP MAC地址等信息 release 释放IP地址 renew 重新获取IP地址 arp a 用于查看高速缓存中的所有项目 a IP 如果有多个网卡 那么使
  • 钱越来越难挣?这期程序员兼职干货没有水分!

    钱越来越难挣 程序员找兼职越来越难 结局只能指路美团 文末福利 还没看透职场 高薪 骗局 别人早就把精力放在了做副业上 兼职找不到 多半是经验不够 思路没打开 本篇文章 应该能让你茅塞顿开 收获颇丰 先喝点水 干货满满 下面容我娓娓道来 一
  • DDR详解

    DDR也就是常称的内存在一般使用过程中都是透明的 此文从多方面对DDR进行详解 DDR训练 高可靠性是系统级芯片SoC重要的质量和性能要求之一 SoC的复杂在于各个IP模块都对其产生至关重要的影响 从芯耀辉长期服务客户的经验来看 在客户的S
  • 比亚迪今年的薪资。。。

    综合自网络 网传比亚迪2022 2023 2024校招薪资 2024 届部分网友晒出的薪资 985本华五硕非f类 13k 1 36 12 985f本 9k 1 36 12 c9硕f类 18k 1 36 12 双非硕非f类 10k 1 36
  • 题解 | #0级用户高难度试卷的平均用时和平均得分#

    中煤科工开采研究院 大家有投中煤科工开采研究院的吗 一块交流交流 题解 按照格式输入并交换输出 include
  • Jquery如何获取和设置元素内容?

    在jQuery中 可以使用以下方法来获取和设置元素的内容 获取元素内容 text 获取元素的文本内容 包括其所有子元素的文本 var content div text html 获取元素的HTML内容 包括其所有子元素的HTML标记 var
  • U-BOOT移植的第一天

    编译NXP的UBOOT成功后 我们需要修改LCD 网络 DDR 接下来我们要在u boot添加自己的开发板 1 添加开发板默认配置文件 先在 configs 目录下创建默认配置文件 复制 mx6ull 14x14 evk emmc defc
  • Linux下设置redis临时密码和长期密码

    临时密码 第一步 先启动redis 命令 src redis server redis conf 第二步 进入redis 命令 src redis cli 第三步 查看密码 命令 config get requirepass 如果你redi
  • 基于Python手把手教你实现flappy bird游戏

    目录 前言 开始前的准备工作 进入正题 结束语 前言 想必玩过游戏的都知道 Flappy Bird是一款简单却富有挑战性的经典的小鸟飞行游戏 让许多玩家为之痴迷 而作为开发者 那肯定要通过技术手段来再做一遍这款经典游戏 那么本文就来通过万能
  • 英伟达高薪抢夺中国自动驾驶人才!吴新宙牵头,25大岗位!

    作者 有据无车 编辑 智能车参考 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 求职交流 技术交流群 本文只做学术分享 如有侵权 联系删文 英伟达 开始在中国加大自动驾驶布局 官方刚刚发布了
  • Linux下activemq的安装与安装成功确认

    一 下载 apache activemq 5 14 0 bin tar gz 二 安装 将压缩包拷入linux内 进行解压 tar zxvf apache activemq 5 14 0 bin tar gz 与redis nginx不同的
  • CnosDB 科技春晚暨CnosDB 2.4.0 Milky Way发布会|我们程序员也有自己的节目啦

    CnosDB即将举办科技春晚 也是CnosDB 2 4 0版本发布会啦 举办地点就由各位爱码士选在电影院 在此也感谢大家的支持和参与 01 场地剧透 本次发布会正式选择电影院为春晚主办地的现在 就让我们先来一场Venue Tour吧 以上是
  • MX6ULL学习笔记 (七) 中断实验

    前言 本章我们就来学习一 下如何在 Linux 下使用中断 在linux内核里面使用中断 不同于我们以往在别的裸机开发一样 需要进行各种寄存器的配置 中断使能之类的 而在Linux 内核中 提供了完善的中断框架 我们只需要申请中断 然后注
  • 【UE5】使用场系统炸毁一堵墙

    效果 步骤 1 新建一个空白项目 2 新建一个Basic关卡 然后添加一个第三人称游戏和初学者内容包到内容浏览器 3 在场景中添加一堵墙 4 选项模式选择 破裂 点击新建 新建一个文件夹用于存储几何体集 点击 统一 最小和最大Voronoi
  • activemq启动成功但web管理页面却无法访问

    前提 在linux启动activemq成功 本地能ping通linux 处理方案 确定防火墙是否关闭 有两种处理方案 第一种 关闭防火墙 第二种 暴漏8161和61616两个端口 netstat lnpt 查看8161和61616端口 注意
  • 时间序列数据压缩算法简述

    本文简单介绍了时间序列压缩任务的来源 压缩算法的分类 并对常见压缩算法的优缺点进行了简介 爱码士们快来一探究竟呀 引言 时间序列数据是在许多应用程序和领域中生成的一种基本数据类型 例如金融 医疗保健 交通和智慧城市 1 时间序列分析对于各种
  • Docker容器状态显示

    个人笔记 努力奋斗 文章目录 docker ps docker stats 总结 docker ps Docker中 你可以使用以下命令来查看容器的状态 docker ps 这个命令用于列出正在运行的容器 默认情况下 它只显示正在运行的容器
  • 企业ERP软件定制开发对企业的优势|app小程序搭建

    企业ERP软件定制开发对企业的优势 app小程序搭建 ERP Enterprise Resource Planning 软件定制开发是根据企业的具体需求和业务流程特点 定制开发的一种软件解决方案 相比于通用的ERP软件 定制开发可以更好地满
  • 常用的jQuery事件有几种?

    jQuery提供了多种事件处理方法 常用的jQuery事件包括以下几种 click事件 当元素被点击时触发 button click function 点击事件处理逻辑 hover事件 当鼠标悬停在元素上时触发 div hover func
  • 算法与数据结构(二十五)TopK问题:基于快排的Python模板

    首先 先写partition模板 def partition nums left right pivot nums left 初始化一个待比较数据 i j left right while i lt j while i