随机选择算法时间复杂度分析

首先提供算法的伪代码:

算法是递归算法
时间复杂度分析思路:计算每一次递归语句所消耗的时间,再求和。

为了分析需要,我们先定义如下的量:

定义状态j:数组长度在[(3/4)(j+1)n,(3/4)jn]时,程序处在状态j。
定义Xj: 程序处于状态j时调用的递归次数, 即调用Xj次递归之后程序进入第j+1个状态。
partition的时间复杂度为c* n,其中c为常数,n为数组长度,且一次partition至多遍历数组的两倍长度,即c<=2。

因此,我们可以得到时间复杂度的数学表述:

runtime<=Σ Xj*c *(3/4)j * n---------------------------------------------------------------(1)

其中c是常数,(3/4)j * n代表状态j下的数组长度。

于是,问题就转化成了求出Xj
这里引入期望的概念,用E[]代表期望函数,

E[runtime] <= Σ E[Xj]*c *(3/4)j * n -------------------------------------------------------(2)

,从上式可以看出,runtime的大小只取决于Xj的大小,所以只将E[]作用于Xj

言归正传,Xj又是取决于什么呢,答案是每次partition的a的位置:
如果a1/4arrsize~3/4arrsize时,下一次递归后状态一定会改变。
对于这样的a,我们开心地称之为good pivot

而当a在0~1/4arrsize3/4arrsize~1arrsize,如果分割方向正确,那么下次递归状态也会改变,但是不能保证一定改变,所以下面关于Xj的式子用“<=”表示。

那么选到good pivot的概率是多大呢?很简单,1/2!
所以我们可以算出Xj的值:

Xj<=1/(0.5)=2----------------------------------------------------------------------(3)

式3代入式2,得到

E[runtime] <= Σ 2*c *(3/4)j * n

将Σ作用在(3/4)j上就有

E[runtime] <= 2cn * Σ(3/4)j

等比数列求和公式,有

E[runtime] <= 8cn = O(n)

所以,我们得到算法时间复杂度为O(n)

随机选择算法时间复杂度分析相关推荐

  1. 快速排序(随机主元)、随机数生成和随机选择算法

    快速排序(朴素) #include<bits/stdc++.h> using std::cin; using std::cout; using std::endl; /*实际过程见算法笔记 ...

  2. 算法时间复杂度分析基础

    摘要       本文论述了在算法分析领域一个重要问题--时间复杂度分析的基础内容.本文将首先明确时间复杂度的意义,而后以形式化方式论述其在数学上的定义及相关推导.从而帮助大家从本质上认清这个概念. ...

  3. 希尔排序选择排序时间复杂度分析

    #include <stdio.h> #include <stdlib.h>void shellsort(char array[],int len); void selects ...

  4. 算法时间复杂度分析——大O、大Ω、大θ、小o,小ω

    最近开始转战传统算法分析的研究工作了,重新拾起以前学过的一些内容. 目录 一.概述 二.对常见的Ο和Ω进行分析 2.1 大O表示法 2.2 大Ω表示法 三.P问题,NP问题,NP-hard问题,NPC ...

  5. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  6. 算法时间复杂度分析专题一(帮助快速解题)

    笔试: 题目告诉数据范围,根据题目的数据范围来考虑用什么解法 c++竞赛:一般时限1~2秒 时间范围内指令操作次数<10^8 不同数据范围下,代码时间复杂度和算法该如何选择: n<=30, ...

  7. 【排序算法时间复杂度分析】递推式

    关于包含递归调用的时间复杂度分析-以归并排序为例子 T(n) = 2*T(n/2)+O(n) T(n/2) 代表一次递归 O(n)代表合并 T(1) = T(1) T(n)/n = T(n/2)/(n ...

  8. Dijkstra算法时间复杂度分析

    文章目录 Dijkstra算法的思路与关键点 Dijkstra算法的时间复杂度 之前一直默认Dijkstra算法时间复杂度为 o(n2)o(n^{2})o(n2),没有思考过具体的时间复杂度,今天把这 ...

  9. 排序算法时间复杂度分析

    排序算法中比较次数与初始元素序列排序无关的只有选择排序和基数排序,其他的都有关.元素的移动次数与关键字的初始排列次序无关的是:基数排序 元素的比较次数与初始序列无关是:选择排序.折半插入排序 算法的时 ...

最新文章

  1. 160613、MyBatis insert操作返回主键
  2. lamp一键安装包的一些注意点
  3. 什么技能产品经理不会提,但技术人必须懂?
  4. RabbitMQ 核心部分
  5. Matplotlib画图常用方法总结(全)
  6. 有道云笔记导入到CSDN博客
  7. hapi 使用 lab 和 code 进行测试
  8. Nodejs框架+uniapp前端微商个人相册多端小程序源码
  9. 【2017百度之星程序设计大赛 - 资格赛】 度度熊与邪恶大魔王
  10. sqlserver 批量删除相同前缀名的表
  11. 2、Python_Day_1_作业
  12. linux趋势杀毒安装目录,趋势杀毒软件在AX3.0上的安装
  13. [Unity特效]使用Projector投影仪来制作角色脚下的特效圆环以及技能指示器skill indicator
  14. 开源RPC框架Pigeon
  15. 快速沃尔什变换学习笔记
  16. JavaScript中md5加密基础使用方法
  17. 西南大学计算机学院导师,西南大学计算机与信息科学学院研究生导师简介-陈武...
  18. jQuery使用ajaxSubmit()提交表单示例
  19. 在两台设备chrome之间同步自己的书签
  20. 获取webservice(wsdl)数据包

热门文章

  1. 华为发布中国城市治理数字化转型报告,打造城市治理“一网统管”新范式
  2. 数据结构——CCF真题:疲劳度问题
  3. (原创)LEON3入门教程(四):基于AMBA APB总线的七段数码管IP核设计
  4. centos安装nginx教程
  5. About iSCSI Storage
  6. JavaScript 中的forEach()方法
  7. 苹果提交专利终止宣誓书 三星上诉将更加困难
  8. c语言课程设计台球厅系统,Monstarrr
  9. 鸿蒙无锡有什么特产,无锡特产都有哪些,你知道吗
  10. C#实现Windows资源管理器 C# File Explorer