计算时间复杂度详解

news/2025/2/12 20:49:22/

1,前置知识

我们在计算时间复杂度之前的前置知识是等差数列的通项公式和求和公式以及等比数 列的通项公式和求和公式

等差数列:

通项公式:an=a1+(n-1)d(d是公差)

求和公式:Sn=n(a1+an)/2

等比数列:

通项公式:an=a1*q^(n-1)(q是共比)

求和公式:Sn=a1*(1-q^n)/1-q

2,省略常数项

计算时间复杂度首先要抛开常数项的程序段

比如

void fun(int n)
{int i=0;while(i<=n){i++;}
}

这一段程序中,int i=0;这一句就是常数项的程序,他只会执行一次,所以我们只计算 while循环里面执行的次数

3,计算时间复杂度

计算时间复杂度就是计算执行某个程序需要执行多少次,着重计算带有阶数的程序段 比如上图代码while循环带有阶数,我们只计算while循环里面的时间复杂度,易知会 执行n次,所以时间复杂度为o(n)。

下面就介绍一下计算时间复杂度的通用方法是什么

比如这个例子

void fun(int n)
{int i=1;while(i<=n){i*=2}
}

我们省略常数项int i=0,我们只计算while循环里面执行的次数

我们知道,计算时间复杂度就是计算程序程序的次数,所以我们这里计算while循环总 共执行了多少次

执行次数

i

第一次执行

i=2

第二次执行

i=4

第三次执行

i=8

……

……

以此类推:2,4,8,16,……,可以发现i的值构成了一个等比数列,其中公比是2,第n 项an=2*2^(n-1)=>an=2^n

我们知道while循环执行结束的条件是i>n,我们假设执行了k次之后i>n,也就是不 满足while循环条件了,这个k值就是我们要求的时间复杂度的规模

所以根据an我们得到一个不等式,,当执行k次之后an的值>n,也就是2^k什么时候大于n,求得k值即可:

2^k=n时,k=\log_{2}k

所以当k大于\log_{2}k时,while循环结束,k值就是我们要求的时间复杂度规模,所以这个例子的时间复杂度就是O()

4,案例

(1)求下列程序段的时间复杂度

count=0for(k=1;k<=n;k*=2) ①for(j=1;j<=n;j++) ②count++;

首先计算①执行的次数

可以发现k构成一个等比数列,an=2^(n-1),当k=n时,执行了\log_{2}n-1次,也就说① 的时间复杂度为O(\log_{2}n)

我们在判断②的时间复杂度,②中执行的次数和外层循环无关,依次是:1,2,3,4……n, 所以可以发现构成一个等差数列,公差是1,an=n,当执行了n次之后循环结束时间, 故复杂度为O(n)

我们计算程序执行的次数只和内层循环执行的次数有关,也就是和count++执行的次数 有关,我们计算count++执行的次数就是计算整个程序执行的次数,也就是这个程序段 的时间复杂度

可以发现,count++执行的次数有内层循环和外出循环决定,也就是他俩相乘的结果 就是count++执行的次数,上面我们说了外层循环复杂度是\log_{2}n,而内层循环每次执行n次,所以总的时间复杂度是n*\log_{2}n,也就是O(n\log_{2}n)

这个程序段内层循环和外层循环无关,所以外层循环执行一次,内层循环都会执行n 次,当内层循环收到外层循环的限制时,时间复杂度就需要另算了

(2)

int i=0,sum=0;
while(sum<n)		sum+=++i;

sum的大小依次是:0+1,0+1+2,0+1+2+3,0+1+2+3+4……i,依次类推,可以发现构成一 个等差数列,Sn=i(i+1)/2,所以执行的次数满足(1+k)*k/2<n,也就是执行k=n^{1/2}次(这 里用求根公式算,答案的规模就是n^{1/2})后,循环结束,所以这个程序段的时间复杂度 为O(n^{1/2})


http://www.ppmy.cn/news/62083.html

相关文章

低代码平台解读—如何不写代码创建表单和维护表单

工作表新建与修改——敲敲云 新建工作表的流程包含 新建工作表/编辑公祖表为工作表添加字段&#xff0c;例如“员工档案”表中有姓名、性别、年龄等字段为字段设置属性工作表布局工作表预览、保存、关闭 1、新建工作表/修改工作表 新建工作表 修改工作表 2、为工作表添加字段 …

基于docker的confluent-kafka搭建及python接口使用

基于docker的confluent-kafka搭建及python接口使用 1. 安装docker以及docker-compose1.1 安装docker1.2 安装docker-compose 2. 安装confluent-kafka3. python接口使用3.1 安装依赖包3.2 创建、查看topic3.3 python接口-broker3.4 python接口-consumer 参考链接 本文介绍基于do…

[2023-DAS x SU战队2023开局之战] crypto-sign1n

题目描述&#xff1a; from secret import r, t from Crypto.Util.number import *flag bxxx flag bytes_to_long(flag) e 0x10001def gen_keys():p getPrime(1024)q getPrime(1024)phi (p-1)*(q-1)d inverse(e,phi)n p*qprint(fn {n})WHATF (d ** 3 3) % phiprint…

一个让人类窒息的AI工具,或许未来人工智能真的能代替人类!

时隔几周&#xff0c;「神采PromeAI」又更新了 不仅页面做了小小的调整 又增加了「背景生成」功能 害怕各位小伙伴找不到使用位置 今天小编就给大家分享一个超全的使用教程 极速出图效率翻倍 让神采PromeAI在应用性设计方面更具优势 温馨提示&#xff1a;目前手机适配端无…

PAVC100R4222 PARKER轴向柱塞泵

PAVC100R4222 PARKER轴向柱塞泵特点&#xff1a; 1、壳体为高强度铸铁 2、两段设计便于维护 3、全密封的轴用轴承 4、内置增压器***高转速性能&#xff0c;可达3000 RPM( PAVC100为2600 RPM) 5、控制器为插装形式&#xff0c;易于现场更换 6、配流盘为可替换的青铜复合 10、过滤…

redis 持久化 RDB + AOF

redis 持久化 RDB AOF 1.redis持久化----两种方式 RDB&#xff08;Redis DataBase&#xff09;和AOF&#xff08;Append Only File&#xff09; RDB&#xff0c;简而言之&#xff0c;就是在不同的时间点&#xff0c;将redis存储的数据生成快照并存储到磁盘等介质上 AOF&am…

MySQL的ID用完了,怎么办?

目 录 一 首先首先分情况 二 自增ID 1 mysql 数据库创建一个自增键的表 2 导出表结构 3 重新创建 自增键是4294967295的表 4 查看表结构 5 异常测试 三 填充主键 1 首先创建一个test 表&#xff0c;主键不自增 2 插入主键最大值 3 再次插入主键最大值1 四 没有声明…

项目角色定义

一、项目集经理的角色 项目集经理是由执行组织授权、领导团队实现项目集目标的人员。项目集经理对项目集的领导、 实施和绩效负责&#xff0c;并负责组建一支能够实现项目集目标和预期项目集效益的项目集团队。项目集经 理的角色与项目经理的角色不同。二者之间的差异是基于项…