Day25-【13003】短文,什么是算法?如何衡量时间复杂度?什么是最优,平均时间复杂度?

文章目录

    • 第二节概览
      • 什么是算法?
        • 算法的5个特性?
      • 算法如何评估?
        • 时间指标如何衡量?
          • 算法的复杂度如何度量?算法开销上限和下限如何表示?
          • 什么是常数复杂度?线性操作?对数复杂度-线性对数?多项式复杂度?指数复杂度?
          • 渐进时间复杂度的作用是什么?
          • 光知道数据规模还不够,数据排列的混乱程度也会增加时间复杂度?最优,最差,平均时间复杂度?
        • 空间复杂度如何衡量?什么时候需要衡量?

第二节概览

在这里插入图片描述

什么是算法?

算法的思想是计算机程序的灵魂,

算法规定的流程决定着程序的执行步骤。

使用辗转相除法求两个正整数最大公因子的欧几里得算法,出现在2300多年前,这是目前已知的最古老的算法。

定义1-1 算法是一个由若干确定的(无二义性的)、可执行的步骤组成的肯定能够终止的有序步骤集合。

算法描述一个问题的求解过程,由一系列解决问题的清晰指令构成。

这些指令可以使用自然语言表示也可以使用计算机程序设计语言表示,甚至可以混合使用自然语言与计算机程序设计语言来描述。

C语言与自然语言的混合有时称为类C语言,这样描述的算法称为伪代码

在计算机问世之后,人们将一些问题交给计算机来求解,但计算机不能识别上述那样描述的算法,所以很多算法要具体化为一个计算机程序,

程序算法的另一种表现形式

(本书采用C语言实现相关的算法)

  • 看来得先学学C语言
算法的5个特性?

算法是一系列指令的描述,但并不是任意的描述都可以构成算法。算法必须满足如下5个重要特性。
1、输入:有0或多个输入值。

​ 也就是说算法可以没有输入

2、输出:有1或多个输出值。

​ 也就是说算法必须有输出,没有输出,不叫算法

​ 通常输出的是算法的执行结果

3、有穷性:一个算法必须在执行有穷步骤之后结束。

​ 实现算法的程序的运行时间是有限的

4、确定性:算法的每一个步骤都必须有确切的含义。

​ 算法的每个执行步骤不能有歧义

5、可行性:算法中要做的运算都是相当基本的、能够精确进行的。

​ 算法的每个执行步骤必须是能够执行的

算法如何评估?

算法必须正确,错误的算法不可能得到正确的求解结果。

  • 所以,算法的正确性成为评判算法的首要指标

(为简单起见,本书中只对正确的算法进行评判)

除此之外,还要评判算法的其他方面,包括它的执行效率。

在使用计算机解决问题时,总会要求所花的时间越短越好,占用的计算机资源越少越好。

除了正确性以外,多、快、好、省也都是一直追求的目标。

那么,计算机内部的资源有哪些呢?CPU时间内存空间肯定是紧俏的两种资源。

  • 一般地,分别使用时间复杂度空间复杂度来评估这两种资源的使用效率。
时间指标如何衡量?

1、屏蔽计算机硬件的差异性,也就是指令集的差异性,简化问题,才能加以衡量

为了突出算法自身的特点,故在衡量算法效率时应该屏蔽计算机的差异性,不能使用程序运行的绝对时间作为衡量指标。

一般地,选择算法执行的机器指令个数作为衡量指标相对合理一些。

计算机的CPU芯片不同,运行的系统不同,导致指令集也可能不同。

  • 机器指令再进一步对应为程序中的语句,统计一个程序在执行期间需要执行的语句总数,将这个数值作为衡量算法的时间指标

2、屏蔽程序中不同语句的差异性,约定以基本语句为准,简化问题,才能加以衡量

并且约定,程序设计语言中一条基本语句的执行时间为1个单位时长

这样处理后将不同语句之间的差异也屏蔽掉了。

一个算法的时间效率可以用问题规模关键的处理步骤的多少来定义。

  • 具体来说,将算法的时间效率表示为问题规模n的一个解析式,对于规模为n的问题,解析式计算的值就是算法处理的步骤数

将关于n的这个解析式称为增长函数,表示为T(n)。

对于一个具体的算法,其增长函数是一个近似的表达式。

一个算法处理10个数据时,是执行了100条语句还是102条语句,差别并不大。

需要关心的是,当数据量增大若干倍时,算法所花费的时间需要增加多少倍,即需要知道其中的比例关系

这是函数的渐近性,即增长函数与问题规模的变化关系,也就是想知道n增大时函数的一般特性。

算法的复杂度如何度量?算法开销上限和下限如何表示?

1、

定义 1 − 2 : 称 ( 复杂度 ) 函数 T ( n ) ,也就是增长函数 T ( n ) 是 O ( f ( n ) ) 的,即 T ( n ) = O ( f ( n ) ) ,这里的关键是 f ( n ) ;为什么用 f ( n )来表示,因为 T ( n ) 表示的函数,可能本身有简单函数,也有复杂函数 如果存在常数 c > 0 与 n 0 ,就是有个常数 c ,还有 n 0 , n 0 不就是问题规模 当 n > n 0 时,也就是问题规模,比 n 0 大 有 T ( n ) ≤ c f ( n ) ; T ( n ) 就是增长函数,要比首先是 f ( n ) ,再是 c ,这两者的乘积,增长函数比这个小 例如, T 1 ( n ) = n + 1 2 = O ( n ) , T 2 ( n ) = 3 n 2 + 4 n + 5 = O ( n 2 ) 。 当然, T 1 ( n ) = O ( n 2 ) , T 2 ( n ) = O ( n 3 ) 也都是对的,但一般取最低阶表示。 由此可以看出, T ( n ) = O ( f ( n ) ) 说明 T ( n ) 的阶不大于 f ( n ) 的阶。 定义1-2:\\ 称(复杂度)函数T(n),也就是增长函数T(n)\\ 是O(f(n))的,即T(n)=O(f(n)),这里的关键是f(n);为什么用f(n)来表示,因为T(n)表示的函数,可能本身有简单函数,也有复杂函数\\ 如果存在常数c>0与n_0,就是有个常数c,还有n_0,n_0不就是问题规模\\ 当n>n_0时,也就是问题规模,比n_0大\\ 有T(n)≤cf(n);T(n)就是增长函数,要比首先是f(n),再是c,这两者的乘积,增长函数比这个小\\ 例如,T_1(n)=\frac{n+1}{2}=O(n),\\ T_2(n)=3n^2+4n+5=O(n^2)。\\ 当然,T_1(n)=O(n^2),T_2(n)=O(n^3)也都是对的,但一般取最低阶表示。\\ 由此可以看出,T(n)=O(f(n))说明T(n)的阶不大于f(n)的阶。 定义12(复杂度)函数T(n),也就是增长函数T(n)O(f(n))的,即T(n)=O(f(n)),这里的关键是f(n);为什么用fn)来表示,因为T(n)表示的函数,可能本身有简单函数,也有复杂函数如果存在常数c>0n0,就是有个常数c,还有n0n0不就是问题规模n>n0时,也就是问题规模,比n0T(n)cf(n)T(n)就是增长函数,要比首先是f(n),再是c,这两者的乘积,增长函数比这个小例如,T1(n)=2n+1=O(n)T2(n)=3n2+4n+5=O(n2)当然,T1(n)=O(n2)T2(n)=O(n3)也都是对的,但一般取最低阶表示。由此可以看出,T(n)=O(f(n))说明T(n)的阶不大于f(n)的阶。

  • 这个例子不太明白

意思可能是,T(n)的阶不可能超过f(n)的阶数

2、

定义 1 − 3 : 称 ( 复杂度 ) 函数 T ( n ) ,也就是增长函数 T ( n ) 是 Ω ( f ( n ) ) 的,即 T ( n ) = Ω ( f ( n ) ) ,这里的关键是 f ( n ) 如果存在常数 c > 0 与 n 0 ,就是有个常数 c ,还有 n 0 , n 0 不就是问题规模 当 n > n 0 时,也就是问题规模,比 n 0 大 有 T ( n ) ≥ c f ( n ) ; T ( n ) 就是增长函数,要比首先是 f ( n ) ,再是 c ,这两者的乘积,增长函数比这个大 例如, T 1 ( n ) = n + 1 2 = Ω ( n ) , T 2 ( n ) = 3 n 2 + 4 n + 5 = Ω ( n 2 ) 。 当然, T 1 ( n ) = Ω ( 1 ) , T 2 ( n ) = Ω ( n ) , T 2 ( n ) = Ω ( n l o g n ) 也都是对的,但一般取最高阶表示。 由此可以看出, T ( n ) = Ω ( f ( n ) ) 说明 T ( n ) 的阶不小于 f ( n ) 的阶。 定义1-3:\\ 称(复杂度)函数T(n),也就是增长函数T(n)\\ 是Ω(f(n))的,即T(n)=Ω(f(n)),这里的关键是f(n)\\ 如果存在常数c>0与n_0,就是有个常数c,还有n_0,n_0不就是问题规模\\ 当n>n_0时,也就是问题规模,比n_0大\\ 有T(n)≥cf(n);T(n)就是增长函数,要比首先是f(n),再是c,这两者的乘积,增长函数比这个大\\ 例如,T_1(n)=\frac{n+1}{2}=Ω(n),\\ T_2(n)=3n^2+4n+5=Ω(n^2)。\\ 当然,T_1(n)=Ω(1),T_2(n)=Ω(n),T_2(n)=Ω(nlogn)也都是对的,但一般取最高阶表示。\\ 由此可以看出,T(n)=Ω(f(n))说明T(n)的阶不小于f(n)的阶。 定义13(复杂度)函数T(n),也就是增长函数T(n)Ω(f(n))的,即T(n)=Ω(f(n)),这里的关键是f(n)如果存在常数c>0n0,就是有个常数c,还有n0n0不就是问题规模n>n0时,也就是问题规模,比n0T(n)cf(n)T(n)就是增长函数,要比首先是f(n),再是c,这两者的乘积,增长函数比这个大例如,T1(n)=2n+1=Ω(n)T2(n)=3n2+4n+5=Ω(n2)当然,T1(n)=Ω(1)T2(n)=Ω(n)T2(n)=Ω(nlogn)也都是对的,但一般取最高阶表示。由此可以看出,T(n)=Ω(f(n))说明T(n)的阶不小于f(n)的阶。

大O表示法和大Ω表示法分别描述某一算法的上限(如果能找到某一类输入下开销最大的函数)

和下限(如果能找到某一类输入下开销最小的函数)。

当上、下限相等时,可用表示法。

如果一种算法既是O(f(n))的又是Ω(f(n))的,则称其是**(f(n))**的。

什么是常数复杂度?线性操作?对数复杂度-线性对数?多项式复杂度?指数复杂度?

1、

若增长函数不随算法问题规模变化,即不管问题规模有多大,花费的时间都是固定的,

则增长函数称为O(1)阶,或称常数复杂度

2、

与问题规模成正比的问题求解算法称为线性操作

3、
许多算法具有 l o g 2 n 的对数复杂度。 许多算法具有log_2n的对数复杂度。\\ 许多算法具有log2n的对数复杂度。
4、
其他算法有 n 的某次幂的多项式复杂度,如 O ( n 2 ) 或 O ( n 3 ) 。 其他算法有n的某次幂的多项式复杂度,如O(n^2)或O(n^3)。\\ 其他算法有n的某次幂的多项式复杂度,如O(n2)O(n3)
5、
更坏的算法是指数复杂度, n 是指数,如 0 ( 2 n ) 。 更坏的算法是指数复杂度,n是指数,如0(2^n)。 更坏的算法是指数复杂度,n是指数,如0(2n)

表1-2中列出了几种增长函数及它们的渐近时间复杂度(即时间复杂度)。

在这里插入图片描述

1、常数,就是一条横线,不会上升

2、线性,其实这个线性已经上升得很快了

3、到了线性对数,这对数,在值很大的时候,确实会比线性的,陡峭一些

在这里插入图片描述

4、再到多项式,就更加陡了

在这里插入图片描述

5、到了指数,基本上贴近于坐标轴了

在这里插入图片描述

一些增长函数和它们的时间复杂度

渐进时间复杂度的作用是什么?

渐近时间复杂度对算法的意义是什么呢?

它直接影响计算机能力提升后能够处理的数据量增长的大小。

假定有不同时间复杂度的4个算法:A、A2、A,和A

当计算机的处理能力提升至原来的10倍时,

2、线性复杂度算法

具有0(n)时间复杂度的算法A,处理的数据量确实增长至原来的10倍,也就是问题规模扩大至原来的10倍。

4、多项式复杂度算法
但具有 O ( n 2 ) 时间复杂度的算法 A 2 ,问题规模只扩大至原来的 3.16 倍。 但具有O(n^2)时间复杂度的算法A2,问题规模只扩大至原来的3.16倍。 但具有O(n2)时间复杂度的算法A2,问题规模只扩大至原来的3.16倍。
5、指数复杂度算法

对于具有指数阶的算法A4,其问题规模几乎没有什么改变。

因处理器的处理速度提升而带来的改善比例,敌不过低效率算法导致的速度减弱。

;意思也就是,复杂度越高的算法,会让升级硬件花的钱浪费掉,钱花了实际效率并不会提升多少

光知道数据规模还不够,数据排列的混乱程度也会增加时间复杂度?最优,最差,平均时间复杂度?

在具体到一个问题时,即使知道了初始数据的个数,所花费的时间也可能是不一样的。

例如,在对10000个整数进行排序时,如果这10000个整数已经按大小排列好了,那么排序过程将非常简单,所花费的时间也最少。

  • 同样地,可能会有某一种排列情况,使得排序时所花费的时间最多。

如果考虑每种排列情况,则可以综合评判它们的平均情况。

由此得到时间复杂度的细化指标。

当问题规模确定后,时间花费最少的称为最优时间复杂度或最好时间复杂度

时间花费最多的称为最坏时间复杂度或最差时间复杂度

所有情况下的平时花费时间称为平均时间复杂度

空间复杂度如何衡量?什么时候需要衡量?

除了要评判算法的时间复杂度以外,算法在运行过程中临时占用的空间大小也要考虑,这称为空间复杂度

一般地,空间复杂度也表示为问题规模的一个函数。

1、注意,是不包含,也就是屏蔽算法代码占用的空间,屏蔽算法中初始数据占用的存储空间

在考虑空间存储量时,算法代码占用的空间、算法中初始数据占用的存储空间,都不包含在内。

有些算法,除数据本身占据的空间以外,需要额外分配的空间并不多,可能只是一个定数,并不依问题规模而改变

此时,关注的重点只在算法的时间复杂度上。

  • 只有当一个算法需要的额外空间数量依赖于问题规模时,才考虑它的空间复杂度。

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

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

相关文章

python基础语法(3) -------- 学习笔记分享

目录: 1. 函数 1.1 语法格式 1.2 函数参数 1.3 函数返回值 1.4 变量的作用域 1.5 函数的执行过程 1.6 函数的链式调用 1.7 函数的嵌套调用 1.8 函数递归 1.9 参数默认值 1.10 函数的关键字传参 2. 列表和元组 2.1 列表和元组是啥 2.2 创建列表 2.3 访问下标 2.…

磐维数据库PanWeiDB2.0日常维护

磐维数据库简介 “中国移动磐维数据库”(ChinaMobileDB),简称“磐维数据库”(PanWeiDB)。是中国移动信息技术中心首个基于中国本土开源数据库打造的面向ICT基础设施的自研数据库产品。 其产品内核能力基于华为 OpenG…

Linux:文件与fd(未被打开的文件)

hello,各位小伙伴,本篇文章跟大家一起学习《Linux:文件与fd(未被打开的文件)》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助&#xf…

自动驾驶中的多传感器时间同步

目录 前言 1.多传感器时间特点 2.统一时钟源 2.1 时钟源 2.2 PPSGPRMC 2.3 PTP 2.4 全域架构时间同步方案 3.时间戳误差 3.1 硬件同步 3.2 软件同步 3.2.3 其他方式 ① ROS 中的 message_filters 包 ② 双端队列 std::deque 参考: 前言 对多传感器数据…

U-Net - U型网络:用于图像分割的卷积神经网络

U-Net是一种专为图像分割任务设计的卷积神经网络(CNN),最初由Olaf Ronneberger等人于2015年提出。它被广泛应用于医学影像分析、遥感图像分割、自动驾驶和其他许多需要对图像进行像素级分类的任务中。U-Net具有强大的特征提取和恢复能力&…

关于使用PHP时WordPress排错——“这意味着您在wp-config.php文件中指定的用户名和密码信息不正确”的解决办法

本来是看到一位好友的自己建站,所以突发奇想,在本地装个WordPress玩玩吧,就尝试着装了一下,因为之前电脑上就有MySQL,所以在自己使用PHP建立MySQL时报错了。 最开始是我的php启动mysql时有问题,也就是启动过…

写一个存储“网站”的网站前的分析

要创建一个能够存储自己网站内容的“网站”,通常意味着你希望有一个可以存储网站数据、文件、内容等信息的系统。为了实现这一目标,可以考虑构建一个内容管理系统(CMS),这个系统能够帮助你存储和管理网站上的内容。 图片仅供参考 以下是如何实现一个可以存储自己网站内容…

[STM32 标准库]定时器输出PWM配置流程 PWM模式解析

前言: 本文内容基本来自江协,整理起来方便日后开发使用。MCU:STM32F103C8T6。 一、配置流程 1、开启GPIO,TIM的时钟 /*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟RCC_APB2PeriphClockC…

KIMI K1.5:用大语言模型扩展强化学习(论文翻译)

文章目录 KIMI K1.5技术报告摘要 1. 引言2. 方法:基于大语言模型的强化学习2.1 强化学习提示集整理2.2 长思维链监督微调2.3 强化学习2.3.1 问题设定2.3.2 策略优化2.3.3 长度惩罚2.3.4 采样策略2.3.5 训练方法的更多细节 2.4 长到短:短思维链模型的上下…

python:taichi 高性能可视化 Demo 展览

安装 pip install taichi taichi-1.7.3-cp39-cp39-win_amd64.whl (83.1 MB) 运行 cmd where ti D:\Python39\Scripts\ti.exe #-- taichi 高性能可视化 Demo 展览 ti gallery [Taichi] version 1.7.3, llvm 15.0.1, commit 5ec301be, win, python 3.9.13********************…

电脑无法开机,重装系统后没有驱动且驱动安装失败

电脑无法开机,重装系统后没有驱动且驱动安装失败 前几天电脑突然坏了,电脑卡住后,强制关机,再开机后开机马上就关机。尝试无数次开机后失败,进入BIOS界面,发现已经没有Windows系统了。重新安装系统后&…

2024年度总结——理想的风,吹进现实

2024年悄然过去,留下了太多美好的回忆,不得不感慨一声时间过得真快啊!旧年风雪尽,新岁星河明。写下这篇博客,记录我独一无二的2024年。这一年,理想的风终于吹进现实! 如果用一句话总结这一年&am…

Juc22_什么是中断、interrupt、isInterrupted、interrupted方法源码解析、如何使用中断标识停止线程

目录 ①. 什么是中断 ②. 源码解读(中断的相关API) ③. 如何使用中断标识停止线程 ①. 什么是中断 ①. 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,所以,Thread.stop、Thread.suspend、Thread. resume都已经被废弃了 ②. 在Java中没有办法立即停止…

《用DOTS解决实际需求》集锦

去年作者发布了一篇《DOTS-ECS系列课程》,深受同学们的好评!前期课程是基于0.51版本录制的,DOTS升级至1.0版本后,同学们纷纷希望能使用DOTS 1.0版本录制实战课程。 今年作者带着DOTS 1.0版本的实战课程回来啦!&#x…

HTTP 配置与应用(不同网段)

想做一个自己学习的有关的csdn账号,努力奋斗......会更新我计算机网络实验课程的所有内容,还有其他的学习知识^_^,为自己巩固一下所学知识,下次更新校园网设计。 我是一个萌新小白,有误地方请大家指正,谢谢…

Crawl4AI 人工智能自动采集数据

文章目录 1 使用 Crawl 的步骤2 AI 智能体应用实例3 结语 Crawl是一款免费的开源工具,利用AI技术简化网络爬取和数据提取,提高信息收集与分析的效率。它智能识别网页内容,并将数据转换为易于处理的格式,功能全面且操作简便。 定位…

KVM/ARM——基于ARM虚拟化扩展的VMM

1. 前言 ARM架构为了支持虚拟化做了些扩展,称为虚拟化扩展(Virtualization Extensions)。原先为VT-x创建的KVM(Linux-based Kernel Virtual Machine)适配了ARM体系结构,引入了KVM/ARM (the Linux ARM hypervisor)。KVM/ARM没有在hypervisor中引入复杂的…

【go语言】数组和切片

一、数组 1.1 什么是数组 数组是一组数:数组需要是相同类型的数据的集合;数组是需要定义大小的;数组一旦定义了大小是不可以改变的。 1.2 数组的声明 数组和其他变量定义没有什么区别,唯一的就是这个是一组数,需要给…

node.js 07.npm下包慢的问题与nrm的使用

一.npm下包慢 因为npm i 默认从npm官网服务器进行下包,但是npm官网服务器是海外服务器所以响应很慢. 于是我们通过npm下包的时候通常用淘宝镜像进行下包,下面是切换到淘宝镜像地址下包的操作. 二.nrm的使用 nrm是一个管理切换npm下包地址的工具,可以快速切换下包的地址. 安…

Windows10官方系统下载与安装保姆级教程【U盘-官方ISO直装】

Windows 10 官方系统安装/重装 制作启动盘的U盘微软官网下载Win10安装包创建启动盘U盘 安装Win10 本文采用U盘安装Windows10官方系统。 制作启动盘的U盘 微软官网下载Win10安装包 微软官网下载Win10安装包链接:https://www.microsoft.com/zh-cn/software-downloa…