【算法基础】算法的时间复杂度

news/2024/12/28 23:58:07/

一个语句的频度是指该语句在算法中被重复执行的次数
算法中所有语句的频度之和记为T(n),它是该算法问题规模 的函数
时间复杂度主要分析 T(n)的数量级
算法中基本运算 (最深层循环内的语句)的频度与 T(n)同数量级,因此通常采用算法中基本运算的频度f(n)来分析算法的时间复杂度。因此,算法的时间复杂度记为
T(n)= O(f(n)))

算法的时间复杂度不仅依赖于问题的规模 n,也取决于待输入数据的性质(如输入数据元素的初始状态)。

最坏时间复杂度是指在最坏情况下,算法的时间复杂度。
平均时间复杂度是指所有可能输入实例在等概率出现的情况下,算法的期望运行时间。
最好时间复杂度是指在最好情况下,算法的时间复杂度。

一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。

常见的渐近时间复杂度为
O(1)< O(log₂n) < O(n) < O(nlog₂n) < O(n²) < O(n³)< O(2ⁿ) < O(n!) < O(nⁿ)

一些算法的时间复杂度

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

O(log₂n)

x=2;
while(x<n/2)x=2*x;

O(log₂n)

求整数 n(n20)的阶乘的算法如下

int fact(int n){if(n<=l) return 1;return n*fact(n-1);
}

O(n)

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

嵌套循环,内层和外层的循环,如果遍历不同,则各自独立互不相关,得到内外层的时机复杂度后再相乘
O(nlog₂n)

int func(int n){int i=0,sum=0;while(sum<n) sum += ++i;return i;
}

求和算法的时间复杂度 O(n½)

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

O(n开三次方)

归纳总结

此类问题有两种形式:
1.循环主体中的变量参与循环条件的判断
此类题应该找出主体语句中与 T(n)成正比的循环变量,将之代入条件中进行计算。例如:

int i=1;
while(i<=n)i=i*2;

i乘以2的次数正是主体语句的执行次数,因此有 2的t次方 ≦n,取对数后得t ≦ log₂n,则T(n)= 0( log₂n)。

2.循环主体中的变量与循环条件无关此类题
可采用数学归纳法直接累计循环次数。多层循环时从内到外分析,忽略单步语句、条件判断语句,只关注主体语句的执行次数
此类问题又可分为递归程序和非递归程序:
递归程序一般使用公式进行递推。例如习题 5 的时间复杂度分析如下:
T(n)=1+T(n -1)=1+1+ T(n -2)=··=n-1+ T(1)
即 T(n)= O(n)。
非递归程序比较简单,可以直接累计次数


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

相关文章

序列生成策略——束搜索、贪心搜索、穷举搜索

序列搜索策略包括贪心搜索、穷举搜索和束搜索。 贪心搜索所选取序列的计算量最小&#xff0c;但精度相对较低。 穷举搜索所选取序列的精度最高&#xff0c;但计算量最大。 束搜索通过灵活选择束宽&#xff0c;在正确率和计算代价之间进行权衡。 在序列到序列学习&#xff08…

(黑马C++)L06 重载与继承

一、关系运算符重载 以重载等于号运算符为例&#xff1a; #include<string> #include <iostream> using namespace std;class Person { public:Person(string Name, int age) {this->m_Name Name;this->m_Age age;}public:string m_Name;int m_Age; };bo…

云计算运营—04 FusionSphere OpenStack 6.5方案介绍

FusionSphere OpenStack 6.5方案介绍 OpenStack 系统架构 OpenStack是什么 OpenStack是目前最流行的开源云操作系统&#xff1a; 资源抽象 OpenStack将各类硬件资源&#xff0c;通过虚拟化与软件定义的方式&#xff0c;抽象成资源池 资源分配与负载调度 OpenStack根据管理员…

【Linux编辑神器:vim】

目录 1. vim的基本概念 2. vim的基本操作 3. vim正常模式命令集 4. vim底行模式命令集 5. 简单vim配置 6 总结 什么是Vi/Vim? vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0…

2023年,我觉得拼夕夕值得去

这一年下来&#xff0c;多少大厂梦破碎了&#xff0c;多少人选择被离开和被留下&#xff0c;都日子不那么好过&#xff0c;但其实结合2022年一整年下来&#xff0c;结合拼夕夕的股价表现&#xff0c;人家一年到头开支节流&#xff0c;人家还不断开新站点&#xff0c;晚会还赞助…

消息服务 + Serverless 函数计算如何助力企业降本提效?

作者&#xff1a;柳下 背景介绍 消息队列服务&#xff08;下文均以 Message Service 命名&#xff09;作为云计算 PaaS 领域的基础设施之一&#xff0c;其高并发、削峰填谷的特性愈发受到开发者关注。Message Service 对上承接消息生产者服务的请求&#xff0c;对下连接消费者…

Qt6 中如何使用 qsb

【写在前面】 Qt 5 的图形体系结构非常依赖 OpenGL 作为底层 3D 图形 API。但过去 8 年来随着 Metal 和 Vulkan 的推出&#xff0c;市场发生了巨大变化。现在&#xff0c;Qt 6 加入了大量不同平台的图形 API&#xff0c;以确保用户可以在所有平台上以最高性能运行 Qt。 在 Qt Q…

MySQL高级 SQL优化【插入数据主键优化】

目录 1&#xff1a;SQL优化 1.1&#xff1a;插入数据 1.1.1&#xff1a;insert 1). 优化方案一&#xff08;批量插入数据) 2). 优化方案二&#xff08;手动控制事务&#xff09; 3). 优化方案三 &#xff08;主键顺序插入&#xff0c;性能要高于乱序插入。&#xff09; …