快速排序平均时间复杂度分析

x 1 , … , x n x_1,\dots,x_n x1,,xn进行快速排序
partition node: x [ k ] x[k] x[k]为随机划分元
x [ k ] x[k] x[k] 被选择的概率为 1 / n 1/n 1/n,令 C n C_n Cn 为规模为n的问题的比较次数(即 T ( n ) T(n) T(n) )
C n = ( n − 1 ) + 1 n ∑ k = 1 n ( C k − 1 + C n − k ) = ( n − 1 ) + 1 n ∑ k = 1 n C k − 1 + 1 n ∑ k = 1 n C n − k = ( n − 1 ) + 1 n ∑ k = 0 n − 1 C k + 1 n ∑ k = 0 n − 1 C k = ( n − 1 ) + 2 n ∑ k = 0 n − 1 C k \begin{align*} C_n&=(n-1)+\frac{1}{n}\sum_{k=1}^n(C_{k-1}+C_{n-k})\\ &=(n-1)+\frac{1}{n}\sum_{k=1}^n C_{k-1}+\frac{1}{n}\sum_{k=1}^n C_{n-k}\\ &=(n-1)+\frac{1}{n}\sum_{k=0}^{n-1} C_{k}+\frac{1}{n}\sum_{k=0}^{n-1} C_{k}\\ &=(n-1)+\frac{2}{n}\sum_{k=0}^{n-1} C_{k} \end{align*} Cn=(n1)+n1k=1n(Ck1+Cnk)=(n1)+n1k=1nCk1+n1k=1nCnk=(n1)+n1k=0n1Ck+n1k=0n1Ck=(n1)+n2k=0n1Ck
因此
n C n = n ( n − 1 ) + 2 ∑ k = 0 n − 1 C k ① nC_n=n(n-1)+2\sum_{k=0}^{n-1}C_k\quad ① nCn=n(n1)+2k=0n1Ck
n − 1 n-1 n1 代入 n n n,得
( n − 1 ) C n − 1 = ( n − 1 ) ( n − 2 ) + 2 ∑ k = 0 n − 2 C k ② (n-1)C_{n-1}=(n-1)(n-2)+2\sum_{k=0}^{n-2}C_k\quad② (n1)Cn1=(n1)(n2)+2k=0n2Ck
① − ② ①-②
n C n − ( n − 1 ) C n − 1 = 2 ( n − 1 ) + 2 C n − 1 ⇒ n C n = 2 ( n − 1 ) + ( n + 1 ) C n − 1 ③ ⇒ C n n + 1 = C n − 1 n + 2 ( n − 1 ) n ( n + 1 ) \begin{align*} &nC_n-(n-1)C_{n-1}=2(n-1)+2C_{n-1}\\ \Rightarrow &nC_n=2(n-1)+(n+1)C_{n-1}\quad ③\\ \Rightarrow &\frac{C_n}{n+1}=\frac{C_{n-1}}{n}+\frac{2(n-1)}{n(n+1)} \end{align*} nCn(n1)Cn1=2(n1)+2Cn1nCn=2(n1)+(n+1)Cn1n+1Cn=nCn1+n(n+1)2(n1)
D n = C n n + 1 D_n=\frac{C_n}{n+1} Dn=n+1Cn
D n = D n − 1 + 2 ( n − 1 ) n ( n + 1 ) ④ D_n=D_{n-1}+\frac{2(n-1)}{n(n+1)}\quad④ Dn=Dn1+n(n+1)2(n1)
因此
D n = 2 ∑ j = 1 n j − 1 j ( j + 1 ) = 2 ∑ j = 1 n 2 j + 1 − 2 ∑ j = 1 n 1 j = 4 ∑ j = 2 n + 1 1 j − 2 ∑ j = 1 n 1 j = 2 ∑ j = 1 n 1 j + 4 n + 1 − 4 = 2 H n − 4 n n + 1 ≈ 2 ln ⁡ n + O ( 1 ) = 2 log ⁡ 2 e log ⁡ 2 n + O ( 1 ) ≈ 1.44 log ⁡ 2 n \begin{align*} D_n&=2\sum_{j=1}^n\frac{j-1}{j(j+1)}\\ &=2\sum_{j=1}^n\frac{2}{j+1}-2\sum_{j=1}^n\frac{1}{j}\\ &=4\sum_{j=2}^{n+1}\frac{1}{j}-2\sum_{j=1}^n\frac{1}{j}\\ &=2\sum_{j=1}^n\frac{1}{j}+\frac{4}{n+1}-4\\ &=2H_n-\frac{4n}{n+1}\\ &\approx2\ln n+O(1)\\ &=\frac{2}{\log_2 e}\log_2 n+O(1)\\ &\approx1.44\log_2 n \end{align*} Dn=2j=1nj(j+1)j1=2j=1nj+122j=1nj1=4j=2n+1j12j=1nj1=2j=1nj1+n+144=2Hnn+14n2lnn+O(1)=log2e2log2n+O(1)1.44log2n
因此
C n ≈ 1.44 n log ⁡ 2 n = O ( n log ⁡ n ) C_n\approx1.44n\log_2 n=O(n\log n) Cn1.44nlog2n=O(nlogn)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL注入的原理 什么SQL注入 将SQL代码插入到应用程序的输入参数中,之后,SQL代码被传递到数据库执行。从而达到对应用程序的攻击目的。 注入原理 常见攻击方法 检测是否可以注入【检测注入点】 示例:http://192.168.0.1/temp.aspx?id=a or 1=1-- 如果上面语句可以执行说明可以实现注入,则可以 利用系统过程、系统表注入数据库 示例【给系统添加一个用户,黑客可以实现远程登录控制服务器】:http://192.168.0.1/temp.aspx?id=1;exec xp_cmdshell 'net user admin 123456 /add' 绕过程序的限制 示例:程序中往往限制单引号的数据,但是黑客传入单引号的ASCII码 跨站点注入 在Web页面挂某些恶意的HTML、JavaScript代码 防范SQL注入 限制错误信息的输出,避免错误信息的输出使得黑客知道网站的技术实现采用什么数据库,采用什么平台 示例:在Web.config文件中设置 限制访问数据库账号的权限 在开发应用系统的时候就应该限制,给程序最小访问数据库的权限 使用参数命令传递参数 不要使用拼接字符串的方式构造SQL语句而采用参数命令 使用存储过程 存储过程在数据库中 只能执行存储过程中固定的代码 限制输入长度 防止黑客输入超大字符串,导致服务器瘫痪 防止黑客输入较长的恶意脚本等 实现方法:文本框的MaxLength属性 URL重写技术 示例: http://testWeb/news.aspx?id=111 重写成:http://testWeb/10101111.html 传递参数尽量不用字符串 http://testWeb/news.aspx?id=111 and 1=1【黑色部分给了SQL注入的机会】 SQL优化 为什么要优化 开发是对性能考虑不多【技术差、项目工期紧等原因没有考虑性能问题】 系统运行中,数据量扩大,访问量增多,蹩脚的SQL危害开始显露 低效SQL的危害 系统响应变慢,软件开发中的8秒定律,当打开一个软件或网页超过8秒时间还没有显示,则响应太慢。 死锁,当不同用户都访问某些资源的时候SQL语句不当导致死锁 客户失去信心,软件失败 低效SQL低效在哪里?  性能低下的根源  硬件原因,数据库的配置不合理,数据库的数据文件和日志文件没有分磁盘存放,会极大影响IO性能  没有建立索引,或者SQL没有走索引。在千万级数据的表上建索引是很有必要的。  SQL过于复杂,过长的SQL语句满足程序需求但是影响性能。子查询嵌套过多对性能有影响,查询关联的表特别多也影响性能  频繁访问数据等等 SQL如何被SQLServer执行的 SQL执行原理  解释:首先解释SQL语句【语法是否正确】  解析:检验语句的出现的对象是否有效【进行一个解析,要检查对象所有权的权限】  优化:【检查SQL语句是否能够使用索引,SQL语句如何执行效率高,制定一个执行计划】  编译:  执行SQL语句:【把编译过的查询要求提交并进行处理】 如何优化SQL 完善开发的管理 完善代码审核、测试机制,软件开发是艺术! 检测SQL查询的效率 语法【对IO和Time对SQL执行进行统计】: SET STATISTICS IO ON SET STATISTICS TIME ON ------------SQL代码--------- SET STATISTICS IO OFF SET STATISTICS TIME OFF 注意:在检测之前要清理缓存,因为当我们执行SQL语句的时候查出的数据会在数据库中进行缓存,重新查询会返回缓存中的信息。 DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE 经验:使用子查询嵌套不要过多,尽量使用表连接查询代替子查询,因为表连接查询效率稍高一点。 SQL优化工具 使用报表服务 通过Reporting Service查找低效SQL 选择 性能 - 批处理执行统计信息和性能相关的几个报表服务: 性能 - 对象执行统计信息 性能 - 按平均CPU时间排在前面的查询 性能 - 按平均IO次数排在前面的查询 性能 - 按总CPU时间排在前面的查询 性能 - 按IO总次数排在前面的查询 操作示范: 1. 数据引擎上点击右键—报表—标准报表—关心的

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值