Python Cookbook-5.10 选取序列中最小的第 n个元素
任务
需要根据排名顺序从序列中获得第n个元素(比如,中间的元素,也被称为中值)。如果序列是已经排序的状态,应该使用seq[n],但如果序列还未被排序,那么除了先对整个序列进行排序之外,还有没有更好的方法?
解决方案
如果序列很长,洗牌洗得很充分,而且元素之间的比较开销也大,那么也许还能找到更好的方式。排序的确很快,但不管怎样,它(一个长度为n的充分洗牌的序列)的时间复杂度仍然是 O(nlogn),而时间复杂度为O(n)的取得第n个最小元素的算法也的确是存在的。下面我们给出一个函数来实现此算法:
import random
def select(data,n):#寻找第n个元素(最小的元素是第0个)#创建一个新列表,处理小于0的索引,检查索引的有效性data = list(data)if n < O:n += len(data)if not 0 <= n < len(data):raise ValueError,"can't get rank %d out of %d" %(n,len(data))#主循环,看上去类似于快速排序但不需要递归while True:pivot = random.choice(data)pcount = 0under:over= [ ],[ ]uappend,oappend = under.append,over.appendfor elem in data:if elem < pivot:uappend(elem)elif elem > pivot:oappend(elem)else:pcount += 1numunder = len(under)if n < numunder:data =underelif n < numunder + pcount:return pivotelse:data = overn -= numunder +pcount
讨论
本节解决方案也可用于重复的元素。举个例子,列表[1,1,1,2,3]的中值是1,因为它是将这5个元素按顺序排列之后的第3个。如果由于某些特别的原因,你不想考虑重复而需要缩减这个列表,使得所有元素都是唯一的(比如,通过18.1节提供的方法),可以完成这一步骤之后再回到本节的问题。
输入参数 data 可以是任意有边界的可迭代对象。首先我们对它调用 list 以确保得到可迭代的对象,然后进入持续循环过程。在循环的每一步中,首先随机选出一个轴心元素以轴心元素为基准,将列表切片成两个部分,一个部分“高于”轴心,一个部分“低于”轴心,然后继续在下一轮循环中对列表的这两个部分中的一个进行深入处理,因为我们可以判断第n个元处于哪一个部分,所以另外一个部分就可以丢弃了。这个算法的思想很接近经典的快速排序算法(只不过快速排序无法丢弃任何部分,它必须用递归的方法,或者用一个栈来替换递归,以确保对每个部分都进行了处理)
随机选择轴心使得这个算法对于任意顺序的数据都适用(但不同于原生的快速排序,某些顺序的数据将极大地影响它的速度),这个实现花费大约log2N时间用于调用random.choice。另一个值得注意的是算法统计了选出轴心元素的次数,这是为了在一些特殊情况下仍能够保证较好的性能,比如 data 中可能含有大量的重复数据。
将局部变量列表 under 和 over 的被绑定方法 append 抽取出来,看起来没什么意义,而且还增加了一点小小的复杂性,但实际上,这是Python 中一个非常重要的优化技术。为了保持编译器的简单、直接、可预期性以及健壮性,Python不会将一些恒定的计算移出循环,它也不会“缓存”对方法的查询结果。如果你在内层循环调用 under.append和 over.append,每一轮都会付出开销和代价。如果想把某些事情一次性做好,那么需要自己动手完成。当你考虑优化问题时,你总是应该对比优化前和优化后的效率,以确保优化真正起到了作用。根据我的测试,对于获取range(10000)的第5000个元素这样的任务,去掉优化部分之后,性能下降了50%。虽然增加一点小小的复杂性,但仍然是值得的,毕竟那是50%的性能差异。
关于优化的一个自然的想法是,在循环中调用cmp(elem,pivot),而不是用一些独立的elem<piovt 或 elem>pivot来测试。不幸的是,cmp 不会提高速度;事实上它还有可能会降速,至少当 data的元素是一些基本类型比如数字和字符串的时候,的确是这样。那么,select的性能和下面这个简单方法的性能相比如何呢?
def selsor(data,n):data = list(data)data.sort()return data[n]
在我的计算机上,获取一个3001个整数的充分洗牌的列表的中值,本节解决方案的代码耗时 16ms,而selsor 耗时 13ms,再考虑到sort 在序列部分有序的情况下速度会更快,元素是基本类型且比较操作执行得很快,而且列表长度也不大,所以使用 select 并没有什么优势。将长度增加到30001,这两个方法的性能变得非常接近,都是约170ms。但当我将列表长度修改成 300001,select 终于表现出了优势,它用了2.2s获得了中值,而 selsor 需要 2.5s。
但如果序列中元素的比较操作非常耗时,那么这两个方式刚刚表现出的大致平衡就被彻底打破了,因为这两个方式的最关键的差异就是比较操作执行的次数——select 执行O(n)次,而 selsor 执行O(nlogn)次。举个例子,假如我们需要比较的是某个类的实例,其比较操作的开销相当大(模拟某些四维的坐标点,其前三维坐标通常总是相同的):
class X(obiect):def __init._(self):self.a = self.b = self.c = 23.51self.d = random.random()def _dats(self):return self.a,self.b,self.c,self.ddef __cmp__(self,oth):return cmp(self._dats,oth._dats)
现在,即使只对 201个实例求中值,select就已经表现得比selsor快了。
换句话说,基于列表的 sort 方法的实现的确要简洁得多,实现select 也确实需要多付出一点力气,但如果n足够大而且比较操作的开销也无法忽略的话,select就体现出它的价值了。
相关文章:
Python Cookbook-5.10 选取序列中最小的第 n个元素
任务 需要根据排名顺序从序列中获得第n个元素(比如,中间的元素,也被称为中值)。如果序列是已经排序的状态,应该使用seq[n],但如果序列还未被排序,那么除了先对整个序列进行排序之外,还有没有更好的方法? …...
GitHub 克隆/下载失败的解决方案
🚀 GitHub 下载/克隆失败?一招搞定代理配置与回滚! 在国内使用 Git 操作 GitHub 时,经常会遇到以下问题: ❌ 下载失败、超时 ❌ Failed to connect to github.com port 443 ❌ SSL certificate problem 本文将详细讲解…...
【Linux】进程控制:创建、终止、等待与替换全解析
文章目录 前言一、重谈进程创建二、进程终止2.1 正常终止的退出码机制2.2 异常终止的信号机制2.3 进程常见的退出方法 三、进程等待:避免僵尸进程的关键3.1 进程等待的必要性3.2 进程等待的两个系统调用接口3.2.1 wait()3.2.2 waitpid()区别 四、进程程序替换4.1 进…...
LabVIEW 图像处理中常见的边缘检测算法
在 LabVIEW 图像处理领域,边缘检测对于提取图像特征、目标识别及图像分割等任务至关重要。以下介绍几种常见的边缘检测算法及其在 LabVIEW 中的应用。 一、Sobel 算子 Sobel 算子是一种离散的一阶差分算子,用于计算图像灰度的近似梯度。它通过分别…...
Redis-场景缓存+秒杀+管道+消息队列
缓存一致性 1.两次更新 先更新数据库,再更新缓存;先更新缓存,再更新数据库; 出现不一致问题场景: 先更新数据库,再更新缓存; 先更新缓存,再更新数据库; 两次更新的适…...
亲身体验 Copilot Pages:利用人工智能实时整理和优化笔记
想象一下,有一款与云端相连的笔记本,它不仅能保存您收集的信息,还能自动整理,并根据需要添加详细信息和研究资料。这就是微软在华盛顿州雷德蒙德举行的 50 周年庆典活动上推出的全新 Copilot Pages 功能。这是微软在该活动中介绍的…...
[250409] GitHub Copilot 全面升级,推出AI代理模式,可支援MCP | Devin 2.0 发布
目录 GitHub Copilot 全面升级,推出AI代理模式,可支援MCPDevin 2.0 正式发布:带来全新的 AI 协作开发体验 GitHub Copilot 全面升级,推出AI代理模式,可支援MCP GitHub Copilot 迎来了一次重大升级,核心在于…...
代码随想录算法训练营Day25
一、力扣93.复原IP地址【medium】 题目链接:力扣93.复原IP地址 left x300 视频链接:代码随想录 1、思路 时间复杂度: O ( n ) O(n) O(n) 2、代码 class Solution:def restoreIpAddresses(self, s: str) -> List[str]:n len(s)ans []…...
支持企业知识库和联网搜索,360AI企业知识库驱动业务深度融合
在企业智能化转型进程中,高效整合内外部结构化与非结构化数据资源、快速构建AI能力已成为制胜未来的核心命题。360 DeepSeek企业知识库助力企业实现知识管理、辅助决策与业务场景落地的全链路贯通,重塑智能化升级路径。 1 企业知识库构建 终结信息孤岛…...
2025年R2 移动式压力容器充装证精选多选题练习
R2 移动式压力容器充装证精选多选题练习: 1、《特种设备安全法》规定,特种设备使用单位应当建立特种设备安全技术档案。安全技术档案应当包括以下内容:( ) A. 特种设备的定期检验和定期自行检查记录 B. 特种设备的日…...
掌握Django内联TabularInline和StackedInline示例
掌握Django内联TabularInline和StackedInline示例 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 掌握Django内联TabularInline和StackedInline示例**前提条件****Django 内联管理简…...
ABAP+CS
平时开发中如果遇到某个字段等于A或B或C很多时的枚举条件很多时,平时我们都是写 if BUKRS A OR BUKRS B OR BUKRS C. ENDIF. 可以替换为CS,更加简洁,如下,要记得加空格 IF A B C D CS BUKRS. ENDIF....
python reportlab模块----操作PDF文件
reportlab模块----操作PDF文件 一. 安装模块二. reportlab相关介绍三. 扩展canvas类四. 水平写入完整代码五. 垂直写入完整代码 一. 安装模块 pip install reportlab二. reportlab相关介绍 # 1. letter 生成A4纸张尺寸 from reportlab.lib.pagesizes import letter print(let…...
javascript里用代理做链式调用。
JavaScript 的 Proxy 对象来实现一种动态的链式调用,最终完成加法操作。我们来逐步分析代码的逻辑: 1. createProxy 函数 function createProxy(value 0) {const valueGetter () > value;return new Proxy({}, {get(target, prop) {if (prop Sym…...
SpringBoot将HTML转化成PDF文件
准备好相关字体文件(如果HTML内含有中文,避免乱码)。我这边用的是谷歌免费的中文字体,源于:Gitee 极速下载/noto-cjk - Gitee.com(在此表示感谢)准备好一个HTML文件(HTML标签记得封好…...
Elasticsearch 集群搭建
一、集群规划 1.1 节点角色规划 节点类型配置要求推荐数量Master节点低磁盘、中等CPU/内存3(奇数防止脑裂)Data节点高磁盘、高内存、多核CPU根据数据量扩展Coordinating节点高CPU/内存、低磁盘2(可选) 1.2 硬件建议 内存&…...
BGP路由协议之对等体
IGP 可以通过组播报文发现直连链路上的邻居,而 BGP 是通过 TCP:179 来实现的。BGP 需要手工的方式去配置邻居。不需要直连,只要路由能通就可以建立邻居 IBGP 与 EBGP IBGP :(Internal BGP) :位于相同自治系统的 BGP 路由器之间的 BGP 邻接关…...
H3C的MSTP+VRRP高可靠性组网技术(MSTP单域)
以下内容纯为博主分享自己的想法和理解,如有错误轻喷 MSTP多生成树协议可以基于不同实例实现不同VLAN之间的负载分担 VRRP虚拟路由器冗余协议可以提高网关的可靠性防止单点故障的可能 在以前这两种协议通常一起搭配组网,来提高网络的可靠性和稳定性&a…...
oracle 动态性能视图
Oracle 数据库中的 V$SQLAREA 是一个动态性能视图(Dynamic Performance View),用于记录共享池(Shared Pool)中所有 SQL 语句的统计信息。每个 SQL 语句在共享池中存储为一个游标(Cursor)&#x…...
chrome extension开发框架WXT之WXT Storage api解析【补充说明一】
在 defineItem 方法里,fallback、init、version 和 migrations 这些参数能够让你对存储项进行更为细致的设置,像设定默认值、初始化值、版本控制以及数据迁移等操作。下面详细说明这些参数的使用方法: fallback 参数 fallback 参数为 getVa…...
浦江晨曦曲:科技与自然共舞的未来诗篇
故事背景 故事发生在未来上海,这座国际大都市通过尖端科技与生态自然的完美融合,重新定义了人类与环境的共生关系。从黄浦江畔的智慧能源矩阵到云端漂浮的烘焙工坊,每个场景都诉说着科技赋能下的人文温度。 故事摘要 当晨曦染红黄浦江面&…...
Lua 函数使用的完整指南
在 Lua 中,函数是一等公民(First-Class Citizen),这意味着函数可以像其他值一样被赋值、传递和操作。以下是 Lua 函数定义的完整指南,涵盖基础语法、高级特性、设计模式及性能优化。 在Lua 中,函数定义的完…...
算法进阶指南 袭击
题目描述 在与联盟的战斗中屡战屡败后,帝国撤退到了最后一个据点。依靠其强大的防御系统,帝国击退了联盟的六波猛烈进攻。 经过几天的苦思冥想,联盟将军亚瑟终于注意到帝国防御系统唯一的弱点就是能源供应。 该系统由 N 个核电站提供能源&…...
HTTPS为何仍有安全漏洞?解析加密协议下的攻击面
本文深度剖析HTTPS协议在传输层、证书体系、配置管理三个维度的安全盲区,揭示SSL/TLS加密掩盖下的11类攻击路径。基于Equifax、SolarWinds等重大事件的技术复盘,提供包含自动化证书巡检、动态协议升级、加密流量威胁检测的立体防御方案。 HTTPS不等于绝…...
行业案例 | SAS 基于 SQL 托管实例构建高弹性安全的数据平台
SAS是全球领先的数据与AI公司,专注于行业解决方案,帮助企业高效利用数据驱动决策。在本案例中,SAS通过采用Azure SQL托管实例,成功迁移和管理近1,000个数据库,减少运维负担,提升数据价值挖掘能力。这一方案…...
NO.82十六届蓝桥杯备战|动态规划-从记忆化搜索到动态规划|下楼梯|数字三角形(C++)
记忆化搜索 在搜索的过程中,如果搜索树中有很多重复的结点,此时可以通过⼀个"备忘录",记录第⼀次搜索到的结果。当下⼀次搜索到这个结点时,直接在"备忘录"⾥⾯找结果。其中,搜索树中的⼀个⼀个结点…...
工业制造各个系统术语
简单总结下 文章目录 MES:制造执行系统ERP:企业资源计划PLM:产品生命周期管理MRP:物资需求计划QMS:质量管理系统APS:高级计划与排程SRM:供应商关系管理SCM:供应链管理CRM:客户关系管理WMS:仓库管理系统TMS:运输管理系统PMS:生产管理系统LES:物流执行系统FICO:财务与成本控制模块…...
搜广推校招面经七十一
滴滴算法工程师面经 一、矩阵分解的原理与优化意义 矩阵分解在推荐系统中是一个非常核心的方法,尤其是在 协同过滤(Collaborative Filtering) 中。我们可以通过用户对物品的评分行为来推测用户的喜好,从而推荐他们可能喜欢的内容。 1.1. 直观理解&…...
解决 ECharts 图表无数据显示问题
问题: 在开发项目时,后端明明已经成功返回了数据,但在展示手账发布数量趋势和树洞帖子发布数量趋势的 ECharts 图表中,却只有坐标轴,没有任何数据显示。 以我的VUE项目开发可视化面板为例,下面将详细分析可…...
【UE5】RTS游戏的框选功能实现
目录 效果 步骤 一、项目准备 二、框选NPC并移动到指定地点 三、框选效果 效果 步骤 一、项目准备 1. 新建一个俯视角游戏工程 2. 新建一个pawn、玩家控制器和游戏模式,这里分别命名为“MyPawn”、“MyController”和“MyGameMode” 3. 打开“MyGameMode”…...
【同步教程】基于Apache SeaTunnel从MySQL同步到MySQL——Demo方舟计划
文章作者:陈飞 中付支付大数据工程师 大家好,很高兴通过 SeaTunnel Demo 方舟计划 和大家分享一个 简单但常见的 MySQL 到 MySQL 数据同步与合并场景案例。 我是陈飞,目前就职于中付支付基础架构部,从事大数据相关工作ÿ…...
人工智能与认知科学的交汇:机器是否能“理解”?
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:AI与认知的“悖论” 当我们谈论人工智能时,往往聚焦于它的“能力”——会下围棋、会写文章、会画画,甚至能写代码。这些能力让AI像极了一个“聪明人”。但一个根本问题始终没有被真正解…...
React Native 0.79发布 - 更快的工具及更多改进
React Native 0.79版本发布了。 此版本在多个方面进行了性能改进,并修复了一些漏洞。首先,得益于延迟哈希技术,Metro的启动速度变快了,并且对包导出提供了稳定支持。由于JS包压缩方式的改变等原因,Android的启动时间也…...
嵌入式---灰度传感器
灰度传感器概览 一、定义与核心功能 1. 定义 灰度传感器是一种基于 光反射原理 的光电传感器,通过检测物体表面对入射光(多为红外光或可见光)的反射强度,将光信号转换为电信号,从而判断目标物体的 灰度值࿰…...
基于ueditor编辑器的功能开发之增加自定义一键排版功能
用户有自己的文章格式,要求复制或者粘贴进来的文章能够一键排版,不需要手动调试 这个需求的话咱们就需要自己去注册一个事件啦,这里我没有修改源码,而是在编辑器初始化之后给他注册了一个事件 我的工具列表变量 vue组件中data中…...
docker部署elk
一、准备镜像 二、创建Elasticsearch容器 2.1启动Elasticsearch容器 docker run -d --name elasticsearch \-e "discovery.typesingle-node" \-e "bootstrap.memory_locktrue" \-e "ES_JAVA_OPTS-Xms2g -Xmx2g" \-e "xpack.security.enab…...
BGP路由协议
为方便管理规模不断扩大的网络,网络被分成了不同的 AS (Autonomous System,自治系统)。早期,EGP (Exterior Gateway Protocol,外部网关协议)被用于实现在 AS 之间动态交换路由信息。但是 EGP 设计得比较简单,只发布网络…...
vue3中watch的使用示例
使用情况说明: 1、父组件中有个表格,点击表格行的修改基础信息,弹出修改对话框; 2、修改内容点击确认,发送请求,后端更新数据;不修改内容不发送请求; 3、可以连续修改;…...
OpenBMC:BmcWeb 处理http请求7 完成http请求
OpenBMC:BmcWeb 处理http请求6 调用路由处理函数-CSDN博客 用户会通过填充asyncResp设置响应内容 OpenBMC:BmcWeb 处理http请求1 生成Request和AsyncResp对象_bmc web-CSDN博客 构造了asyncResp 可以看到asyncResp是一个shared_ptr 并且在构造后设置了setCompleteRequestHand…...
pair与tuple
pair pair是 C STL(标准模板库)中的一个模板类,用于表示一对相关的对象。它是一个简单的容器,存储两个数据项,它们可以是不同类型的。pair 常用于需要将两个元素一起操作的情况,例如在处理字典(…...
RecyclerView 和 ListView从 设计理念、性能优化 和 扩展能力 三个维度展开分析
一、RecyclerView 的核心定义(设计理念) RecyclerView 是 Android Jetpack 中的高级滚动容器,用于展示大数据集,其核心特性包括: 模块化设计:分离布局管理(LayoutManager)、动画&am…...
望远镜自动调焦怎样利用直线轴承结构?
以下是对望远镜调焦结构相关内容的分析: 调焦结构基本构成与原理 驱动部分:采用步进电机驱动滚珠丝杠,步进电机能够精确控制转动角度和步数,从而精确控制滚珠丝杠的转动,为调焦提供动力来源。 传动部分:…...
C++学习之服务器EPOLL模型、处理客户端请求、向客户端回复数、向客户端发送文件
目录 1.启动epoll模型 2.和客户端建立新连接 3.接受客户端Http请求数据 4.代码回顾从接受的数据中读出请求行 5.请求行解析 6.正则表达式以及匹配 7.解析请求行以及后续处理 8.对path处理说明 9.如何回复响应数据 10.对文件对应content-type如何查询 11.服务器处理流…...
Explain的使用
1.使用explain语句去查看分析结果 如explain select * from test1 where id=1;会出现:id selecttype table type possible_keys key key_len ref rows extra各列。 其中, type=const表示通过索引一次就找到了; key=primary的话,表示使用了主键; type=all,表示为全表…...
DDoS防御与流量优化
实训背景 某在线游戏平台遭受频繁DDoS攻击,需部署Linux网关实现以下防护与优化功能: 防御SYN洪水攻击:自动识别并拦截高频SYN请求。连接数限制:限制单个IP的最大并发连接数为100,防止资源耗尽。流量优先级保障&#…...
文件上传漏洞原理学习
什么是文件上传漏洞 文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。“文件上传” 本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全&#…...
005.Gitlab CICD变量使用
文章目录 变量介绍预定义变量项目信息类版本控制类流水线执行类runner环境类作业执行类容器注册类其他类别 自定义变量 变量使用预定义变量使用创建流水线提交流水作业 自定义变量使用创建流水线提交流水作业 图形UI创建变量UI自定义变量创建流水线提交流水作业 变量介绍 预定…...
即时通讯软件BeeWorks,企业如何实现细粒度的权限控制?
BeeWorks作为一款专为企业设计的即时通讯平台,高度重视用户隐私安全,采取了多种措施来保障数据的保密性、完整性和可用性。 首先,BeeWorks采用私有化部署模式,企业可以将服务器架设在自己的网络环境中,所有通讯数据&a…...
高可用架构:Keepalived、Nginx与Docker深度解析
本文深入解析了Keepalived技术,阐述其基于VRRP协议实现高可用的核心功能,包括虚拟路由器冗余、健康检查、负载均衡集成及脚本执行与通知。同时,设计了Nginx高可用方案,涵盖双机主从、主主及多点集群模式,分析其优缺点。…...
127.0.0.1本地环回地址(Loopback Address)
127.0.0.1 是计算机网络中的一个特殊IPv4地址,称为本地环回地址(Loopback Address),主要用于以下用途: 1. 基本定义 本地主机(Localhost):该地址始终指向当前正在使用的计算机本身&a…...