六、Analysis of quicksort

1 引言

如题目所示,本节的精华在于用数学解决一个直觉上看似纷乱复杂的问题,里面有一些一般性的分析方法,如引入Indicator变量,从而把不确定问题引入到概率框架进行分析,一步一步把直觉上混乱的问题理清楚,数学之美也就是如此吧!

如果有个算法在某些情况下表现的很差,在某些情况下又表现的不错,那么你还会放心的使用该算法吗?通过下面的分析后你会很放心使用快速排序算法。

2 Quicksort

2.1 算法描述

在这里插入图片描述
在这里插入图片描述

2.2 手工演示

  • 指针iii指示的是≤pivot\leq pivotpivot的最后一个,作用是是用来标记≤pivot\leq pivotpivot≥pivot\geq pivotpivot的分割状态,指针jjj用来遍历所有元素,每遍历一个元素都会和pivotpivotpivot比较,不断更新iii的指示状态。
    在这里插入图片描述

2.3 实现

# -*- coding: utf-8 -*-def PARTITION(A, p, r):x = A[r]i = p - 1for j in range(p, r):if A[j] <= x:i = i + 1A[i], A[j] = A[j], A[i]A[i + 1], A[r] = A[r], A[i + 1]return i + 1def QUICK_SORT(A, p, r):if p < r:q = PARTITION(A, p, r)QUICK_SORT(A, p, q - 1)QUICK_SORT(A, q + 1, r)if __name__ == '__main__':A = ['x', 2, 8, 7, 1, 3, 5, 6, 4]print('before sort:', A[1:])QUICK_SORT(A, 1, len(A) - 1)print('after sort:', A[1:])

运行结果:

before sort: [2, 8, 7, 1, 3, 5, 6, 4]
after sort: [1, 2, 3, 4, 5, 6, 7, 8]

3 Analysis of quicksort

3.1 worst case

在这里插入图片描述
用递归树分析如下:
在这里插入图片描述

3.2 best case

在这里插入图片描述
应用主定理容易得到T(n)=Θ(nlogn)T(n)=\Theta(nlogn)T(n)=Θ(nlogn)

3.3 110,910\frac{1}{10}, \frac{9}{10}101,109case

下面看一种感觉直觉上很差,其实效果很好的情况。
在这里插入图片描述
使用递归树分析:
在这里插入图片描述

  • 注意log109n/log2n=log1092log_{\frac{10}{9}}n/log_{2}n = log_{\frac{10}{9}}2log910n/log2n=log9102,这是一个常数。

3.4 worst best交替情况

在这里插入图片描述

  • 好坏交替的情况下,最后仍然是好的!

3.5 random case

上面从矛盾的特殊性上让直觉有一个直观的感受,只要不是特别极端(如一个初始状态是逆序的数列),貌似大部分情况下都是ok的,下面用概率框架确认这种直观的感觉是正确的。

  • 对于离散不确定问题,要引入概率框架进行讨论,首先要引入一个合适的随机变量,这里引入指示器(Indicator)随机变量,这个变量在机器学习算法中使用更为广泛,看似简单的一个定义,却可以化繁为简的用一个表达式表示所有情况。
    在这里插入图片描述

  • 至此,已经进入到概率框架,可以暂时忘记之前的算法问题背景:
    在这里插入图片描述

  • 概率世界都是是不确定的,研究概率大目的是找出不确定问题的平均特性,如期望、方差等,这里只关注期望。

  • 下面的推到中用到了期望的线性可加性和独立可乘性。

分割的独立性:第一次分割后,数组分为第a部分和第b部分,a部分具体在哪个位置分割已经和第一次分割没有关系。

在这里插入图片描述

  • 猜想E[T(n)]≤anlgnE[T(n)] ≤ an lg nE[T(n)]anlgn,a足够大,接下来数学归纳法要登场了!,首先有一个数学事实要知道,这个结论也是用数学归纳法容易证明:
    在这里插入图片描述

  • 使用数学归纳法证明E[T(n)]≤anlgnE[T(n)] ≤ an lg nE[T(n)]anlgn
    在这里插入图片描述

4 总结

  • 从上面的分析中可以看到,快速排序大概率是Θ(nlogn)\Theta(nlogn)Θ(nlogn)的,在实际应用中快速排序往往是归并排序速度的2倍以上,如果在细节上对算法微调,则可以表现出更好的性能.

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

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

相关文章

Javaweb maven项目tomcat报错: javax.naming.NamingException: 无法创建资源实例

报错地址 2. 原因分析 1. Resource注解无效&#xff0c;注入失败&#xff0c;你得从容器中把bookInfoServie取去来&#xff0c;用getBean的方式创建BookInfoServiceImpl对象 2.删掉Resource注解&#xff0c;重新部署搞定。3.不要在意写了个Contorller, 初学spring&#xff0c;…

如何给APK文件签名

转载地址&#xff1a;http://www.apkbus.com/forum.php?modviewthread&tid1264211.签名的意义   为了保证每个应用程序开发商合法ID&#xff0c;防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序&#xff0c;我们需要对我们发布的APK文件进行唯一…

七、基于比较的排序算法总结

1 问题 至此&#xff0c;总结一下已经研究过的排序算法&#xff1a; insertion sort&#xff0c;Θ(n2)\Theta(n^2)Θ(n2) merge sort, Θ(nlogn)\Theta(nlogn)Θ(nlogn) quicksort, Θ(nlogn)\Theta(nlogn)Θ(nlogn) heapsort,Θ(nlogn)\Theta(nlogn)Θ(nlogn) 从上面这个现象…

转账为demo,spring事务

spring 事务使用1. 业务代码2. xml配置3. 注解配置1. 业务代码 数据表结构 dao package com.lovely.dao.impl;import com.lovely.dao.AccountDao; import org.springframework.jdbc.core.JdbcTemplate;/*** author echo lovely* date 2020/8/9 11:01*/ public class AccountD…

影响你35岁前成功的好习惯与坏习惯

你想成功吗&#xff1f;那就及早培养有利于成功的好习惯。 习惯的力量是惊人的&#xff0c;35岁以前养成的习惯决定着你是否成功。 有这样一个寓言故事&#xff1a;一位没有继承人的富豪死后将自己的一大笔遗产赠送给远房的一位亲戚&#xff0c;这位亲戚是一个常年靠乞讨为生…

八、计数排序及其应用分析

1 本节思路 之前的算法的最基本的思想是比较元素大小&#xff0c;所以算法复杂度最好是Θ(nlogn)\Theta(nlogn)Θ(nlogn)&#xff0c;本节不再基于元素比较&#xff0c;而是基于计数的Counting sort&#xff0c;然后应用在Radix sort上。 2 Counting sort 2.1 算法思想 Cou…

Google开发者模式调试css样式的方法

界面如下&#xff0c;你需要调试css样式… 看下图&#xff0c;高仿某云播放界面部分 需求 1.h5开发手机端界面&#xff0c;禁用缩放 2.如何精准的定位像上图一样&#xff0c;或者更好 3.使用Google调试器&#xff0c;调试css样式如何调样式 选择对应的样式 确定多个元素…

OD汇编需要标签

如何解决&#xff0c;看那红体字。。。 push 0046ad70 标签就是地址的引用 zai破解的道路上面面前行 技术参考&#xff1a;http://zhidao.baidu.com/link?url8JP8KFxTinclhl6MwpaZw5buhtv1p4zgpjy8rKkBPvD4YqCq2uudXQZrhuBLPGZm5ahe3d7YsLb3MeAFDXfsua转载于:https://www.cnbl…

git与github使用

1 从github上clone到本地 配置Git 首先在本地创建ssh key&#xff1b; $ ssh-keygen -t rsa -C "your_emailyouremail.com"后面的your_emailyouremail.com改为你在github上注册的邮箱&#xff0c;之后会要求确认路径和输入密码&#xff0c;我们这使用默认的一路回车…

bootstrap panel 布局

panel1. 效果2. 基于bootstrap实现用于页面分专栏展示 1. 效果 成品 2. 基于bootstrap实现 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>panel 布局</title><link rel"stylesheet" href"cs…

GDB高级调试

一、多线程调试 多线程调试可能是问得最多的。其实&#xff0c;重要就是下面几个命令&#xff1a; info thread 查看当前进程的线程。thread <ID> 切换调试的线程为指定ID的线程。break file.c:100 thread all 在file.c文件第100行处为所有经过这里的线程设置断点。set …

pytorch之with torch.no_grad

在使用pytorch时&#xff0c;并不是所有的操作都需要进行计算图的生成&#xff08;计算过程的构建&#xff0c;以便梯度反向传播等操作&#xff09;。而对于tensor的计算操作&#xff0c;默认是要进行计算图的构建的&#xff0c;在这种情况下&#xff0c;可以使用 with torch.n…

mysql时间处理

两种方式&#xff0c;一个是在数据库查询的时候就截取&#xff0c;另一个就是在使用的时候截取。 1.数据库 select date_format(日期字段,’%Y-%m-%d’) as ‘日期’ from test 2.java程序 SimpleDateFormat dateFm new SimpleDateFormat("yyyy-MM-dd"); String da…

pytorch之object.grad.zero_()

object.grad.zero_()的意思是清0object的梯度值。 下面做个实验。 x torch.arange(4.0) x.requires_grad_(True) x.grad # 注意此时为None&#xff0c;不为0 y 2 * torch.dot(x, x) y.backward() x.grad # tensor([ 0., 4., 8., 12.]) x.grad.zero_() x.grad # tensor([0.…

PHP日期、时间戳相关的小程序

1、日期区间内的日期列表&#xff08;天&#xff09;&#xff1a; 1 public function dateExtent($begin,$end){ 2 $begin strtotime($begin); 3 $end strtotime($end); 4 while($begin<$end){ 5 $dateArr[] date…