算法复杂度分析(下):最好、最坏、平均、均摊等时间复杂度概述

细化时间复杂度分析

代码千千万,有些代码逻辑会很复杂,所以为了更细化的分析算法的复杂度,再复杂度分析方面引入了4个知识点:

1.最好情况时间复杂度(best case time complexity)。

2.最坏情况时间复杂度(worst case time complexity)。

3.平均情况时间复杂度(average case time complexity)。

4.均摊时间复杂度(amortized time complexity)。

 

复杂度分析 

示例如下(限定条件:0<n且0<x且n和x为整数):

 1 public int Function(int n, int x)
 2  {
 3      int sum = 0;
 4      for (int i = 1; i <= n; ++i)
 5      {
 6          if (i == x)
 7              break;
 8          sum += i;
 9      }
10      return sum;
11  }
12  /*
13  * 作者:Jonins
14  * 出处:http://www.cnblogs.com/jonins/
15  */

这段代码逻辑非常简单,再此不描述。需要重点分析的是循环这一段代码,这段代码根据x值的不同,时间复杂度也有区别:

1.当x>n时,此代码的时间复杂度是O(n)

2.当1<=x<=n时,时间复杂度是一个我们不确定的值,取决于x的值。

3.当x=1时,时间复杂度是O(1)

这段代码在不同情况下,其时间复杂度是不一样的。所以为了描述代码在不同情况下的不同时间复杂度,我们引入了最好最坏平均时间复杂度

 

最好情况时间复杂度

最好情况时间复杂度,表示在最理想的情况下,执行这段代码的时间复杂度。

上述示例就是当x=1的时候,循环的第一个判断就跳出,这个时候对应的时间复杂度就是最好情况时间复杂度。

 

最坏情况时间复杂度

最坏情况时间复杂度,表示在最糟糕的情况下,执行这段代码的时间复杂度。

上述示例就是n<x的时候,我们要把整个循环执行一遍,这个时候对应的时间复杂度就是最坏情况时间复杂度。

 

平均情况时间复杂度

最好和最好情况是极端情况,发生的概率并不大。为了更有效的表示平均情况下的时间复杂度,引入另一个概念:平均情况时间复杂度

分析上面的示例代码,判断x在循环中出现的位置,有n+1种情况:1<=x<=n 和n<x

我们将所有情况下代码执行的次数累加起来1+2+3....+n)+n,然后再除以所有情况数量(n+1),就可以得到需要遍历次数的平均值。

平均情况复杂度为:

$ \frac{((1+2+3...+n)+n)}{(n+1)}=\frac{n(n+3)}{2(n+1)} $

推导过程:

$ \because 1+2+3...+n=n+(n-1)+(n-2)...+1 $

$ \therefore (1+2+3...+n)=\frac{n(1+n)}{2} $

$ \therefore   (1+2+3...+n)+n= \frac{n(3+n)}{2} $

大O表示法,会省略系数、低阶、常量,所以平均情况时间复杂度是O(n)

但是这个平均复杂度没有考虑各自情况的发生概率,这里的n+1情况,它们的发生概率是不一样的,所以还需要引入各自情况发生的概率再具体分析。

x要么在1~n中,要么不在1~n中,所以它们的概率都是$\frac{1}{2}$

同时数据在1~n中各个位置的概率都是一样的为$\frac{1}{n}$。根据概率乘法法则,x在1~n中任意位置的概率是$\frac{1}{2n}$

因此在前面推导过程的基础上,我们把每种情况发生的概率考虑进去,那么平均情况时间复杂度的计算过程变成:

考虑概率的平均情况复杂度为:

$(1\frac{1}{2n}+2\frac{1}{2n}+3\frac{1}{2n}...+n\frac{1}{2n})+n\frac{1}{2}=\frac{3n+1}{4}$

推导过程:

$\because (1+2+3...+n)=\frac{n(1+n)}{2}$ 

$\therefore (1\frac{1}{2n}+2\frac{1}{2n}+3\frac{1}{2n}...+n\frac{1}{2n})=\frac{1}{2n}(1+2+3...+n)=\frac{1}{2n}*\frac{n(1+n)}{2} =\frac{1+n}{4}$ 

$\therefore (1\frac{1}{2n}+2\frac{1}{2n}+3\frac{1}{2n}...+n\frac{1}{2n})+n\frac{1}{2}=\frac{1+n}{4} +n\frac{1}{2}=\frac{3n+1}{4}$ 

 

这就是概率论中的加权平均值,也叫做期望值,所以平均时间复杂度全称叫:加权平均时间复杂度或者期望时间复杂度

引入概率之后,平均复杂度变为O($\frac{3n+1}{4}$),忽略系数及常量后,最终得到加权平均时间复杂度为O(n)。

注意:

多数情况下,我们不需要区分最好、最坏、平均情况时间复杂度。只有同一块代码在不同情况下时间复杂度有量级差距,我们才会区分3种情况,为的是更有效的描述代码的时间复杂度。

 

均摊情况时间复杂度

均摊复杂度是一个更加高级的概念,它是一种特殊的情况,应用的场景也更加特殊和有限。

对应的分析方式称为:摊还分析或平摊分析。

示例如下(限定条件:0<=x<=n且0<=n且n,x为整数):

 1 int n;
 2 int Function2(int x)
 3 {
 4     int count = 0;
 5     if (n == x)
 6     {
 7         for (int i = 0; i < n; i++)
 8         {
 9             count += i;
10         }
11     }
12     else
13         count = x;
14     return count;
15 }
16 /* 作者:Jonins
17 * 出处:http://www.cnblogs.com/jonins/
18 */

分析上述案例的时间复杂度:

最理想情况下x!=n,只执行一次赋值即可推出,所以最好时间复杂度为O(1)。

最坏的情况下x=n,要执行一次循环累加和的操作,所以最好时间复杂度为O(n)。

平均的情况下,因为限定条件0<=x<=n,x在0~n中存在的位置可以分为n+1种情况(0到n)。

0<=x<n时,时间复杂度为O(1)。但是x=n的时候是一个例外,它的复杂度是O(n)。

而且这n+1种情况发生的概率都是一样的,为$\frac{1}{n+1}$。所以根据加权平均的计算方法,

平均时间复杂度为:

$ (1\tfrac{1}{n+1}+1\tfrac{1}{n+1}+1\tfrac{1}{n+1}+...+1\tfrac{1}{n+1})+n\tfrac{1}{n+1} = \tfrac{2n}{n+1} $

推导过程:

$(1\tfrac{1}{n+1}+1\tfrac{1}{n+1}+1\tfrac{1}{n+1}+...+1\tfrac{1}{n+1})+n\tfrac{1}{n+1}$

$=n\tfrac{1}{n+1}+n\tfrac{1}{n+1}$

$=\tfrac{2n}{n+1}$

当省略系数及常量后,平均时间复杂度为O(1)。

摊还分析法

分析上述示例的平均复杂度分析并不需要如此复杂,无需引入概率论的知识。

因为通过分析可以看出,上述示例代码复杂度大多数为O(1),极端情况下复杂度才较高为O(n)。同时复杂度遵循一定的规律,一般为1个O(n),和n个O(1)。针对这样一种特殊场景使用更简单的分析方法:摊还分析法

通过摊还分析法得到的时间复杂度为均摊时间复杂度

大致思路:每一次O(n)都会跟着n次O(1),所以把耗时多的复杂度均摊到耗时低的复杂度。得到的均摊时间复杂度为O(1)。

应用场景:均摊时间复杂度和摊还分析应用场景较为特殊,对一个数据进行连续操作,大部分情况下时间复杂度都很低,只有个别情况下时间复杂度较高。而这组操作其存在前后连贯的时序关系。

这个时候我们将这一组操作放在一起分析,将高复杂度均摊到其余低复杂度上,所以一般均摊时间复杂度就等于最好情况时间复杂度。

注意:均摊时间复杂度是一种特殊的平均复杂度(特殊应用场景下使用),掌握分析方式即可。

 

 

转载于:https://www.cnblogs.com/jonins/p/9956752.html

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

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

相关文章

梦想成真…教学–专业的Java开发人员:工具和最佳实践

我总是喜欢分享知识。 我写博客的原因之一是分享我在软件工程师方面的知识。 创立并运行&#xff08;与几个朋友一起&#xff09;第一个 早在2003年&#xff0c; 希腊的Java用户组就是由于我们在工作中得不到足够的培训或个人开发机会&#xff0c;因此我们希望共享和重用我们作…

arachni web mysql数据库_Web安全扫描工具Arachni

Arachni是一个多功能、模块化、高性能的Ruby框架&#xff0c;旨在帮助渗透测试人员和管理员评估web应用程序的安全性。同时Arachni开源免费&#xff0c;可安装在windows、linux以及mac系统上&#xff0c;并且可导出评估报告。一、Arachni下载与启动&#xff0c;以LInux环境为例…

tomcat - 报错 No such device; No faulty members identified.

启动tomcat集群的时候出现以下报错&#xff0c;导致集群没办法启动&#xff1a; java.net.SocketException: No such device; No faulty members identified. SEVERE: Unable to start cluster. org.apache.catalina.tribes.ChannelException: java.net.SocketException: No su…

设计模式09----门面设计模式

转自&#xff1a;https://www.cnblogs.com/lthIU/p/5860607.html 针对外观模式&#xff0c;在项目开发和实际运用中十分频繁&#xff0c;但是其极易理解&#xff0c;下面就简要介绍一下。 一、概念介绍 外观模式&#xff08;Facade&#xff09;,他隐藏了系统的复杂性&#xff0…

mysql 匿名块_MySQL存储过程定义中的特性(characteristic)的含义

MySQL的存储过程蛮啰嗦的&#xff0c;与MSSQL或者Oracle的存储过程相比&#xff0c;如果没有显式指定&#xff0c;他会隐含地指定一系列特性(characteristic)的默认值来创建存储过程通常在使用图形界面工具进行存储过程编写的时候&#xff0c;图形界面工具会自动加上这部分内容…

Tomcat集群和Session共享的配置方法

Tomcat集群配置其实很简单&#xff0c;在Tomcat自带的文档中有详细的说明( /docs/cluster-howto.html )&#xff0c;只不过是英语的&#xff0c;对我这样的人来说很难懂 。 下面根据说下怎么配置吧&#xff1a; 第一步、准备工作&#xff1a; 准备几份Tomcat程序&#xff0c…

Python:GUI Tkinter

GUI编程 GUI编程&#xff08;Graphical User Interface Programming&#xff09;指的是用于创建图形用户界面的程序设计。这种界面采用图形方式显示信息&#xff0c;让用户可以通过图形化的方式与程序进行交互&#xff0c;而不是仅仅通过文本命令。GUI编程使得软件更加直观易用…

jenkins配置工程目录-启动case

1.我们在python里面编辑的脚本可以正常跑&#xff0c;但是在cmd里面跑就不行了&#xff0c;找不到自己定义的方法模块&#xff0c;这个时候我们要搞个环境变量 name : PYTHONPATH val : 工程目录路劲如&#xff1a; D:python\test 这个时候我们再次cmd运行发现可以运行了…

mrunit_使用MRUnit测试Hadoop程序

mrunit这篇文章将略微绕开使用MapReduce实现数据密集型处理中发现的模式&#xff0c;以讨论同样重要的测试。 汤姆•惠勒 &#xff08; Tom Wheeler&#xff09;在纽约2012年Strata / Hadoop World会议上参加的一次演讲给了我部分启发。 当处理大型数据集时&#xff0c;想到的并…

mysql innodb flush method_对innodb_flush_method的一点解释

官方文档描述如下&#xff1a;By default, InnoDB uses the fsync()system call to flush both the data and log files. Ifinnodb_flush_method option is set to O_DSYNC, InnoDB uses O_SYNC to open and flush thelog files, and fsync()to flush the data files. If O_DIR…

信号量、互斥体和自旋锁

一、信号量 信号量又称为信号灯&#xff0c;它是用来协调不同进程间的数据对象的&#xff0c;而最主要的应用是共享内存方式的进程间通信。本质上&#xff0c;信号量是一个计数器&#xff0c;它用来记录对某个资源&#xff08;如共享内存&#xff09;的存取状况。一般说来&…

alembic教程

安装pip install alembic步骤 1.初始化 alembic 仓库 在终端中&#xff0c; cd 到你的项目目录中&#xff0c;然后执行命令 alembic init alembic &#xff0c;创建一个名叫 alembic 的仓库。2.创建模型 class User(Base):__tablename__ userid Column(Integer,primary_keyTr…

实际的Reactor操作–检索Cloud Foundry应用程序的详细信息

CF-Java-Client是一个库&#xff0c;可通过程序访问Cloud Foundry Cloud Controller API 。 它建立在Project Reactor之上&#xff0c;它是Reactive Streams规范的实现&#xff0c;并且使用此库在Cloud Foundry环境中做一些实际的事情是一个有趣的练习。 考虑一个示例用例–给…

mysql生成app接口_Java实现app接口和Socket消息传递(10)java连接MySQL实现App登录接口...

原创&#xff1a;http://blog.csdn.net/iwanghang1.先来个Androiod端口的GIF效果图App图标大家可能没看清&#xff0c;这个是AndroidStudio3.0最新的默认App图标哦~~2.不要忘记把MySQL的jar导进来jar包放入的位置在这里&#xff1a;D:\eclipse-workspace\.metadata\.plugins\or…

centos yum安装nginx 提示 No package nginx available问题解决方法

问题原因&#xff1a; nginx位于第三方的yum源里面&#xff0c;而不在centos官方yum源里面 解决方法&#xff1a; 安装epel(Extra Packages for Enterprise Linux) a、去epel网站 http://fedoraproject.org/wiki/EPEL下载 b、我的系统是centos5.7&#xff0c;cpu是x86_64&#…

链接生成二维码图片

https://packagist.org/packages/houdunwang/qrcode转载于:https://www.cnblogs.com/pansidong/p/10247663.html

mysql pxc测试_Mysql同步机制 - PXC 压力测试 tpcc安装及使用

tpcc是针对mysql单机制定的测试标准&#xff0c;这个标准对于pxc集群来说要求太高&#xff0c;所有后面即使有些项目没有通过也不必太过在意&#xff0c;主要是压一下事务处理能力。Mysql单机虽然写入速度快&#xff0c;但相比于Mysql集群&#xff0c;单机能承受的并发能力远比…

RHEL(Red Hat Enterprise Linux)配置YUM源

前言 YUM&#xff08;全称为 Yellow dog Updater, Modified&#xff09;是一个在Fedora中的Shell前端软件包管理器。基于RPM包管理&#xff0c;能够从指定的服务器自动下载RPM包并且安装&#xff0c;可以自动处理依赖性关系&#xff0c;并且一次安装所有依赖的软体包&#xff…

java中集合判空_Java中的类型安全的空集合

java中集合判空我以前曾在Java Collections类的实用程序上进行过博客撰写&#xff0c;并且特别地在使用Usings Collections Methods上的博客emptyList&#xff08;&#xff09;&#xff0c;emptyMap&#xff08;&#xff09;和emptySet&#xff08;&#xff09;上进行了博客撰写…

cnn验证码识别代码_中文项目:快速识别验证码,CNN也能为爬虫保驾护航

原标题&#xff1a;中文项目&#xff1a;快速识别验证码&#xff0c;CNN也能为爬虫保驾护航机器之心专栏作者&#xff1a;Nick Li随着卷积网络的推广&#xff0c;现在有各种各样的快捷应用&#xff0c;例如识别验证码和数学公式等。本文介绍了一个便捷的验证码识别项目&#xf…