算法效率分析

news/2024/9/17 11:08:20/文章来源:https://www.cnblogs.com/ttduck/p/18404696

算法效率分析

算法定义

程序 = 数据结构 + 算法

算法:是对特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作

程序是计算机指令的有序集合,是算法用某种程序设计语言的表述,是算法在计算机上的具体实现

算法的特性

(1) 有穷性:一个算法必须在执行有穷步之后结束,且每一步都可在有穷时间内完成(算法必须是有穷的,程序可以是无穷的)

(2) 确定性:算法中的每条指令必须有确切的含义,对于相同的输入只能得到相同的输出,不会出现二义性

(3) 有零个或多个输入:在执行算法时需要从外界取得必要的信息

(4) 有一个或多个输出:算法的目的是为了求解,“ 解 ”就是输出

(5) 可行性:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成

算法设计的要求

(1) 正确性:指算法至少应该具有输入、输出和加工处理无歧义性、能正确得到问题的正确答案

(2) 可读性:算法设计的另一目的是为了便于阅读,理解和交流

(3) 健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果

(4) 高效性时间效率高和存储量低(时间复杂度低和空间复杂度低)

算法时间效率的度量

根据该算法编制的程序在计算机上执行时所消耗的时间来度量,度量一个程序的执行时间通常有两种方法:

  1. 事后统计估计:让算法先运行,事后统计其执行时间

  2. 事前分析估计:认为算法的执行时间是问题规模 n 的函数,用 T(n) 表示

一个程序的运行时间依赖于算法的好坏问题的输入规模

$$算法运行时间 = \sum每条语句的执行次数*该语句一次所执行的时间$$

  • 一般情况下,算法中基本语句重复执行的次数是问题规模 n 的某个函数 f(n),算法的时间量度记作T(n) = O(f(n))
  • 它表示随问题规模 n 的增大,算法执行时间的增长率和 f(n) 的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度

基本方法:
找出语句频度最大的那条语句作为基本语句
计算基本语句的频度得到问题规模 n 的某个函数 f(n)
取其数量级用符号 “ O ” 表示

注意:算法中基本操作重复执行的次数还随问题的输入数据集不同而不同

时间复杂度的计算方法

对于复杂的算法,可以将它分为几个容易估算的部分,然后利用加法法则乘法法则,计算算法的时间复杂度

最坏时间复杂度是指在最坏情况下,算法的时间复杂度

平均时间复杂度是指所有可能输入实例在等概率出现的情况下,算法的期望运行时间

最好时间复杂度是指在最好情况下,算法的时间复杂度

一般总是考虑最坏情况时间复杂度,以保证算法的运行时间不会比它更长

加法法则

T(n) = T1(n) + T2(n) = O(f(n)) + O(g(n)) = O(max(f(n),g(n)))

乘法法则

T(n) = T1(n)*T2(n) = O(f(n))*O(g(n)) = O(f(n)*g(n))

注意:常见的时间复杂度(自上向下越来越大)

时间复杂度 术语
O(1) 常数阶
O(log2n) 对数阶
O(n) 线性阶
O(nlog2n) nlogn阶
O(n^2) 平方阶
O(n^3) 立方阶
O(2^n) 指数阶
O(n!) 阶乘阶
O(n^n)` 幂指阶

算法空间效率的度量

我们用 “ 时间复杂度 ” 指运行时间的需求, “ 空间复杂度 ” 指空间的需求

作为算法所需存储空间的度量,简称空间复杂度,它也是问题规模 n 的函数,记作:S(n) = O(f(n))

算法占据的空间:

  • 算法本身要占据的空间,输入 / 输出,指令,常数,变量等
  • 算法要使用的辅助单元的个数(算法的空间复杂度一般指辅助单元的空间大小)

若算法中新建了几个与输入数据规模 n 相同的辅助数组,则空间复杂度为O(n)
算法原地工作是指算法所需的辅助空间为常量,即为O(1)

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

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

相关文章

调谐半导体吸收光谱(TDLAS)技术简介

一、调谐半导体吸收光谱(TDLAS)技术简介 TDLAS是Tunable Diode Laser Absorption Spectroscopy的简称,该技术主要是利用可调谐半导体激光器的窄线宽和波长随注入电流改变的特性,通过调制激光器的波长,使激光器的波长扫描过被测气体分子的吸收峰,从而基于比尔朗伯定律,使气…

极狐GitLab 新一代容器镜像仓库正式上线啦!

从极狐GitLab 17.3 开始,私有化部署实例也可以使用新一代容器镜像仓库啦!新一代容器镜像仓库具有更高效的零宕机垃圾收集功能和其他优势。从去年开始,极狐GitLab 就启动了重构容器镜像仓库的计划,用以构建具有更强功能的镜像仓库,比如零宕机垃圾收集。自从将此功能成功迁移…

集合底层学习笔记

集合的底层原理 数据结构中有 数组 和 链表 来实现对数据的存储,但这两者基本上就是两个极端。数组:数组存储区间是连续的,占用内存严重,故空间复杂度很大。但数组的二分查找时间复杂度很小,为O(1);数组的特点是:寻址容易,插入和删除困难。 链表:链表存储区间不连续,占…

2.HDFS

HDFS一.HDFS概述1.HDFS的产生背景和定义(1)HDFS产生背景随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到 更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系 统来管理多台机器上的文件,这就是分布式管理系统.HDFS只是分布式文 件管理系统中的一…

编译hello world

新建一个文件夹存放代码 在文件夹内新建一个java文件。hello.java 在文件内编写代码public class hello{public static void main(String[] args){System.out.print("hello world!");} }编译java文件,在文件目录下打开命令提示符窗口,输入:javac hello.java编译ja…

海外合规|新加坡 【数据保护新风向】你的DPO注册了吗?

数据安全已经成为了我们不可忽视的重要议题。新加坡个人数据保护委员会(PDPC)提醒,2024年9月30日之前,根据新加坡的个人资料保护法(PDPA),每个组织都必须指定至少一名数据保护官(DPO)来确保数据的合规使用。 DPO注册相关问题: 1、是否必须通过BizFile+注册我组织的DP…

Linux脚本中 指令返回值得获取,以及参数等获取

在写脚本时,经常遇到这样的问题: 如何获取当前进程号,脚本执行过的命令的进程号? 如何获取当前时间? 如何得到参数个数? 如何得到脚本中各命令的返回信息?。。。。 其实这些信息都能轻松从shell预定义的一些特殊变量获得,下面总结了一些常用的。特殊的shell变量:#获取当…

51nod 1296 有限制的排列

题目链接 学习链接 设状态 \(dp[i][j]\) 表示整数 \([1,i]\) 满足要求的排列中,最后一个数选 \(j\) 的排列数。 开一个数组记录他的状态:把前面已选好的序列中大于等于 \(j\) 的数都加一后再把 \(j\) 加到后面。#include <bits/stdc++.h> using namespace std; #define…

canvas版本中国象棋,象棋的棋子控制还是复杂一些

代码:<!Doctype html> <html lang="zh_cn"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>中国象棋</title><meta name="Keywords" content="&q…

yolo与目标检测(v1-v5)

yolo v1-v5与目标检测 深度学习经典检测方法概述 目标检测的两种方法从yolov1开始讲解,v2,v3都是在此基础上 单阶段目标检测,需要输出的就是四个值(x,y,w,h) 这样看起来很像是一个回归任务而双阶段目标检测,是先选出候选区域,在进行预测,具体细节可以看完之前文章,物体检…

Hadoop(二)Hadoop概述

概述 Hadoop是什么Hadoop是一个由Apache基金会所开发的分布式系统基础架构 分布式系统:多台服务器共同完成一个任务(例如多台计算机共同存储一份大数据) 主要解决:海量数据的存储和海量数据的分析计算问题 广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈Hado…

出库申请单、其他出库单套件使用指南

出库申请单、其他出库单套件使用指南 出库申请单使用套件需要把业务类型​修改为空 点击套件展开或者保存时会自动展开套件​​ ‍ 其他出库单 如图,套件的单据,新明细会出现在第一个标签,只有一个删除行的功能。 修改新明细​中的数量会自动联动到明细信息​中 ​​ ‍博客…