算法的复杂性分析以及时间复杂度的表示方法

ops/2025/2/24 11:12:58/

算法复杂性算法运行所需的计算机资源量。

需要的时间资源的量称为时间复杂度,T=T(N,I)

需要的空间资源的量称为空间复杂度,T=T(N,I)

N代表问题的规模I代表输入(实例)

空间复杂度与时间复杂度的分析方法类同,主要讨论时间复杂度。

例如:

void insertion_sort(Type *a,int n)
{Type key;                     // cost    timesfor(int i=1;i<n;i++)          // c1      n{                             key=a[i];                 // c2      n-1int j=i-1;                // c3      n-1while(j>=0&&a[j]>key)	  // c4  	 sum of ti{a[j+1]=a[j];		  // c5      sum of (ti-1)j--;				  // c6	     sum of (ti-1)}a[j+1]=key;				  // c7      n-1}
}

以上的代码在最好情况下,ti=1,for 1<=i<n;

T(n)=c1*n+c2*(n-1)+c3*(n-1)+c4*(n-1)+c7*(n-1)

        =(c1+c2+c3+c4+c7)*n-(c2+c3+c4+c7)

以上的代码在最坏的情况下 ti = i+1,for 1<=i<n;

T(n)=c1*n+c2*(n-1)+c3*(n-1)+c4(n(n+1)/2-1)+c5(n(n-1)/2+c6(n(n-1)/2)+c7(n-1)

        =(c4+c5+c6)/2*n*n+(c1+c2+c3+(c4-c5-c6)/2+c7)*n-(c2+c3+c4+c7)

算法复杂性在渐进意义下的阶:

渐进意义下的记号:O,Ω,θ,o , ω

g(n)是定义在正数集上的正函数,T(n)算法的时间复杂性,n是数据规模

(1)渐进上届记号O:

若是T(n) = O(g(n))

含义:算法在任何实例情况下,其时间复杂性的阶不超过g(n)的阶

即: lim(T(n)/g(n) = c != 0 , c为常数

如插入排序:lim(T(n)/(n*n)=(c4+c5+c6)/2为常数,故T(n)=O(n*n)

(2)渐进下届记号Ω

T(n)=Ω(g(n))

含义:算法在任何实例情况下,其时间复杂性的解不低于g(n)的阶

即:lim(T(n)/g(n)) = c = 0,c为常数。

如插入排序:lim(T(n)/n)=c1+c2+c3+c4+c7为常数,故T(n)=Ω(n)

(3)记号θ

举例有一个算法A:最坏情况:T=c1*n*n + n + 4

                               最好情况:T=c2*n*n

存在g(n)=n*n,有T(n)=Ω(g(n))和T(n)=O(g(n))

因此 T(n) = θ(g(n)) = θ(n*n)

(4)非紧渐上界记号o

T(n)=o(g(n))

含义:算法在任何实例情况下,其算法时间复杂性的阶小于g(n)的阶

即lim(T(n)/g(n)) = 0

举例:g(n)=n*n , T(n) = c2*n*logn  -->T(n) = o(n*n)

(5)非紧渐进下届记号 ω

若 T(n)= ω(g(n))

含义:算法在任何实例情况下,其时间复杂性的阶大于g(n)的阶

即:lim(T(n)/g(n) =

举例:g(n) = n,T(n)=c1*n*logn --> T(n) =  ω(n)

void insertion_sort(Type *a,int n)
{Type key;                     for(int i=1;i<n;i++)         {                             key=a[i];                int j=i-1;                while(j>=0&&a[j]>key)	 {a[j+1]=a[j];		 j--;				 }a[j+1]=key;			}
}

以上意义下的阶层,其中O,Ω有等于关系,而o , ω没有等于关系。

算法的O记号的快速分析步骤:

(1)找出算法最坏情况下被执行次数最多的代码段,一般是循环嵌套次数最多的循环体

(2)计算这部分指令被执行的次数

T(n)=1+2+......+n-1 = n(n-1)/2 = n*n/2-n/2 -->n*n  (去低阶层,高阶层系数变1)

因此该算法的时间复杂性 T(n) = O(n*n)

例如:顺序搜索算法

temalate<calss Tyape>
int serSearch(Tyae *a,int n,Tyae k)
{for (int i=0;i<n;i++){if(a[i]==k)return i;}return -1;
}

以上的代码:

T(n) = max { T(I) | size(I)=n }=n  -->T(n)=O(n)

T(n) = min { T(I) | size(I)=n }=1  -->T(n) =Ω(n)

常见的复杂性函数 C , logn , n , n*n , n*n*n , 2^n , n!

问题的计算时间下界为Ω(f(n)),则计算时间复杂性为O(f(n))的算法是最优的。

        例如,基于比较的排序算法的计算时间下界为Ω(nlogn)

        因此计算时间复杂性为O(nlogn)的排序算法是最优算法

        故堆排序算法,合并排序是基于比较的最优排序算法


http://www.ppmy.cn/ops/160957.html

相关文章

TCP初始化序列号为什么要不一样

区分不同的连接(包括一些历史连接)、确保数据的顺序性、防止重放攻击&#xff08;时间戳&#xff09; 初始化序列号 ISN M F(localhost, localport, remotehost, remoteport)。 M是一个32位的计时器&#xff0c;这个计时器每隔 4 微秒加1&#xff0c;循环一次4.55小时F 是一…

Linux 内核中关于 CPU 编号和拓扑管理

CPU 拓扑结构定义 // topology.h struct cpu_topology {int thread_id; // SMT IDint core_id; // 核心 IDint package_id; // 物理 CPU IDint die_id; // Die IDcpumask_t thread_sibling; // SMT 线程掩码cpumask_t core_sibling; // 核心掩码 };CPU 在线…

ArcGIS Pro中等高线的生成与应用详解

在地理信息科学与空间数据分析领域&#xff0c;等高线作为一种重要的地形表达方式&#xff0c;扮演着至关重要的角色。 无论是在地图制图、城市规划&#xff0c;还是在自然资源管理等诸多方面&#xff0c;等高线都为我们提供了丰富的地形信息。 而ArcGIS Pro作为一款功能强大…

【Java项目】基于SpringBoot的【高校校园点餐系统】

【Java项目】基于SpringBoot的【高校校园点餐系统】 技术简介&#xff1a;采用Java技术、MySQL数据库、B/S结构实现。 系统简介&#xff1a;高校校园点餐系统是一个面向高校师生的在线点餐平台&#xff0c;主要分为前台和后台两大模块。前台功能模块包括&#xff08;1&#xff…

MySQL日志undo log、redo log和binlog详解

MySQL 日志&#xff1a;undo log、redo log、binlog 有什么用&#xff1f; 一、前言 在MySQL数据库中&#xff0c;undo log、redo log和binlog这三种日志扮演着至关重要的角色&#xff0c;它们各自承担着不同的功能&#xff0c;共同保障了数据库的正常运行和数据的完整性。了解…

使用Socket编写超牛的http服务器和客户端(二)

客户端 动态扩展连接池、线程池优雅关闭、超时机制、健康检查等功能,并将代码模块化: 文件结构 HTTPClientProject/ ├── ConnectionPool.h ├── ConnectionPool.cpp ├── TaskQueue.h ├── ThreadPool.h ├── main.cpp 工程代码主要分为以下几个模块: Connectio…

vector结构刨析与模拟实现

目录 1.引言 2.C模拟实现 2.1模拟实现构造函数 1&#xff09;直接构造 2&#xff09;拷贝构造 3&#xff09;单一赋值构造 4&#xff09;迭代器构造 2.2模拟实现析构函数 2.3模拟实现其他常规函数 1&#xff09;capacity函数 2&#xff09;size函数 3&#xff09;b…

10.Docker 仓库管理

Docker 仓库管理 Docker 仓库管理 Docker 仓库管理 Docker 仓库&#xff0c;类似于 yum 仓库&#xff0c;是用来保存镜像的仓库。为了方便的管理和使用 docker 镜像,可以将镜像集中保存至 Docker 仓库中&#xff0c;将制作好的镜像 push 到仓库集中保存&#xff0c;在需要镜像…