【算法证明 三】计算顺序统计量的复杂度

news2024/11/24 8:57:30

计算顺序统计量,在 c++ 标准库中对应有一个函数:nth_element。其作用是求解一个数组中第 k 大的数字。常见的算法是基于 partition 的分治算法。不难证明这种算法的最坏复杂度是 Θ ( n 2 ) \Theta(n^2) Θ(n2)。但是其期望复杂度是 Θ ( n ) \Theta(n) Θ(n)

另外,存在一种最坏复杂度是 Θ ( n ) \Theta(n) Θ(n) 的算法,其设计和证明思路比较有意思,拿来说一下。

基于 partition 的算法期望复杂度证明

求期望离不开随机变量。假设在 n 个元素的数组 A [ p . . . q ] A[p...q] A[p...q] 上运行算法的时间是 T(n)。partition 算法会将 A 数组中元素等概率的选为主元并分割。定义指示器随机变量
X k = { 分割后左半边数组的元素有正好有 k 个 } X_k = \{分割后左半边数组的元素有正好有 k 个\} Xk={分割后左半边数组的元素有正好有k}
则有 E ( X k ) = 1 / n × 1 + ( n − 1 ) / n × 0 = 1 / n E(X_k)=1/n × 1 + (n - 1) / n × 0 = 1 / n E(Xk)=1/n×1+(n1)/n×0=1/n

将 A 分为两部分后,算法会选择一边进行递归。为求得最坏情况,假设每次都从较长的一边进行递归,则有不等式
T ( n ) ≤ ∑ k = 1 n X k ⋅ T ( m a x ( k − 1 , n − k ) ) + O ( n ) T(n) \le \sum_{k=1}^n X_k \cdot T(max(k-1, n - k)) + O(n) T(n)k=1nXkT(max(k1,nk))+O(n)
取期望得
E ( T ( n ) ) ≤ E ( ∑ k = 1 n X k ⋅ T ( m a x ( k − 1 , n − k ) ) ] + O ( n ) E(T(n)) \le E(\sum_{k=1}^n X_k \cdot T(max(k-1, n - k))] + O(n) E(T(n))E(k=1nXkT(max(k1,nk))]+O(n)
根据事件间独立性和线性关系,得
E ( T ( n ) ) ≤ ∑ k = 1 n E ( X k ) ⋅ E ( T ( m a x ( k − 1 , n − k ) ) ) ] + O ( n ) = 1 n ∑ k = 1 n E ( T ( m a x ( k − 1 , n − k ) ) ) ] + O ( n ) E(T(n)) \le \sum_{k=1}^n E(X_k) \cdot E(T(max(k-1, n - k)))] + O(n) \\ = \frac{1}{n} \sum_{k=1}^n E(T(max(k-1, n - k)))] + O(n) E(T(n))k=1nE(Xk)E(T(max(k1,nk)))]+O(n)=n1k=1nE(T(max(k1,nk)))]+O(n)
取较大的边进行缩放,得到
E ( T ( n ) ) ≤ 2 n ∑ k = n / 2 n E [ T ( k ) ] + O ( n ) E(T(n)) \le \frac{2}{n} \sum_{k=n/2}^n E[T(k)] + O(n) E(T(n))n2k=n/2nE[T(k)]+O(n)

用代入法来证明 E ( T ( n ) ) = O ( n ) E(T(n)) = O(n) E(T(n))=O(n),假设 E ( T ( n ) ) ≤ c n E(T(n)) \le cn E(T(n))cn,代入公式右半边,同时为方便说明,选择常数 a 代入 O(n) 中

E ( T ( n ) ) ≤ 2 n ∑ k = n / 2 n c k + a n = 2 n ⋅ 3 n / 2 × n / 2 2 + a n = 3 c n 4 + a n = ( 3 c + 4 a ) n 4 E(T(n)) \le \frac{2}{n} \sum_{k=n/2}^n ck + an \\ = \frac{2}{n} \cdot \frac{3n/2 × n/2}{2} + an\\ = \frac{3cn}{4} + an\\ =\frac{(3c + 4a)n}{4} E(T(n))n2k=n/2nck+an=n223n/2×n/2+an=43cn+an=4(3c+4a)n
只要选取较大得常数 c 即可满足 E ( T ( n ) ) ≤ c n E(T(n)) \le cn E(T(n))cn,方式如下,令
( 3 c + 4 a ) n 4 ≤ c n \frac{(3c + 4a)n}{4} \le cn 4(3c+4a)ncn
c ≥ 16 a c \ge 16a c16a
证明完毕,期望复杂度是 Θ ( n ) \Theta(n) Θ(n)

最坏情况下是线性的算法

该算法常数比较大,先描述一下基本原理
第一步,找到一个特别的中位数

  1. 将数组每 5 个元素分为一组
  2. 每组分别排序,找到 n / 5 个中位数
  3. 将这 n / 5 个中位数,递归调用本算法,找到其中位数 x
    至此找到了一个特别的中位数的中位数 x
    第二步,划分
  4. 使用 x 对数组进行划分。设 x 是第 k 小的数
  5. 如果 k = i 则结束,否则根据情况在低区或者高区来进行递归调用

证明:

首先分析这个特殊的中位数的中位数 x 的性质。可以知道,在数组中,至少有 3 n 10 − 6 \frac{3n}{10}-6 103n6个元素大于 x,同理有至少有 3 n 10 − 6 \frac{3n}{10}-6 103n6 个元素小于 x。也就是说,第5步的最坏情况,递归调用作用在 7 n 10 + 6 \frac{7n}{10}+6 107n+6个元素上。现在可以设计递推式。
步骤1 2 4 总共需要 O(n) 的复杂度,步骤 3 需要时间为 T(n / 5),步骤 5 需要时间最多为 T ( 7 n 10 + 6 ) T(\frac{7n}{10}+6) T(107n+6),因此有
T ( n ) ≤ T ( n / 5 ) + T ( 7 n / 10 + 6 ) + O ( n ) T(n) \le T(n / 5) + T(7n/10 + 6)+ O(n) T(n)T(n/5)+T(7n/10+6)+O(n)

再次使用替换法。假设 某个适当大的常数 c 满足 T ( n ) ≤ c n T(n) \le cn T(n)cn,某个常数 a 来表示 公式中 O(n) 的上界。则有
T ( n ) ≤ c n / 5 + 7 c n / 10 + 6 c + a n T(n) \le cn/5 + 7cn/10 + 6c + an\\ T(n)cn/5+7cn/10+6c+an
为挑选出足够大的 c 列出如下不等式,若如下不等式成立,则找到了足够大的 c
c n / 5 + 7 c n / 10 + 6 c + a n ≤ c n − n c / 10 + 6 c + a n ≤ 0 cn/5 + 7cn/10 + 6c + an \le cn\\ -nc/10 + 6c+an\le0 cn/5+7cn/10+6c+ancnnc/10+6c+an0
n > 60 n \gt 60 n>60时有如下变换
c ≥ 10 a n / ( n − 60 ) c \ge 10an/(n-60) c10an/(n60)
函数图像大致如下
在这里插入图片描述因此 不妨设 n ≥ 120 n \ge 120 n120 , 有 n / ( n − 60 ) < 2 n/(n - 60) < 2 n/(n60)<2,即
c ≥ 20 a , n ≥ 120 c \ge 20a, n \ge120 c20a,n120

结果合并如下
T ( n ) ≤ { O ( 1 ) , n < 120 O ( n ) , n ≥ 120 T(n) \le \begin{cases} O(1), n < 120 \\ O(n), n \ge 120 \end{cases} T(n){O(1),n<120O(n),n120

证毕

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

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

相关文章

从源码全面解析 dubbo 服务暴露的来龙去脉

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码…

SpringBoot配置 -- SpringBoot快速入门保姆级教程(二)

文章目录 前言二、SpringBoot配置1. 了解配置文件的3种格式2.yaml格式语法规则3.读取yaml数据的3种方式4.多环境开发配置5.多环境命令行启动参数设置6. 多环境开发兼容问题7.配置文件分类 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&am…

vcruntime140.dll如何修复

VCRUNTIME140.dll是Windows操作系统上一个非常重要的动态链接库文件&#xff0c;它是由Microsoft Visual C Runtime提供的运行时库文件之一&#xff0c;被许多应用程序用来进行编译和运行。如果该文件丢失或损坏&#xff0c;很多应用程序就无法正常运行&#xff0c;这可能会带来…

三分钟了解SpringBoot配置优先级底层源码解析

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是冰点&#xff0c;从业11年&#xff0c;目前在物流独角兽企业从事技术方面工作&#xff0c;&#x1f342;博主正在努力完成2023计划中&#xff1a;以梦为马&#xff0c;扬帆起航&#xff0c;2023追梦人&#x1f4dd;联系…

关于性能测试平台的一些想法,想跟大家聊一下

目录 一、任务管理 二、用例管理 三、环境管理 四、压测机管理 五、数据管理 六、监控管理 七、日志管理 八、报表管理 九、配置管理 十、系统管理 组织架构 这里我按照每个不同系统归属的项目组为横向&#xff0c;性能测试团队作为职能部门为纵向的矩阵式组织架构为…

JUC学习(二)

目录 Doug Lea — JUC并发包的作者锁框架Lock和Condition接口可重入锁公平锁与非公平锁读写锁锁降级和锁升级队列同步器AQS底层实现公平锁一定公平吗&#xff1f;Condition实现原理 ——————————————————————————————— 在前面&#xff0c;我们了解…

ICV报告:乘光伏新能源汽车之势,功率器件蓄势待发

前言&#xff1a; 电力电子器件&#xff08;Power Electronic Device&#xff09;&#xff0c;又称为功率半导体器件&#xff0c;用于电能变换和电能控制电路中的大功率(通常指电流为数十至数千安&#xff0c;电压为数百伏以上)电子器件。功率器件能够承受和控制较大电流、电压…

无限阳光、自动收集阳光CALL、阳光产生速度

简单实现无限阳光 本次实验内容&#xff1a;通过逆向分析植物阳光数量的动态地址找到阳光的基址与偏移&#xff0c;从而实现每次启动游戏都能够使用基址加偏移的方式定位阳光数据&#xff0c;最后我们将通过使用C语言编写通用辅助实现简单的无限阳光外挂&#xff0c;在教程开始…

Vue Router路由管理器

目录&#xff1a; 相关理解基本路由几个注意事项嵌套&#xff08;多级&#xff09;路由路由的query参数命名路由路由的params参数路由的props配置路由跳转的replace方法编程式路由导航缓存路由组件activated和deactivated路由守卫路由器的两种工作模式 相关理解 vue-route…

博学谷学习记录】超强总结,用心分享 | 架构师 敏捷开发 学习总结

文章目录 敏捷开发1. 概述2. 敏捷开发 敏捷开发 1. 概述 随着软件开发技术的不断发展&#xff0c;现在出现了很多种不同的开发模式&#xff0c;其实敏捷开发已经成为现在很多企业开发应用程序都想要选择的开发方案&#xff0c;那么什么是敏捷开发呢&#xff1f;1.1 四种开发模…

Linux 配置Java环境(一)

Linux 配置Java环境 一、配置Java环境1、查看系统是否有java环境2、卸载系统自带的jdk3、创建一个文件夹用于存放java的压缩包4、包下载好的jdk拖到java文件夹5、安装jdk6、配置环境变量7、让配置生效8、验证是否配置成功 一、配置Java环境 1、查看系统是否有java环境 输入指…

nginx中location和rewrite

常用的Nginx 正则表达式 ^ &#xff1a;匹配输入字符串的起始位置 $ &#xff1a;匹配输入字符串的结束位置 * &#xff1a;匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” &#xff1a;匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“olll…

0-1背包问题:动态规划的经典应用

文章目录 引言背包问题简介0-1背包问题定义0-1背包问题的限制条件 动态规划解决思路状态定义状态转移方程 背包问题的Java实现示例与分析 总结 引言 背包问题是在给定一组物品和一个背包容量的情况下&#xff0c;如何选择物品放入背包&#xff0c;以使得放入背包的物品总价值最…

高边功率开关参数Load current(ISO)和Nominal current

1. IL(nom)是没有加散热片的情况下&#xff0c;考虑RON和BTS6133D与环境热阻计算得到的电流值&#xff1b; 2. IL(iso)是有散热片的情况下计算得到的电流值&#xff1b; 3. IL12(SC)是如果负载电流达到75A以上&#xff0c;BTS6143D会通过不断重启来来限制电流在75A以下。

【论文简述】GeoMVSNet: Learning Multi-View Stereo with Geometry Perception(CVPR 2023)

一、论文简述 1. 第一作者&#xff1a;Jie Zhu 2. 发表年份&#xff1a;2023 3. 发表期刊&#xff1a;CVPR 4. 关键词&#xff1a;MVS、级联结构、几何感知、频域增强、高斯混合模型 5. 探索动机&#xff1a;基于级联的结构以从粗到细的方式计算不同分辨率的深度图&#x…

数据结构与算法练习(二)数组模拟队列

文章目录 1、队列2、数组实现队列3、数组实现循环队列 1、队列 队列是一个有序列表&#xff0c;可以用数组或链表来实现 遵循先入先出的原则 在队尾插入元素叫做入队&#xff0c;对头删除元素叫做出队。2、数组实现队列 思路&#xff1a; 用front和rear记录队列前后的下标&a…

【MCS-51单片机汇编语言】期末复习总结⑤——定时器中断方式与查询方式程序设计(题型五)

文章目录 知识准备工作方式寄存器TMODTCON寄存器IE寄存器 定时/计数器的使用初始化 常考题型例题1题目描述题目解析题解 例题2题目描述题目解析题解 知识准备 工作方式寄存器TMOD D7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0 [注]&#xff1a;TMOD高4位与T1相关&#xff0c;低…

iptables和防火墙

文章目录 1.防火墙2.Iptables基本介绍2.1 什么是iptables2.2 什么是包过滤防火墙2.3 包过滤防火墙如何实现 1.防火墙 Linux防火墙主要工作在网络层&#xff0c;针对 TCP/IP 数据包实施过滤和限制&#xff0c;典型的包过滤防火墙&#xff0c;基于内核编码实现&#xff0c;具有非…

Qt(C++)绘制指针仪表盘显示当前温度

一、功能介绍 当前文章要实现的功能: 使用Qt绘制一个仪表盘,用来显示当前的温度,绘制刻度、绘制数字、绘制温度指针。仪表盘全程使用QPainter进行绘制,QPainter是Qt框架中非常重要的一个类,绘制功能的实现离不开它。如果想要使用Qt进行高质量的绘图或UI设计,必须掌握QP…

Groovy 基本语法

一、简介 类型转换:当需要时,类型之间会自动发生类型转换: 字符串&#xff08;String&#xff09;、基本类型(如int) 和类型的包装类(如Integer) 类说明&#xff1a;如果在一个groovy 文件中没有任何类定义&#xff0c;它将被当做script 来处理&#xff0c;也就意味着这个文件将…