评估算法的优劣指标-时间复杂度-空间复杂度-常数操作

2024-05-08 19:32

本文主要是介绍评估算法的优劣指标-时间复杂度-空间复杂度-常数操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一 、时间复杂度

1 看常数操作

        常数操作算O(1)

        常见的算术运算(+、-、*、/、% 等)

        常见的位运算(>>、>>>、<<、|、&、^等)

        赋值、比较、自增、自减操作等

        数组寻址操作

        常数时间操作

                数组-按地址偏移量直接命中 这个就是O(1)

        非固定时间操作

                链表-需要挨个寻址,这个就不是常数时间操作就是O(N)

2 算法最差情况的复杂度是这个算法的复杂度

        两层循环,第二层循环是第一层的 i-1 次 这个是等差数列,最后转换成式子  a * n^2 +b * n 这里时间复杂度只看最高阶项部分n^2 所以时间复杂度是O(N^2)

3 例子

排序算法 算时间复杂度

冒泡  O(N^2) 任何情况不变

        循环数组每个数

        循环N-1 做交换冒泡

插入排序 O(N^2) 在有序情况下是O(n) 但是时间复杂度O只看最不好的情况

        循环数组每个

        N-1 这个数向前比较如果小于就交换

选择 排序 O(N^2) 比冒泡号,因为空间换时间,交换最多只有N次

        循环数组每个

        循环n-1个 找到最大的记录下标志,最后与i做交换然后i++

二 、 额外空间复杂度(流程决定)

例1 一个数组 算总和 需要一个变量 来记录sum值

什么是额外空间?

数组开辟的空间,是原始数据,不算额外空间。

需要计算结果而开辟的空间,而不是原始数据,这样开辟的空间是额外空间。

例2   一个数组 算每个数出现次数 需要一个map来记录

什么是额外空间复杂度

例1的额外空间复杂度是O(1) 因为他不会随着初始数据变化而增长

例2 的额外空间复杂度是O(N)因为他会随着初始数据变化而增长

总结:算法入输出的空间都不是额外空间!

三、 常数项的时间

比较常数操作 多少

例如 插入排序 1234567 是O(n)

例如 冒泡 1234567 是O(n^2)

这里插入比冒泡少了比较和交换的常数项操作

比较常数操作 优劣

 排序算法 交换操作  一个是用 + - 进行 一个是用 ^ 进行

常数操作^ 比 + - 快 因为是位运算

如何PK常数项时间?

直接测试

四 、PK算法哪个最优

1 先满足时间复杂度最优

2 再满足空间复杂度最优

3 常数项因素 不算做PK最优(跟算法思想没关系,是细节方面)

五、排名从好到差:

O(1)  

O(logN)  

O(N)  

O(N*logN)  

O(N^2)   O(N^3)   …   O(N^K)

O(2^N)   O(3^N)   …   O(K^N)

O(N!)

这篇关于评估算法的优劣指标-时间复杂度-空间复杂度-常数操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE