算法:渐进记号的含义及时间复杂度计算

渐进记号及时间复杂度计算

渐近符号

渐近记号 Ω \Omega Ω

   f ( n ) = Ω ( g ( n ) ) f(n)=\Omega(g(n)) f(n)=Ω(g(n)) 当且仅当存在正的常数C和 n 0 n_0 n0,使得对于所有的 n ≥ n 0 n≥ n_0 nn0 ,有 f ( n ) ≥ C ( g ( n ) ) f(n)≥C(g(n)) f(n)C(g(n))。此时,称 g ( n ) g(n) g(n) f ( n ) f(n) f(n)的下界。
  根据符号 Ω \Omega Ω的定义,用它评估算法的复杂度得到的是问题规模充分大时的一个下界。这个下界的阶越高,评估越精确,越有价值。

例:设 f ( n ) = n 2 + n f(n)=n^2+n f(n)=n2+n,则
f ( n ) = Ω ( n 2 ) f(n)=\Omega(n^2) f(n)=Ω(n2),取 c = 1 , n 0 = 1 c=1,n_0=1 c=1,n0=1 即可
f ( n ) = Ω ( 100 n ) f(n)=\Omega(100n) f(n)=Ω(100n),取 c = 1 / 100 , n 0 = 1 c=1/100,n_0=1 c=1/100,n0=1 即可
显然, Ω ( n 2 ) \Omega(n^2) Ω(n2)作为下界更为精确。

渐进记号 Θ \Theta Θ

   f ( n ) = Θ ( g ( n ) ) f(n)=\Theta(g(n)) f(n)=Θ(g(n)) 当且仅当存在正常数和 C 1 , C 2 , n 0 C_1,C_2,n_0 C1,C2,n0,使得对于所有的 n ≥ n 0 n≥n_0 nn0, 有 C 1 ( g ( n ) ) ≤ f ( n ) ≤ C 2 ( g ( n ) ) C_1(g(n))≤f(n)≤ C_2(g(n)) C1(g(n))f(n)C2(g(n))。此时,称 f ( n ) f(n) f(n) g ( n ) g(n) g(n)同阶。
  这种渐进符号是指,当问题规模足够大的时候,算法的运行时间将主要取决于时间表达式的第一项,其它项的执行时间可以忽略不计。第一项的常数系数,随着n的增大,对算法的执行时间也变得不重要了。

例: 3 n + 2 = Θ ( n ) 3n+2= Θ(n) 3n+2=Θ(n)
10 n 2 + 4 n + 2 = Θ ( n 2 ) 10n^2+4n+2= Θ(n^2) 10n2+4n+2=Θ(n2)
5 × 2 n + n 2 = Θ ( 2 n ) 5×2^n+n^2= Θ(2^n) 5×2n+n2=Θ(2n)

渐进记号小 ο \omicron ο

   f ( n ) = ο ( g ( n ) ) f(n)=\omicron(g(n)) f(n)=ο(g(n))当且仅当 f ( n ) = ο ( g ( n ) ) f(n)=\omicron(g(n)) f(n)=ο(g(n)) g ( n ) ≠ ο ( f ( n ) ) g(n)\neq \omicron(f(n)) g(n)=ο(f(n)),此时, g ( n ) g(n) g(n) f ( n ) f(n) f(n)的一个绝对上界。
  小 ο \omicron ο提供的上界可能是渐近紧确的,也可能是非紧确的。(如: 2 n 2 = ο ( n 2 ) 2n^2=\omicron(n^2) 2n2=ο(n2)是渐近紧确的,而 2 n = ο ( n 2 ) 2n=\omicron(n^2) 2n=ο(n2)是非紧确上界。

例: 4 n l o g n + 7 = ο ( n 2 ) 4nlogn + 7= \omicron(n^2) 4nlogn+7=ο(n2)

渐进记号小 ω \omega ω

   f ( n ) = ω ( g ( n ) ) f(n)=\omega(g(n)) f(n)=ω(g(n))当且仅当 f ( n ) = ω ( g ( n ) ) f(n)=\omega(g(n)) f(n)=ω(g(n)) g ( n ) ≠ ω ( f ( n ) ) g(n)\neq \omega(f(n)) g(n)=ω(f(n)),此时, g ( n ) g(n) g(n) f ( n ) f(n) f(n)的一个绝对下界。
   ω \omega ω表示一个非渐进紧确的下界。

例: f ( n ) = n 2 + n f(n)=n^2+n f(n)=n2+n,则 f ( n ) = f(n)= f(n)=\omega ( n ) (n) (n)是正确的, f ( n ) = f(n)= f(n)=\omega ( n 2 ) (n^2) (n2)是错误的。

渐进记号大 O \Omicron O

  设 f ( n ) f(n) f(n) g ( n ) g(n) g(n) 是定义域为自然数集上的函数。若存在正数 c c c n 0 n_0 n0c和n_0c,使得对一切 n ≥ n 0 n≥ n_0 nn0 都有 0 ≤ f ( n ) ≤ c g ( n ) 0 ≤ f(n) ≤ cg(n) 0f(n)cg(n)成立,则称 f ( n ) f(n) f(n)的渐进的上界是 g ( n ) g(n) g(n),记作 f ( n ) = O g ( n ) f(n)=\Omicron g(n) f(n)=Og(n)
  根据符号大 O \Omicron O的定义,用它评估算法的复杂度得到的只是问题规模充分大时的一个上界。这个上界的阶越低,评估越精确,越有价值。

例:设 f ( n ) = n 2 + n f(n)=n^2+n f(n)=n2+n,有
f ( n ) = O ( n 2 ) f(n)=\Omicron(n^2) f(n)=O(n2),取 c = 2 , n 0 = 1 c=2,n_0=1 c=2,n0=1即可
f ( n ) = O ( n 3 ) f(n)=\Omicron(n^3) f(n)=O(n3),取 c = 1 , n 0 = 2 c=1,n_0=2 c=1,n0=2即可

常见的时间复杂度关系

O(1)<O(log(n))<O(n)<O(nlogn)<O(n^{2})

   O ( 2 n ) O(2^{n}) O(2n) O ( n ! ) O(n!) O(n!)大于以上的所有时间复杂度,具体原因参考图像。

时间复杂度计算:递归方程

  加、减、乘、除、比较、赋值等操作,一般被看作是基本操作,并约定所用的时间都是一个单位时间;通过计算这些操作分别执行了多少次来确定程序总的执行步数。一般来说,算法中关键操作的执行次数决定了算法的时间复杂度。
  比较简单的算法时间复杂性估计通常需要观察在for、while循环中的关键操作执行次数,在这里我们只讨论一种比较复杂的时间复杂度计算问题:求递归方程解的渐近阶的方法。递归式就是一个等式,代表了递归算法运算时间和n的关系,通过更小输入的函数值来描述一个函数。那么如何求得递归算法的Θ渐进界呢?主要有三种方法。

代入法

  代入法是指自己猜测一个界,然后用数学归纳法进行验证是否正确,这种猜测主要靠经验,不常用。

迭代法

  迭代法是指循环地展开递归方程,然后把递归方程转化为和式,使用求和技术解之。

套用公式法

  这个方法为估计形如: T ( n ) = a T ( n / b ) + f ( n ) T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n) 的递归方程解的渐近阶提供三个可套用的公式。要求其中的a≥1和b>1是常数,f(n)是一个确定的正函数。那么在三种情况下,我们可以得到T(n)的渐进估计式,懒得打公式,所以截图。
在这里插入图片描述

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

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

相关文章

每天写java到期末考试--接口1--基础--6.22

规则&#xff1a; 练习&#xff1a; 抽象类的抽象方法 动物类Animal package 期末复习;public abstract class Animal {private String name;private int age;//1.空构造public Animal(){}public Animal(String name,int age){this.ageage;this.namename;}public String getNa…

【C++提高编程-11】----C++ STL常用集合算法

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

Nginx 负载均衡实现上游服务健康检查

Nginx 负载均衡实现上游服务健康检查 Author&#xff1a;Arsen Date&#xff1a;2024/06/20 目录 Nginx 负载均衡实现上游服务健康检查 前言一、Nginx 部署并新增模块二、健康检查配置2.1 准备 nodeJS 应用程序2.2 Nginx 配置负载均衡健康检查 小结 前言 如果你使用云负载均衡…

深入理解适配器模式:Java实现与框架应用

适配器模式是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以协同工作。在本篇博客中&#xff0c;我们将详细介绍适配器模式&#xff0c;并演示如何在Java中实现它。最后&#xff0…

python从入门到精通9:字符串简介

Python中的字符串是一种非常常见且重要的数据类型&#xff0c;用于存储一系列字符&#xff08;如文本、数字、标点符号等&#xff09;。Python的字符串处理功能强大且灵活&#xff0c;为开发者提供了丰富的操作方法和工具。下面我们将对Python字符串进行深入的解析。 1. 字符串…

对于大型 Clojure 项目,如何进行有效的代码组织和模块划分以提高可维护性?

在大型 Clojure 项目中&#xff0c;以下是一些有效的代码组织和模块划分的方法&#xff0c;可提高可维护性&#xff1a; 使用命名空间&#xff08;namespace&#xff09;&#xff1a;将相关函数和数据结构组织到逻辑上相关的命名空间中&#xff0c;以便更好地理解和管理代码。按…

【Linux】 yum学习

yum介绍 在Linux系统中&#xff0c;yum&#xff08;Yellowdog Updater, Modified&#xff09;是一个用于管理软件包的命令行工具&#xff0c;特别适用于基于RPM&#xff08;Red Hat Package Manager&#xff09;的系统&#xff0c;如CentOS、Fedora和Red Hat Enterprise Linux…

【Arduino】实验使用ESP32单片机根据光线变化控制LED小灯开关(图文)

今天小飞鱼继续来实验ESP32的开发&#xff0c;这里使用关敏电阻来配合ESP32做一个我们平常接触比较多的根据光线变化开关灯的实验。当白天时有太阳光&#xff0c;则把小灯关闭&#xff1b;当光线不好或者黑天时&#xff0c;自动打开小灯。 int value;void setup() {pinMode(34…

数据分析面试八股文--技能软件类

Excel 数据透视表 数据透视表(Pivot Table)是 Excel 中一个强大的功能&#xff0c;用于快速汇总、排序、重新组织和分析数据集&#xff0c;可以在面试中被要求展示如何创建和使用数据透视表来进行数据分析。 考察点可能包括: 创建数据透视表分类、汇总数据使用数据透视表进…

音视频开发29 FFmpeg 音频编码- 流程以及重要API,该章节使用AAC编码说明

此章节的一些参数&#xff0c;需要先掌握aac的一些基本知识&#xff1a;​​​​​​aac音视频开发13 FFmpeg 音频 --- 常用音频格式AAC&#xff0c;AAC编码器&#xff0c; AAC ADTS格式 。_ffmpeg aac data数据格式-CSDN博客 目的&#xff1a; 从本地⽂件读取PCM数据进⾏AAC格…

cgroups v1简介

cgroup 概念 Cgroup&#xff0c;全称Control Group&#xff08;控制组&#xff09;&#xff0c;是Linux系统内核提供的一个特性&#xff08;Linux 2.6.24内核开始将Cgroup加入主线&#xff09;。 主要作用&#xff1a; 限制和隔离一组进程对系统资源的使用&#xff0c;也就是…

【CARD】多变化字幕的上下文感知差异提炼(ACL 2024)

摘要 Multi-change captioning旨在用自然语言描述图像对中的复杂变化。和图像字幕相比&#xff0c;这个任务要求模型具有更高层次的认知能力来推理任意数量的变化。本文提出一种新的上下文感知差异提取网络&#xff08;CARD&#xff09;。给定一个图像对&#xff0c;CARD首先解…

vm.max_map_count是什么?起到什么作用

vm.max_map_count 是 Linux 内核中的一个参数&#xff0c;它决定了一个进程可以拥有的最大内存映射区域数。内存映射区域是指内存映射文件、匿名内存映射等。这个参数对于一些应用程序&#xff08;如 Elasticsearch&#xff09;特别重要&#xff0c;因为它们在运行时会创建大量…

socket通讯可以直接传地址吗?【面试】

在网络编程中&#xff0c;socket 通信不直接传输内存地址。这是因为网络通信是在不同的内存空间和可能不同的计算机之间进行的&#xff0c;内存地址在不同的进程和机器上没有意义。相反&#xff0c;socket 通信使用套接字&#xff08;socket&#xff09;&#xff1a; IP地址&a…

深入浅出Java的函数式编程

深入浅出Java的函数式编程 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨Java中的函数式编程&#xff0c;这是一种强大的编程范式&#xff0c;它…

用 Terraform 初始化 GCP环境

前置准备 安装 Terraform 请参考 Terraform 官方文件 安装 Terraform。MacOS 可以使用 Homebrew 安装&#xff1a; brew install terraform 安装 Google Cloud SDK 请参考 Google Cloud SDK 官方文件 安装 Google Cloud SDK。MacOS 可以使用 Homebrew 安装&#xff1a; b…

Multigranularity and MultiscaleProgressive Contrastive Learning

这篇文章将一张图片划分为四个不同细粒度大小的图片&#xff0c;然后输出四个神经网络&#xff0c;这四个神经网络共享权重&#xff0c;得到四个输出&#xff0c;将这四个输出求交叉熵损失和对比学习损失&#xff0c;共同监督模型学习。 通过对比学习&#xff0c;最大化一个Bat…

Microsoft Edge无法启动搜索问题的解决

今天本来想清一下电脑&#xff0c;看到visual studio2022没怎么用了就打算卸载掉。然后看到网上有篇文章说进入C盘的ProgramFiles&#xff08;x86&#xff09;目录下的microsoft目录下的microsoft visual studio目录下的install目录中&#xff0c;双击InstallCleanup.exe&#…

谷歌浏览器与谷歌驱动匹配

网址&#xff1a;Chrome for Testing availability (googlechromelabs.github.io)

中医诊所处方药材管理系统有哪些必备功能?

随着信息技术的飞速发展&#xff0c;传统中医行业也迎来了数字化转型的浪潮。欣九康诊疗系统&#xff0c;具有全面的功能&#xff0c;可以作为一款合适中医诊所处方药材管理系统来使用。那么&#xff0c;中医诊所使用欣九康&#xff0c;有哪些独特的功能和优势呢?能否为中医诊…