算法的复杂性分析

news2025/1/17 15:29:22

算法的复杂性分析

文章目录

  • 算法的复杂性分析
    • 0、 算法评价的基本原则
    • 1、影响程序运行时间的因素
    • 2、算法复杂度
      • 2.1 算法的时间复杂度
      • 2.2 渐进表示法
        • 2.2.1 运行时间的上界
        • 2.2. 运行时间的下界
        • 2.2.3 运行时间的准确界
    • 3、总结
    • 4、参考


在这里插入图片描述


0、 算法评价的基本原则

评价一个算法的好坏实际就是评价一个程序的好坏。通常一个好的算法应该应考虑达到以下目标。

1.正确性(correctness)

一个好的算法的前提就是算法的正确性。不正确的算法没有任何意义。

2 可读性(Readability)

算法主要是为了人的阅读与交流,其次才是机器的执行。

3.健壮性(Robustness)和可靠性

  • 健壮性是指当输入数据非法时,算法也能适当地做出反应或进行处理。

  • 正确性和健壮性是相互补充的。

  • 程序的可靠性指一个程序在正常情况下能正确地工作,而在异常情况下也能做出适当处理。

  1. 效率(efficiency)
  • 效率包括运行程序所花费的时间以及运行这个程序所占用的资源(占用的存储空间 )。算法应该有效使用存储空间,并具有高的时间效率。

  • 对于规模较大的程序,算法的效率问题是算法设计必须面对的一个关键问题,目标是设计复杂性尽可能低的算法。

  1. 简明性(simplicity)
  • 算法应该思路清晰、层次分明、容易理解、利于编码和调试,即算法简单,程序结构简单。

  • 简单的算法效率不一定高,要在保证一定效率的前提下力求得到简单的算法。

  1. 最优性(optimality)
  • 指求解某类问题中效率最高的算法。最优性与所求问题自身的复杂程度有关。

1、影响程序运行时间的因素

  • 程序所依赖的算法

求解同一个问题的不同算法,其程序运行时间一般不同。

  • 问题的规模和输入数据

程序的一次运行是针对所求解问题的某一特定实例而言的。因此分析算法性能需要考虑的一个基本问题是所求解问题实例的规模,即输入数据量,必要时也考虑输出的数据量。

  • 计算机系统的性能

算法运行所需要的时间还依赖于计算机的硬件系统和软件系统。

2、算法复杂度

算法的复杂度主要包括时间复杂度和空间复杂度。

2.1 算法的时间复杂度

算法的时间复杂度指算法运行所需时间,也指执行算法所需要的计算工作量。

  • 度量算法的工作量

一个算法是由基本运算和控制结构(顺序、选择、循环)构成的,则算法执行时间取决于两者的综合效果。

通常的做法是:从算法中选取一种对于所研究的问题来说是基本的运算,以该基本运算重复执行的次数作为算法的工作量。

例如:在考虑两个矩阵相乘时,可以将两个实数之间的乘法运算作为基本运算,而对于所用的加法(或减法)运算可以忽略不计。

  • 算法所执行的基本运算次数还与问题的规模有关。例如:两个20阶矩阵相乘与两个3阶矩阵相乘所需要的基本运算(即两个实数的乘法)次数显然是不同的。前者需要更多的运算次数,因此,在分析算法的工作量时,还必须对问题的规模进行度量。

综上所述,算法的工作量用算法所执行的基本运算次数来度量,而算法所执行的基本运算次数是问题规模的函数。即算法的工作量=f(n),n是问题的规模。

  • 算法的执行时间绝大部分花在循环和递归上

对于循环语句的时间代价一般用以下三条原则分析:

1)对于一个循环,循环次数乘以每次执行简单语句的数目即为其时间代价。

2)对于多个并列循环,可先计算每个循环的时间代价,然后按加法规则计算总代价。

3)对于多层嵌套循环,一般可按乘法规则计算。但如果嵌套是有条件的,为精确计算其时间代价,要仔细累加循环中简单语句的实际执行数目,以确定其时间代价。

2.2 渐进表示法

一般来说,当N单调增加且趋于∞时,T(N)也将单调增趋于∞。对于T(N),如果存在函数T’(N),使得当N→∞时有(T(N)-T’(N))/T(N)→0,那么我们就说T’(N)是T(N)当N→∞时的渐进性态。在数学上,T’(N)是T(N)当N→∞时的渐进表达式。例如:3N2+4NlogN+7与3N2, 3N2是3N2+4NlogN+7的渐近表达式。

算法复杂性在渐近意义下的记号有:O、Ω、Θ等,分别表达运行时间的上界、运行时间的下界、运行时间的准确界等

2.2.1 运行时间的上界

设函数f(n)和g(n)是定义在非负整数集合上的正函数,如果存在正整数n0和正常数c,使得当n≥n0时,有f(n)≤cg(n),就称f(n)的阶至多是O(g(n)),记做f(n) = O(g(n)),称为大O记号(big O notation)。如图所示。

tp1

例如

  • f(n) = 2n2+3,g(n)=n2

当n≥3时,2n2+3≤3*n2,所以,可选c=3,n0 = 3。对于n≥n0,f(n)= 2n2+3≤3n2,所以,f(n) = O(n2),即2n2+3=O(n2)。

  • f(n) = n!= O(nn)

对于n≥1,有n(n-1)(n-2) … 1≤nn,因此,可选c=1,n0=1。对于n≥n0,f(n)= n!≤nn,所以,f(n) = O(nn)。

  • 10n2 + 9≠O(n)

使用反证法,假定存在c和n0,使得对于n≥n0,10n2 + 9≤cn始终成立,那么有10n + 9/n≤c,即n≤c/10-9/(10n)总成立。但此不等式不可能总成立,取n=c/10+1时,该不等式便不再成立。

定理1: 如果f(n)=amnm+am-1nm-1+…+a1nn+a0是m次多项式,且am>0,则f(n)=O(nm)。

证明如下:

在这里插入图片描述

  • 规则

加法规则

O(f(n))+O(g(n))=O(max(f(n),g(n)))
O(f(n))+O(g(n))=O(f(n)+g(n))

如果g(n)=O(f(n)),则O(f(n))+O(g(n))=O((f(n))

乘法规则

O(f(n))*O(g(n))=O(f(n)*g(n))
O(c*f(n))=O(f(n)),c是一个正常数
f(n)=O((f(n))

tp

2.2. 运行时间的下界

设有函数f(n)和g(n)是定义在非负整数集合上的正函数,如果存在正整数n0和正常数c,使得当n≥n0时,有f(n)≥cg(n),就称f(n)的阶至少是Ω(g(n)),记做f(n) = Ω(g(n)),称为Ω记号(omega notation)。如图所示。

tp

这个定义的意义是:当n充分大时有下界,且g(n)是它的一个下界,f(n)的增长至少像g(n)那样快。它用以表示一个算法运行时间的下界。

示例

tp

定理2:如果f(n)=amnm+am-1nm-1+…+a1nn+a0是m次多项式,且am>0,则f(n)=Ω(nm)。

2.2.3 运行时间的准确界

设有函数f(n)和g(n)是定义在非负整数集合上的正函数,如果存在正整数n0和正常数c1和c2(c1 ≤c2),使得当n≥n0时,有c1 g(n)≤f(n)≤c2 g(n) ,就称f(n)的阶是Θ(g(n)),则记做f(n)=Θ(g(n)),称为Θ记号(Theta notation)。
如图所示。

tp

即f(n)=Θ(g(n))当且仅当f(n)=O(g(n))且f(n)=Ω(g(n)),此时称f(n)与g(n)同阶。这个定义的意义是:f(n)的增长像g(n)一样快。

  • 示例

tp

3、总结

算法按时间复杂度分类

  • 常见的复杂度类型如下:
1<loglogn<logn<n^(1/2)<n^(3/4)<n<nlogn<n^2<2^n<n!<2^(n^2)

凡渐近时间复杂度有多项式时间限界的算法称作多项式时间算法(polynomial time algorithm),而渐近时间复杂度为指数函数限界的算法称作指数时间算法(exponential time algorithm)。

  • 最常见的多项式时间算法的渐近时间复杂度。
O(1)<O(log n)<O(n)<O(nlog n)<O(n^2)<O(n^3)
  • 最常见的指数时间算法的渐近时间复杂度。
O(2^n)<O(n!)<O(n^n)

随着n的增大,算法在所需时间上非常悬殊。如图所示。

在这里插入图片描述

4、参考

  • 算法设计与分析(第4版)

结束!

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

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

相关文章

第二证券|市场短期盘整 不改中期向好格局

12月初以来A股商场全体走势偏弱,上星期首要指数更是五连跌,上证指数重回3100点下方。关于商场近期的再度调整,本周组织观念显现,疫情带来的扰动或是首要原因。 不过,大都组织以为,心情面要素对商场的影响仅…

面试官:ui组件可以自动加载,那么业务组件可以吗?

大厂面试题分享 面试题库 前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 背景 笔者在最近在公司接手了一个老的对内使用的项目,接手后体验了下 发现首屏加载比较慢。分析了下大概的原因是main.js挂…

算法进阶:双指针(一)c++leetcode例题

82. 删除排序链表的重复元素 力扣传送: https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/description/ 给一个排好序的链表,删除把链表中出现的所有的重复的项: 1 2 2 3 3 3 4 5 -----> 1 4 5 这道题有很多种解法&a…

Unity3D——第一人称FPS生存游戏(resident zombies)

游戏源文件和游戏试玩程序:链接: 链接:https://pan.baidu.com/s/1Ln2tFizqEO_uEoQhuxvgrQ?pwdl6w0 提取码:l6w0 游戏思路前身搭建: 用一些正方体和胶囊做出来的基础场景, 人物设计:红色的胶囊体是敌人,手持枪械是…

一文说透BIO以及非阻塞IO

目录1. 一次I/O到底经历了什么2. 什么是Socket3. 阻塞I/O(Blocking I/O,BIO)3.1. 客户端的socket流程3.1.1. 何为socket?3.1.2. 何为连接?3.2. 服务端的socket流程3.2.1. 创建socket3.2.2. 绑定端口号3.2.3. listen()的…

项目实战之旅游网(六)认证与授权

一.编写相关页面 在本项目中,我们使用Spring Security 进行认证和授权,首先我们先编写相关页面。 1.编写登录页面admin_ login.html 2.编写登录失败页面admin_ fail.html 3.编写权限不足页面no_ permission.html 略过。知道其功能即可。 二.编写配置…

数字孪生城市可视化大屏设计,智慧楼宇开源项目

纵观城市发展历史,技术的革命必然会带动城市内部的变革。当前,以数字孪生为代表的前言信息技术飞速发展,必然会使社会对数字城市的深度和广度有着更为清晰的认知。加快构建数字孪生城市管理平台,通过三维可视化大屏直观展示&#…

图表控件LightningChart.NET 系列教程(六):许可证管理介绍(中)

LightningChart.NET SDK 是一款高性能数据可视化插件工具,由数据可视化软件组件和工具类组成,可支持基于 Windows 的用户界面框架(Windows Presentation Foundation)、Windows 通用应用平台(Universal Windows Platfor…

Apache ShardingSphere-Proxy <5.3.0 存在身份认证绕过漏洞

漏洞描述 Apache ShardingSphere 是一款分布式的数据库生态系统,ShardingSphere-Proxy 是支持 MySQL、PostgreSQL 和 openGauss 协议的数据库代理模块。 ShardingSphere-Proxy 5.3.0 之前的版本中在使用 MySQL 作为后端数据库时,在客户端认证失败后没有…

Linux进程状态与优先级

Ⅰ. OS进程状态的概念 进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。 在三态模型中,进程状态分为 运行态,就绪态,阻塞态。 在五态模型中,进程状态分为 新建态、终止态,运行态&a…

服务雪崩预防Sentinel

服务雪崩效应 在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100% 可用。如果一个服务出现了 问题,调用这个服务就会出现线程阻塞的情况,此时若有大量的请求涌入,就会出现多条线程阻塞等 待,进而导致服务瘫痪。 由于…

【HTML+CSS+JavaScript】实现鼠标点击烟花效果

文章目录【HTMLCSSJavaScript】实现鼠标点击烟花效果(爆炸型、心型、圆形)一. 效果图二. 鼠标点击烟花效果 - 心型实现代码(1) HTML部分代码(2) CSS部分代码(3) 内部的JavaScript部分代码三. 鼠标点击烟花效果 - 圆型实现代码(1) HTML部分代码(2) CSS部分…

【mysql】优化系列文章之一-索引

mysql优化系列 不是教程,不是官方文档,而是自己实战的点滴记录,不一定适合新手和系统学习者 第一章 mysql索引 文章目录mysql优化系列前言1、Mysql索引2、B Tree2.1.特点2.2. 结构分解2.3. 例题分析2.4. 验证索引2.5.索引插入耗时3. MySQL 中…

Oracle数据库同步复制工具Beedup产品功能(一)

1、全量复制 Beedup全量复制功能通过遍历比对主从库用户模式及其下包含的各类对象来保证主从库的相关对象一致性。 支持角色、用户、架构、登录用户、表 (列定义 主外键 索引)、视图存储过程、函数、触发器、类型、类型体、包、包体、序列、同义词、数据库链接等对象复制全量…

技术干货 | 人大金仓KFS基于分区索引的分片入库技术解析

在之前的文章《技术干货:人大金仓KFS精准过滤和分片并行入库技术解析》中,KFS利用分片并行入库技术,解决了某金融POC数据同步项目中数据入库持续积压问题。经过优化后,在200并发的压测场景中,整体同步性能指标从压测30…

基于BP神经网络、RBF神经网络以及PSO优化的RBF神经网络进行数据的预测(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑…

IT30--IT之职能部门(3年之约已满)

IT作为一个职能部门,肯定跟业务不同,具体有哪些事情要做,我们一一道来。 年终规划的二三事 组织体系规划及梳理 预算编制 今天我们先来说说组织体系规划。 1 从愿景使命价值观到行动及思考方法 无论是企业还是部门,软文件建设肯…

【信息检索与数据挖掘期末笔记】(六)Link Analysis

Web图 将Web当做有向图 节点:网页 边:超链接 PageRank 不同网页的重要性是不同的,在web-graph中,节点之间的连接性有巨大的差异。我们根据链接结果来对网页进行排序 想法:用链接来投票 如果有更多的链接指向一个网…

Linux Shell 编程,Shell 变量详解

Linux Shell 编程,Shell 变量详解1.第一个shell脚本2.Shell 变量初探3.位置参数变量4.预定义变量1.第一个shell脚本 打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 hello.sh,扩展名为 sh(sh代表shell&#xff09…

【算法】面试题 - 链表(附讲解视频)

链表相关面试题876. 链表的中间结点206. 反转链表86. 分隔链表160. 相交链表141. 环形链表问题:快慢指针为什么一定会相遇142. 环形链表 II问题:如何确认入口237. 删除链表中的节点19. 删除链表的倒数第 N 个结点21. 合并两个有序链表23. 合并K个升序链表…