计算时间复杂度详解

news2024/11/19 15:27:06

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=0

for(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.coloradmin.cn/o/492163.html

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

相关文章

【Python入门知识】NumPy数组拆分,超详细讲解

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 今天我们来学习python中NumPy数组的拆分 拆分 NumPy 数组 拆分是连接的反向操作。 连接&#xff08;Joining&#xff09;是将多个数组合并为一个&#xff0c;拆分&#xff08;Spliting&#xff09;将一个数组拆分为多个。…

Mysql 学习(七)独立表结构存储 二

段的结构 上一节说过表空间分为各个段&#xff0c;每个段里面又是以区为单位&#xff0c;每个区则有64个页。区根据剩余存储空间分为&#xff1a;Free&#xff0c;FREE_FRAG&#xff0c;FULL_FRAG 三种类型&#xff0c;为了方便管理区&#xff0c;给每个区创建XDES Entry结构&…

【校招VIP】用户反驳:你说大厂校招不会问框架实战,现在就有问的了,打脸了吧?一看是专业技能给自己挖的坑

最近有个用户过来质疑&#xff0c;不是说大厂不考框架的使用吗&#xff1f; 但网上的这两份面经里&#xff0c;却问到关于SpringBoot的问题。 接着发来了相对应的简历&#xff0c;一看&#xff0c;直接真相大白&#xff1a; 他在专业技能这栏写了&#xff1a;我熟练掌握Sprin…

flink内存参数配置学习

直接上官网 配置 JobManager 内存 | Apache Flink配置 JobManager 内存 # JobManager 是 Flink 集群的控制单元。 它由三种不同的组件组成&#xff1a;ResourceManager、Dispatcher 和每个正在运行作业的 JobMaster。 本篇文档将介绍 JobManager 内存在整体上以及细粒度…

自动驾驶中地图匹配定位技术总结

引言 汽车定位是让自动驾驶汽车知道自身确切位置的技术&#xff0c;在自动驾驶系统中担负着相当重要的职责。汽车定位涉及多种传感器类型和相关技术&#xff0c;主要可分为卫星定位、惯性导航定位、地图匹配定位以及多传感器融合定位几大类。其中地图匹配定位技术利用道路物理…

CSS绝对定位、相对定位

目录 静态定位 - static 相对定位 - relative 绝对定位 - absolute 固定定位 - fixed z-index属性&#xff1a; 在CSS中定位有以下4种&#xff1a; 静态定位 - static相对定位 - relative绝对定位 - absolute 固定定位 - fixed 静态定位 - static 静态定位是css中的默认定…

网络机顶盒哪个牌子好?资深数码粉分享网络电视机顶盒排名

智能电视配置跟不上经常死机卡顿&#xff0c;但显示正常的情况下不想花钱换电视机怎么办&#xff1f;一台网络机顶盒就可以解决你的烦恼&#xff0c;安装上网络机顶盒以后就可以让旧电视新生&#xff0c;那么你知道网络机顶盒哪个牌子好吗&#xff1f;如果不懂这行&#xff0c;…

【自然语言处理 | Transformer】Transformer:Attention is All You Need论文讲解

Transformer由论文《Attention is All You Need》提出&#xff1a; 论文地址为&#xff1a; https://arxiv.org/pdf/1706.03762.pdf文章目录 一、Transformer 整体结构二、Transformer 的输入2.1 单词 Embedding2.2 位置 Embedding 三、Self-Attention&#xff08;自注意力机制…

.net7 通过 JsonTranscoding 实现 gRPC 与 Web API 一鱼两吃

目标 在一个网站内&#xff0c;用一套proto即提供gPRC 调用&#xff0c;又提供 Web API 调用。 实现方法 根据微软官方James Newton King&#xff08;Newtonsoft.json 作者&#xff09;的文章&#xff0c;.net7 里面提供了 JsonTranscoding 特性&#xff0c;只需要三步&#x…

听我一句劝,别去外包,干了6年,废了....

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了6年的功能测试&…

NANK OE骨传导开放式蓝牙耳机发布,极致体验拉满!

近日&#xff0c;中国专业音频品牌NANK南卡发布了全新一代——骨传导开放式蓝牙耳机NANK OE&#xff0c;耳机采用了传统真无线和骨传导的结合方式&#xff0c;带来更加舒适的佩戴体验和音质升级&#xff0c;同时还支持单双耳自由切换&#xff0c;全新的设计收获了市场的喜爱和认…

SignOff Criteria——POCV(Parametric OCV) introduction

文章目录 1. O v e r v i e w Overview Overview2. P O C V A n a l y s i s POCV\ Analysis POCV Analysis3. P O C V F l o w POCV\ Flow POCV Flow4. P O C V R e p o r t POCV\ Report POCV Report 1. O v e r v i e w Overview Overview P r o c e s s v a r i a t i…

数据发送流程

在发送模式下&#xff0c;UART 的串行数据发送电路主要包括一个发送移位寄存器(TSR)&#xff0c;TSR 功能是将数据 逐个移位送出。待发数据必须先写到发送缓冲区中。 TXIFx 是发送中断标志位&#xff0c;可配置为发送缓冲区空或TSR 空。 数据的发送支持7bit 、8bit 或9bit 数据…

JavaScript原型链污染学习记录

1.JS原型和继承机制 0> 原型及其搜索机制 NodeJS原型机制&#xff0c;比较官方的定义&#xff1a; 我们创建的每个函数都有一个 prototype&#xff08;原型&#xff09;属性&#xff0c;这个属性是一个指针&#xff0c;指向一个对象&#xff0c; 而这个对象的用途是包含可…

为什么用Selenium做自动化测试,你真的知道吗?

目录 手工测试的问题 为什么用自动化 选择合适的测试方式 什么时候引入自动化测试 以Jmeter为代表的测试工具 编程能力既重要又不重要 为什么是Selenium 没有最好的技术&#xff0c;只有合适的技术 web自动化测试效率不高 手工测试的问题 手工操作点点点借助的是人脑的…

知识变现海哥|这3种课程定价最容易爆单

这3种课程定价最容易爆单 一门课怎么才能卖到100万&#xff0c;定价很关键。我卖了160万的课&#xff0c;总结了3种课程定价&#xff0c;组合起来最容易爆单&#xff01;引流课定价0、1、9.9、19.9一般讲3天结束&#xff0c;用低价吸引大量潜在学员 信任课定价99、699、999等…

C++—非递归【循环】遍历二叉树(前序,中序,后序)思路讲解+代码实现

非递归遍历二叉树 前序中序后序 接下来我们在研究如何使用循环实现遍历二叉树时&#xff0c;以下面的二叉树为例&#xff1a; 在下文的讲解中&#xff0c;不对如何构建这颗二叉树做讲解&#xff0c;直接给出代码&#xff0c;如果有不懂的地方欢迎私信我。 文章中的完整源代码链…

一篇文章搞定《Android内存泄漏》

------《Android内存泄漏》 什么是内存泄漏常见的内存泄漏以及规避方式单例模式引用Activity非静态内部类注册的反注册定时器TimerWebView的内存泄漏资源未关闭属性动画 怎么定位内存泄漏LeakCanary接入&#xff1a;使用&#xff1a;检测&#xff1a; Android Proflier开始检测…

Linux驱动编程(分层分离编程思想)

1、面向对象 ⚫ 字符设备驱动程序抽象出一个 file_operations 结构体&#xff1b; ⚫ 我们写的程序针对硬件部分抽象出 led_operations 结构体。 2、分层 上层实现硬件无关的操作&#xff0c;比如注册字符设备驱动&#xff1a;leddrv.c 下层实现硬件相关的操作&#xff0c;比如…

【R语言】鉴于计算10亿以内训练模型记录for循环的加速

文章目录 1 前言2 几个循环2.1 100以内的和2.2 100以内奇数和/偶数和 3 多重循环3.1 向量化3.2 合并循环3.3 apply函数3.4 矩阵运算3.5 foreach分解任务 4 讨论 1 前言 笔者主力机是MBAM1芯片&#xff08;8256&#xff09;&#xff0c;某个下午巩固循环突然思考到个问题&#…