比 O(nlog(n)) 做得更好——创造合适的条件

news2025/1/5 10:10:34

我们可以比 O(nlog(n)) 更快地排序。

长按关注《Python学研大本营》,加入读者群,分享更多精彩 扫码关注《Python学研大本营》,加入读者群,分享更多精彩

介绍

我将介绍一种我称之为 groupSort 的排序方法。我没有直接解决排序问题,而是明确地作为排序问题,而是向左走了一步,选择解决另一种问题——分组问题。这样做,这为一个更简单的排序问题设置了条件,完成后,我得到了一个原始值的排序数组。

在更详细地讨论我的想法之前,让我直接跳到几个琐碎的例子,尽管如此,立即说明我的观点:我们可以比 O(nlog(n)) 更快地排序。

平凡排序

如果我有 1000 万行数据,其中每个元素取值 1 或 0,那么在对这 1000 万个项目进行排序时,我是否可以做得比O(nlog(n))时间复杂度更好?

答案是显而易见的,当我们面对数据中的二进制分类时,我们每天都会做的事情。我只需要使用一些控制结构遍历所有项目,将项目分成 1 和 0 组。然后,我可以将 0 组放在 1 组之前,例如将它们连接到一个数组中。我没有设置时间复杂度。我有一个步骤要解决时间复杂度O(n)(为每个项目确定 1 或 0)。我的清理步骤是O(1)的时间复杂度(将两组组合成一个数组)。总而言之,这使我的总体时间复杂度为O(n)。

下面是与使用 mergeSort 进行排序相比的基本逻辑流程和运行此逻辑所用时间的屏幕截图。

将包含 1000 万个项目的数组分成 1 和 0,然后将它们连接到一个数组中:

使用合并排序:

Trivial搜索

横向移动,让我从相关任务中检查第二个稍微不那么琐碎的示例。我们都知道二分查找,O(log(n))是最快的可用搜索算法,如果我们要进行多轮搜索,则值得花费O(nlog(n)的初始排序成本)对我们将要搜索的数组进行排序,以便我们可以进行二进制搜索来找到我们的目标。但是我们可以在搜索方面做得比这更好吗?事实上,我们中的许多人可能经常比这做得更好,也许在搜索术语时没有考虑到它。

假设我创建了一个字典,而不是对我们的搜索数组进行排序,我们要搜索的数组中的每个唯一元素都是字典的一个键,每个键的值是某个任意占位符。这花费了我O(n) 的时间复杂度,其中n是搜索数组的大小。现在,对于每一轮搜索,我都可以尝试在字典中找到与我的目标值匹配的键。每次我搜索时都会产生O(1)的时间复杂度(感谢散列函数),结合到O(m)来搜索我的所有目标,其中m是目标的数量。

使用其中一种经典的排序算法 + 二分查找的最终时间复杂度为O(mlog(n) + nlog(n)),其中m是我正在执行的搜索次数,n是要搜索的数组的大小 并添加第二个nlog(n)以说明排序步骤。使用字典的时间复杂度是max(O(n), O(m))。换句话说,我们将报告时间复杂度,具体取决于哪个更大——因此将主导时间要求的部分——我们变成搜索字典的数组的大小 ( n ) 或要进行的搜索次数(米)。

下面是这两种方法在 1000 万个元素的数组上的代码逻辑和结果的屏幕截图,其中搜索了 1000 个目标。

使用 mergeSort + 二分查找:

使用哈希表:

为了记录,天真地检查搜索数组中的每个元素以查找 1000 个目标中的每一个都比任何一种方法都花费了更长的时间:

讨论

这两个例子都是微不足道的,因为从表面上看,它们几乎没有能力扩展到更复杂的情况。与第一个示例一样,我们要排序的数据通常具有两个以上的值。关于第二个示例,我们需要搜索的数据类型可能是多层次的,并且不容易将其转储到字典中,或者这样做所需的准备工作将比经过验证的方法更昂贵。

但是,这些示例确实表明排序时可能比 O( nlog(n))做得更好。如果条件合适,我们可以做O(n)。同样,在搜索特定目标时,我们可以做得比 O( log(n))更好。如果我们要进行多轮搜索,最初设置一个字典可以让我们在O(1)时间内搜索单个目标。

那么问题就变成了,而不是希望在我们的数据环境中出现正确的条件,我们能否(可靠地)为(一定数量的)非平凡任务创造这些条件(至少在一定时间内)?

推荐书单

《Pandas1.x实例精解》

本书详细阐述了与Pandas相关的基本解决方案,主要包括Pandas基础,DataFrame基本操作,创建和保留DataFrame,开始数据分析,探索性数据分析,选择数据子集,过滤行,对齐索引,分组以进行聚合、过滤和转换,将数据重组为规整形式,组合Pandas对象,时间序列分析,使用Matplotlib、Pandas和Seaborn进行可视化,调试和测试等内容。此外,本书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。 本书适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学用书和参考手册。

链接:https://u.jd.com/UKjx4et

精彩回顾

《Pandas1.x实例精解》新书抢先看!

【第1篇】利用Pandas操作DataFrame的列与行

【第2篇】Pandas如何对DataFrame排序和统计

【第3篇】Pandas如何使用DataFrame方法链

【第4篇】Pandas如何比较缺失值以及转置方向?

【第5篇】DataFrame如何玩转多样性数据

【第6篇】如何进行探索性数据分析?

【第7篇】使用Pandas处理分类数据

【第8篇】使用Pandas处理连续数据

【第9篇】使用Pandas比较连续值和连续列

【第10篇】如何比较分类值以及使用Pandas分析库

长按关注《Python学研大本营》

长按二维码,加入Python读者群

扫码关注《Python学研大本营》,加入读者群,分享更多精彩

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

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

相关文章

基于小波变换编码的纹理图像分割

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 我们使用11或13维特征向量表示图像中的每个像素。两个特征用于表示像素之间的空间关系;由图像尺寸规格化的x和y像素坐标。对于灰度图像,一个特征是低通表示&#…

Python编程从入门到实践 第十一章:测试代码 练习答案记录

Python编程从入门到实践 第十一章:测试代码 练习答案记录 练习题导航Python编程从入门到实践 第十一章:测试代码 练习答案记录11.1 测试函数11.1.1 单元测试和测试用例11.1.2 可通过的测试11.1.3 未通过的测试11.1.4 测试未通过时怎么办11.1.5 添加新测试…

Flutter/Dart 中的 extension 方法

Flutter Dart 中的 extension 方法 前言 我们将讨论 extension 方法如何对我们有用,以及为什么您的代码因为它们而变得更加精确和可读的原因。 简介 在本文中,我们将学习 Dart 中的 extension 方法。也许你想知道那是什么,它是如何工作的&…

HIve数仓新零售项目DWS层的构建(Full join)模型

HIve数仓新零售项目 注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kaf…

全自动调节灯光强度的实现(仿真+程序+文档)

目 录 摘 要 I Abstract II 绪论 1 1.1 选题背景及意义 1 1.2 国内外研究现状 1 1.3 研究主要内容 3图书馆学习桌台灯智能控制系统简介与方案分析 4 2.1 大学图书馆照明控制现状 4 2.2 图书馆学习桌台灯智能控制系统简介 4 2.3 系统控制方案分析 4 2.4 本章小节 5系统硬件设计…

JavaScript练手小技巧:我破解了原神官网全屏滚动的秘密

这个标题有点夺人眼球,哈啊哈~骗点击率的。 “原神”官网当真的做的很漂亮,虽然我没玩过这个游戏,但是禁不住喜欢这个网站啊。 https://ys.mihoyo.com/ 最近居家教学上网课。除了上课,实在不想做学校安排的其它任务&#xff0c…

热量衡算习题课

第一部分 --- 传热计算综合例题 1.qm是质量流量,T1,2和 t1,2对应的是热流体和冷流体分别在管道进口和出口的温度 2.吊塔tm是传热温差 3.α1是热流体的对流传热系数,α2是冷流体的对流传热系数,K是整个对流传热过程的总的传热系…

【Linux】在Xilinx平台上实现UVC Gadget(2)- 解决dwc3驱动bug

【Linux】在Xilinx平台上实现UVC Gadget(2)- 解决dwc3驱动bug一、bug描述二、具体修改方法1. 找到内核源码位置并复制到其他目录2. Petalinux里面设置使用自定义内核源码1) 选第2个Linux Components Selection2) 选linux-kernel,回车&#xf…

【笔试题】【day22】

文章目录第一题(循环队列的元素个数)第二题(二叉排序树插入规则)第三题(线性探测的平均查找长度)第四题(关键字比较次数与初始序列无关的)第一题(循环队列的元素个数&…

m短波宽带通信系统的信道建模matlab仿真

目录 1.算法概述 1.1 Watterson信道模型理论简介 1.2 Nakagami信道模型 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 宽带短波信道的研究是设计宽带大容量短波通信的基础,但是传统的短波信道的研究仅限于窄带信号传输,这已经…

论文阅读-Whisper语音识别(OpenAI)

一、论文信息 论文名称:Robust Speech Recognition via Large-Scale Weak Supervision 代码地址:https://github.com/openai/whisper 官方博客:https://openai.com/blog/whisper 作者团队:OpenAI 二、介绍 Whisper是一个通用…

HAProxy实现负载均衡

目录 一、HAProxy介绍 二、环境准备 三、实验拓扑 四、HAProxy部署 五、配置HAProxy状态页面 一、HAProxy介绍 ha-proxy是一款高性能的负载均衡软件,主要是做7层负载均衡,也可以做4层负载均衡。因为其专注于负载均衡这一些事情,因此与ng…

8、如何使用FactoryBean向Spring容器中注册bean?

📫作者简介:zhz小白 公众号:小白的Java进阶之路 专业技能: 1、Java基础,并精通多线程的开发,熟悉JVM原理 2、熟悉Java基础,并精通多线程的开发,熟悉JVM原理,具备⼀定的线…

openEuler快速入门-openEuler命令行基础操作

系列文章目录 第一章 openEuler快速入门(一)-openEuler操作系统介绍 文章目录系列文章目录前言一、shell是什么二、Linux命令行操作技巧三、基础命令3.1、Linux命令分类3.2、目录和文件3.2.1 相对路径和绝对路径3.2.2 处理目录的常用命令ls:cd:pwd&…

tkinter绘制组件(36)——树状图

tkinter绘制组件(36)——树状图引言布局函数结构内容数据格式整体框架绘制元素与重绘宽度标识元素展开与闭合完整函数代码效果测试代码最终效果github项目pip下载结语引言 TinUI的第38个元素控件,也是TinUI-4.0-添加的第一个组件&#xff0c…

Rsync下行同步+inotify实时同步介绍和部署

一、Rsync(Remote Sync,远程同步) 是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限,且采用优化的同步算法,传输前执行压缩&#xf…

2022世界杯结果预测,简单AI模型最有效?附代码!

2022世界杯冠军是谁?本文将为你揭晓一个利用简单AI模型得到的靠谱预测。 许多人称足球为“不可预测的比赛”,因为一场足球比赛有不同的因素可以改变最终比分。 这是真的……在某种程度上。 北大出版社,人工智能原理与实践 人工智能和数据科…

面试官:什么是伪共享,如何避免?

本文已收录到 GitHub AndroidFamily,有 Android 进阶知识体系,欢迎 Star。技术和职场问题,请关注公众号 [彭旭锐] 加入 Android 交流群。 前言 大家好,我是小彭。 在前面的文章里,我们聊到了 CPU 的高速缓存机制。…

【electron】判断当前进程是否是开发环境的五种方案(获取一些资源的路径)

文章目录导读需求开发环境判断是否是开发环境方案一:location.protocol方案二:全局变量__static方案三:全局变量process.resourcesPath方案四:全局变量process.env.WEBPACK_DEV_SERVER方案五:app.isPackaged获取配置目…

OS-process

process 什么是进程 进程是被加载到内存中、正在运行的程序;多个进程可能对于同一个程序、一个正在运行的OS中会有多个进程 进程是程序的一次执行过程,是操作系统分配资源的基本单位 作业等同于进程 进程的布局: 每个进程都有一个不同的…