算法当中的时间、空间复杂度?

news/2024/10/30 13:33:38/

1.究竟什么是时间复杂度

时间复杂度是一个函数,它定性描述该算法的运行时间
时间复杂度就是用来方便开发者估算出程序运行的答题时间。
通常会估算算法的操作单元数量来代表程序消耗的时间,这里默认CPU的每个单元运行消耗的时间都是相同的。
假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 O(f(n))

2.什么是大O

大O用来表示上界的,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。

拿插入排序来说,插入排序的时间复杂度我们都说是O(n^2) 。

输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是O(n),但如果数据是逆序的话,插入排序的时间复杂度就是O(n2),也就对于所有输入情况来说,最坏是O(n2)
的时间复杂度,所以称插入排序的时间复杂度为O(n^2)。

3.不同数据规模的差异

大O就是数据量级突破一个点且数据量级非常大的情况下所表现出的时间复杂度,这个数据量也就是常数项系数已经不起决定性作用的数据量。
所以我们说的时间复杂度都是省略常数项系数的,是因为一般情况下都是默认数据规模足够的大,基于这样的事实,给出的算法时间复杂的的一个排行如下所示:

O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(nlogn)线性对数阶 < O(n^2)平方阶 < O(n^3)立方阶
< O(2^n)指数阶

4.复杂表达式的化简

有时候我们去计算时间复杂度的时候发现不是一个简单的O(n) 或者O(n^2), 而是一个复杂的表达式,例如:

O(2n^2 + 10n + 1000)

那这里如何描述这个算法的时间复杂度呢,一种方法就是简化法

去掉运行时间中的加法常数项 (因为常数项并不会因为n的增大而增加计算机的操作次数)。

O(2n^2 + 10n)

去掉常数系数(上文中已经详细讲过为什么可以去掉常数项的原因)。

O(n^2 + n)

只保留保留最高项,去掉数量级小一级的n (因为n^2 的数据规模远大于n),最终简化为:

O(n^2)

如果这一步理解有困难,那也可以做提取n的操作,变成O(n(n+1)) ,省略加法常数项后也就别变成了:

O(n^2)

所以最后我们说:这个算法的算法时间复杂度是O(n^2) 。

也可以用另一种简化的思路,其实当n大于40的时候, 这个复杂度会恒小于O(3 × n^2), O(2 × n^2 + 10 × n +
1000) < O(3 × n2),所以说最后省略掉常数项系数最终时间复杂度也是O(n2)

5.O(log n)中的log是以什么为底?

平时说这个算法的时间复杂度是logn的,那么一定是log 以2为底n的对数么?
可以是以10为底n的对数,也可以是以20为底n的对数,但我们统一说 logn,也就是忽略底数的描述。

在这里插入图片描述

假如有两个算法的时间复杂度,分别是log以2为底n的对数和log以10为底n的对数,那么这里如果还记得高中数学的话,应该不难理解以2为底n的对数 = 以2为底10的对数 * 以10为底n的对数。

而以2为底10的对数是一个常数,在上文已经讲述了我们计算时间复杂度是忽略常数项系数的。

抽象一下就是在时间复杂度的计算过程中,log以i为底n的对数等于log 以j为底n的对数,所以忽略了i,直接说是logn。


http://www.ppmy.cn/news/104123.html

相关文章

K8s in Action 阅读笔记——【6】Volumes: attaching disk storage to containers

K8s in Action 阅读笔记——【6】Volumes: attaching disk storage to containers 在前三章中&#xff0c;我们介绍了Pods以及它们与ReplicationControllers、ReplicaSets、DaemonSets、Jobs和Services等Kubernetes资源的交互。现在&#xff0c;我们将回到Pod内部&#xff0c;…

Flink数据转换方法使用案例总结

目录 Flink数据转换方法使用案例MapFlatMapFilterKeyByReduceAggregationsWindowJoinUnionProjectDistinctSortPartitionIterateFold使用 Flink 数据转换 Conclusion 的案例问题描述解决方案结论 Flink数据转换方法使用案例 Apache Flink是一个分布式流处理框架&#xff0c;它…

Java最新版发送阿里短信教程

一、概述&#xff1a; 为什么现在的企业越来越多使用阿里云短信服务&#xff0c;究其原因是阿里云短信服务是一种可靠、高效、安全的短信发送服务&#xff0c;它具有以下优点&#xff1a; 高可靠性&#xff1a;阿里云短信服务采用全球领先的短信网关进行短信发送&#xff0c;确…

数据库基础——9.聚合函数

这篇文章来讲一下数据库中的聚合函数 目录 1. 聚合函数介绍 1.1 AVG和SUM函数 1.2 MIN和MAX函数 1.3 COUNT函数 2. GROUP BY 2.1 基本使用 2.2 使用多个列分组 2.3 GROUP BY中使用WITH ROLLUP 3. HAVING 3.1 基本使用 3.2 WHERE和HAVING的对比 4. SELECT的执…

【满分】【华为OD机试真题2023B卷 JAVAJS】字符串统计

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 字符串统计 知识点字符串 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 给定两个字符集合,一个为全量字符集,一个为已占用字符集。已占用的字符集中的字符不能再使用,要求输出剩余可用字符集。 输入描述: 1、…

HTML <colgroup> 标签

实例 两个 colgroup 元素为表格中的三列规定了不同的对齐方式和样式(注意第一个 colgroup 元素横跨两列): <table width="100%" border="1"><colgroup span="2" align="left"></colgroup><colgroup align=&…

React面试题和基础

React的特点&#xff1a; JSX它使用虚拟DOM &#xff0c;减少 DOM 操作&#xff0c;提升性能。便于和其他平台集成。它可以进行服务器端渲染。单向数据流。组件化 双向数据绑定和单向数据流区别&#xff1f; 单向绑定的优点在于清晰可控&#xff0c;缺点则在于模板代码过多。…

MATLAB任意位置反转并拼接数组

初始化变量&#xff1a; 定义原始数组 original_array&#xff0c;例如 [1, 2, 3, 4, 5, 6]。定义仿真时间 simulationTime&#xff0c;表示遍历数组的总时间。 定义空的结果数组 result_array&#xff0c;用于存储最终生成的数组。 设置初始时间和索引&#xff1a; 初始化当前…