算法:算法概述【时间复杂度、空间复杂度】

2024-09-02 04:08

本文主要是介绍算法:算法概述【时间复杂度、空间复杂度】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、算法定义

算法:为了实现业务目的的各种方法和思路就是算法。同样的数据,同样的目的, 不同的算法,不同的方法和思路,效率就会不同
算法是一种独立的存在 , 它并不依附于代码 , 代码只是实现算法思想的方式而已。
算法是独立存在的一种解决问题的方法和思想
对于算法而言,实现的语言并不重要,重要的是思想
算法可以有不同的语言描述实现版本(如C描述、C++描述、Python描述等)

二、算法的五大特性

  1. 输入: 算法具有0个或多个输入
  2. 输出: 算法至少有1个或多个输出
  3. 有穷性: 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成
  4. 确定性:算法中的每一步都有确定的含义,不会出现二义性
  5. 可行性:算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成

三、算法优劣的衡量:时间复杂度、空间复杂度

当我们说算法A的效率高于算法B,指的是 “时间复杂度” 的比较。

1. 时间复杂度

一个算法的实际运行时间很难评估,当时的输入、CPU主频、内存、数据传输速度、是否有其他程序在抢占资源等等,这些因素都会影响算法的实际运行时间。

为了公平地对比不同算法的效率,需要脱离开这些物理条件,抽象出一个数学描述。在所有这些因素中,问题的规模往往是决定算法时间的最主要因素。因此,定义算法的时间复杂度 T ( n ) T(n) T(n),用来描述算法的执行时间随着输入规模的增长将如何变化,增长速度是怎样的。

在输入规模较小时,运行时间本来就少,不同算法的差异不大。所以,时间复杂度通常关注的是输入规模n较大时运行时间的变化趋势,称之为渐进复杂度,采用大O记号。

如果A算法的时间复杂度优于算法B的时间复杂度,那么存在一个足够大的数M,当n>M时,可以保证算法A的实际效率优于算法B的实际效率

1.1 大O表示法

时间复杂度可以表示一个算法随着问题规模不断变化的最主要趋势 , 同时时间复杂度往往和大O表示法一起使用

在这里插入图片描述

1.2 时间复杂度的计算规则
  1. 基本操作,认为其时间复杂度为O(1)
  2. 顺序结构,时间复杂度按加法进行计算
  3. 循环结构,时间复杂度按乘法进行计算
  4. 分支结构,时间复杂度取最大值
  5. 判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略
  6. 在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度
1.3 最优、最坏时间复杂度

分析算法时,存在几种可能的考虑:

  1. 算法完成工作最少需要多少基本操作,即最优时间复杂度
  2. 算法完成工作最多需要多少基本操作,即最坏时间复杂度
  3. 算法完成工作平均需要多少基本操作,即平均时间复杂度

假如我们有一个列表 , 我们要通过一个算法从这个列表中找到10

  • 最坏时间复杂度:my_list = [ 1 , 5 , 6 , 4 , 3 , 2 , 7 , 8 , 9 , 10 ]

  • 最优时间复杂度:my_list = [ 10 , 5 , 6 , 4 , 3 , 2 , 7 , 8 , 9 , 1 ]

对于最优时间复杂度,其价值不大,因为它没有提供什么有用信息其反映的只是最乐观最理想的情况,没有参考价值。
对于最坏时间复杂度,提供了一种保证,表明算法在此种程度的基本操作中一定能完成工作
对于平均时间复杂度,是对算法的一个全面评价,因此它完整全面的反映了这个算法的性质。但另一方面,这种衡量并没有保证,不是每个计算都能在这个基本操作内完成。而且,对于平均情况的计算,也会因为应用算法的实例分布可能并不均匀而难以计算。

因此,我们主要关注算法的最坏情况,亦即最坏时间复杂度

1.4 常见的时间复杂度
执行次数函数举例非正式术语
12O(1)常数阶
2n+3O(n)线性阶
3n2+2n+1O(n2)平方阶
5log2n+20O(logn)对数阶
2n+3nlog2n+19O(nlogn)nlogn阶
6n3+2n2+3n+4O(n3)立方阶
2nO(2n)指数阶
注意,经常将log2n(以2为底的对数)简写成logn

在这里插入图片描述
在这里插入图片描述
所消耗的时间从小到大:
O ( 1 ) < O ( l o g n ) < O ( n ) < O ( n ) < O ( n l o g n ) < O ( n 2 ) < O ( n 2 l o g n ) < O ( n 3 ) O(1) < O(logn) < O(\sqrt{n})< O(n) < O(nlogn) < O(n^2) < O(n^2logn) < O(n^3) O(1)<O(logn)<O(n )<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3) < O ( 2 n ) < O ( n ! ) < O ( n n ) < O(2^n) < O(n!) < O(n^n) <O(2n)<O(n!)<O(nn)

  • O ( n p ) O(n^p) O(np):多项式复杂度,该类算法可计算,该类问题可解决;
  • O ( p n ) O(p^n) O(pn):指数级复杂度,该类算法不可计算,不可解决;NP-Hard复杂度问题【O(2n) 、 O(n!) 、 O(nn)】

在这里插入图片描述

2. 空间复杂度

空间复杂度S(n):该算法所耗费的存储空间
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的度量
算法的时间复杂度和空间复杂度合称为算法的复杂度

四、函数的时间复杂度(举例)

1. Python内置list类型(不能算作基本数据类型)操作的时间复杂度

在这里插入图片描述

方法复杂度简介
index[x]O(1)索引
index assignmentO(1)索引赋值
appendO(1)尾部追加
pop()O(1)尾部弹出
pop(i)O(n)指定位置弹出 n列表长度, 最坏时间复杂度
insert(i, item)O(n)指定位置添加
del operatorO(n)删除, 代表一个一个元素去清空
iterationO(n)迭代
contains(in)O(n)看谁是否在列表中, 需要遍历
get slice[x:y]O(k)取切片, 从x取到y, 一次定位到x, 然后取到y ,x和y之间有多少就是k
del sliceO(n)删除切片 删除位置之后, 后面的元素都需要往前移动
set sliceO(k)设置切片, li[0:3] = [1, 2, 3, 4]k是补充的东西数量
reverseO(n)置返
concatenateO(k)代表使用的+, 把两个列表加到一起, k是第二个列表中的元素
sortO(nlogn)排序
multiplyO(nk)相乘 li=[1, 2] -> n li * 10 -> k

2. Python内置dict类型(不能算作基本数据类型)操作的时间复杂度

在这里插入图片描述

方法复杂度简介
copyO(n)复制
get itemO(1)
set itemO(1)设置
delete itemO(1)删除键
contains(in)O(1)包含
iterationO(n)迭代

Dict的特性:

  • 查找速度快,无论dict有10个元素还是10万个元素,查找速度都一样。而list的查找速度随着元素增加而逐渐下降。
    不过dict的查找速度快不是没有代价的,dict的缺点是占用内存大,还会浪费很多内容,list正好相反,占用内存小,但是查找速度慢。
  • 字典值可以没有限制地取任何python对象,既可以是标准的对象,也可以是用户定义的,但键不行。不允许同一个键出现两次。
    键必须不可变,所以可以用数字,字符串或元组充当,所以用列表就不行。
  • dict的第二个特点就是存储的key-value序对是没有顺序的!这和list不一样。



参考资料:
常用数据结构操作与算法复杂度总结
算法复杂度分析
Master Theorem:Practice Problems and Solutions
(数据结构)十分钟搞定时间复杂度(算法的时间复杂度)

这篇关于算法:算法概述【时间复杂度、空间复杂度】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128945

相关文章

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

利用Python实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价

MySQL表空间结构详解表空间到段页操作

《MySQL表空间结构详解表空间到段页操作》在MySQL架构和存储引擎专题中介绍了使用不同存储引擎创建表时生成的表空间数据文件,在本章节主要介绍使用InnoDB存储引擎创建表时生成的表空间数据文件,对... 目录️‍一、什么是表空间结构1.1 表空间与表空间文件的关系是什么?️‍二、用户数据在表空间中是怎么

CentOS7增加Swap空间的两种方法

《CentOS7增加Swap空间的两种方法》当服务器物理内存不足时,增加Swap空间可以作为虚拟内存使用,帮助系统处理内存压力,本文给大家介绍了CentOS7增加Swap空间的两种方法:创建新的Swa... 目录在Centos 7上增加Swap空间的方法方法一:创建新的Swap文件(推荐)方法二:调整Sww

Python日期和时间完全指南与实战

《Python日期和时间完全指南与实战》在软件开发领域,‌日期时间处理‌是贯穿系统设计全生命周期的重要基础能力,本文将深入解析Python日期时间的‌七大核心模块‌,通过‌企业级代码案例‌揭示最佳实践... 目录一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

macOS Sequoia 15.5 发布: 改进邮件和屏幕使用时间功能

《macOSSequoia15.5发布:改进邮件和屏幕使用时间功能》经过常规Beta测试后,新的macOSSequoia15.5现已公开发布,但重要的新功能将被保留到WWDC和... MACOS Sequoia 15.5 正式发布!本次更新为 Mac 用户带来了一系列功能强化、错误修复和安全性提升,进一步增