【基础知识整理】时间复杂度 & 空间复杂度

这篇具有很好参考价值的文章主要介绍了【基础知识整理】时间复杂度 & 空间复杂度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概览

时间复杂度与空间复杂度的作用是在衡量一个算法的优劣性,以及在二者之间进行权衡,寻找二者的平衡点。

时间复杂度是指执行算法所需时间的增长率,而空间复杂度则是指执行算法所需存储空间的增长率。
高时间复杂度的算法可能需要在短时间内完成大规模数据的计算,而高空间复杂度的算法可能需要占用大量的内存空间。

在进行算法设计和分析时,通常需要在时间和空间之间进行权衡,以找到适合特定问题的最佳算法。了解算法的时间和空间复杂度可以帮助我们确定在处理不同问题时哪些算法是可行的,以及如何优化算法以减少其时间和空间的占用。

  1. 数据结构和算法解决是 “如何让计算机时间更快、空间更省的方式解决问题”。
  2. 因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。
  3. 分别用时间复杂度(算法执行时间)和空间复杂度(占用空间)两个概念来描述性能问题,二者统称为复杂度。
  4. 复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。

一、时间复杂度

算法的时间复杂度,也就是算法的时间量度。

时间复杂度表示算法运行时间的相对大小,是算法运行时间的增长率。特指在解决问题的规模(问题大小)趋于无穷大时,算法的运行时间与规模的关系。

它通常与输入数据进行比较,时间复杂度不是指具体的时间,而是算法的运算次数,是相对于问题规模的相对量。

举例:

当规模增长10倍时,算法的运行时间也增长了10倍,则该算法的时间复杂度为O(1)。如果规模增长10倍时,算法的运行时间增长了100倍,则该算法的时间复杂度为O(10)。

时间复杂度表示方法 - 大 O 表示法

算法的执行时间与每行代码的执行次数成正比,用 T(n) = O(f(n)) 表示,

T(n) :算法执行总时间,

f(n) :每行代码执行总次数

n: 数据的规模

实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势

所以常量、低阶、系数实际上对这种增长趋势不产生决定性影响,我们在做时间复杂度分析时忽略这些项。

我们再看几个例子。

假设我们有一段代码


	public static void main(String[] args) {

		int i = 10;
		for (int j = 0; j < i; j++) {
			System.out.println("j" + j);
		}
	}

当运行这段代码时,所有语句的执行都需要花费时间,我们假设每条语句的执行时间一样,我们将代码进行拆解,如下
【基础知识整理】时间复杂度 & 空间复杂度
我们将这些次数加起来,总执行次数就 = 3 * i + 3; 当i 趋向于无穷大时, 我们可以忽略常数、低阶项、及高阶系数,这样总执行次数就 = i
T(i) = O(i)

时间复杂度计算

  1. 得出运行时间的函数
  2. 对函数进行简化,只保留最高阶项 (忽略常数、低阶项、及高阶系数等)

下面我们分别来举例说明

常数阶
时间复杂度为 T(n) = O(1)

function aFun() {
    console.log("Hello, World!");      //  需要执行 1 次
    return 0;       // 需要执行 1 次
}

我们看到总共要执行2次,我们来简化一下,用1取代所有的常量,就变成了O(1)
时间复杂度为 T(n) = O(n)
function bFun(n) {
    for(let i = 0; i < n; i++) {         // 需要执行 (n + 1) 次
        console.log("Hello, World!");      // 需要执行 n 次
    }
    return 0;       // 需要执行 1 次
}

总共需要执行 3n + 2次,简化一下,O(n)
时间复杂度为 T(n) = O(n^2)
function cal(n) {
   let sum = 0; // 1 次
   let i = 1; // 1 次
   let j = 1; // 1 次
   for (; i <= n; ++i) {  // n 次
     j = 1;  // n 次
     for (; j <= n; ++j) {  // n * n ,也即是  n平方次
       sum = sum +  i * j;  // n * n ,也即是  n平方次
     }
   }
 }

时间复杂度为 T(n) = O(log2n)

let i=1;
while (i <= n)  {
   i = i * 2;
}


代码是从 1 开始,每次循环就乘以 2,当大于 n 时,循环结束。
其实就是高中学过的等比数列,i 的取值就是一个等比数列。在数学里面是这样子的:
20 21 22 ... 2k ... 2x = n
所以,我们只要知道 x 值是多少,就知道这行代码执行的次数了,通过 2x = n 求解 x,
数学中求解得 x = log2n 。所以上面代码的时间复杂度为 O(log2n)

二、空间复杂度

空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系

定义:算法的空间复杂度通过计算算法所需的存储空间实现,是对一个算法在运行过程中临时占用存储空间大小的量度

算法的空间复杂度的计算公式记作:S(n) = O(f(n)),

空间复杂度计算


	public static void main(String[] args) {

		int i = 10;
		for (int j = 0; j < i; j++) {
			System.out.println("j" + j);
		}
	}

随着i的变化,所需开辟的内存空间并不会随着i的变化而变化,因为 这 i、j 用的时相同的空间, i 、j各一个,简化一下就是 O(1)

n :问题的规模,

f(n) :语句关于 n 所占存储空间的函数。

function print(n) {
 const newArr = []; // 第 2 行
 newArr.length = n; // 第 3 行
  for (let i = 0; i <n; ++i) {
    newArr[i] = i * i;
  }

  for (let j = n-1; j >= 0; --j) {
    console.log(newArr[i])          当消耗空间和输入参数n保持线性增长
  }  
}2 行代码中,申请了一个空间存储变量 newArr ,是个空数组。
第 3 行把 newArr 的长度修改为 n 的长度的数组,每项的值为 undefined ,
除此之外,剩下的代码都没有占用更多的空间,所以整段代码的空间复杂度就是 O(n)

我们常见的空间复杂度就是 O(1)、O(n)、O(n^2)文章来源地址https://www.toymoban.com/news/detail-497116.html

到了这里,关于【基础知识整理】时间复杂度 & 空间复杂度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 时间复杂度和空间复杂度

    时间复杂度和空间复杂度是用来评估算法性能的两个重要指标。 时间复杂度(Time Complexity)是衡量算法执行时间随输入规模增长而增长的度量。它表示了算法解决问题所需的时间量级。常见的时间复杂度有: 常数时间复杂度 O(1):无论输入规模的大小,算法的执行时间都是固

    2024年01月17日
    浏览(48)
  • 详解时间复杂度和空间复杂度问题

            前言:本来我并不认为时间复杂度和空间复杂的有多重要,只要日常会判断和分析算法的复杂度即可,但是,不论是在考研的数据结构与算法中,还是在日常的刷题中,我们都会见到,限制我们时间和空间复杂度的算法设计问题,这对我们要求就高了,所以,我们需

    2024年02月02日
    浏览(54)
  • 算法的时间复杂度与空间复杂度

    1.算法效率 2.时间复杂度 3.空间复杂度 4.复杂度oj题目 1.算法效率 1.1 如何衡量一个算法的好坏 一辆车的好坏我们可以从价格,油耗...... 方面来衡量,但衡量一个算法的好坏我们该从哪一个方面入手呢?比如斐波那契数列: 斐波那契数列的递归实现方式非常简洁,但简洁一定

    2024年02月15日
    浏览(85)
  • 算法的时间复杂度和空间复杂度

    目录 本章重点 一 时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3 常见的时间复杂度的计算 二 空间复杂度 三 常见复杂度对比 四 复杂度的oj练习 4.1 消失的数字 4.2 旋转数字 每一天都是人生限定,每一天都值得100%努力 (1)算法效率(2)时间复杂度(3)空间复

    2024年02月01日
    浏览(51)
  • 算法之【时间复杂度】与【空间复杂度】

    目录 一、算法 1、算法定义 2、两种算法的比较 3、算法的特性 4、算法设计的要求 二、算法的复杂度 1、时间复杂度 1.1定义 1.2大O的渐近表示法 1.3推导大O阶方法 1.4最坏情况与平均情况 1.5常见的时间复杂度计算示例 🍂常数阶: 🍂线性阶:  🍂对数阶: 🍂平方阶: 2、空间

    2024年02月05日
    浏览(62)
  • 什么是时间复杂度和空间复杂度

    🍕博客主页:️自信不孤单 🍬文章专栏:数据结构与算法 🍚代码仓库:破浪晓梦 🍭欢迎关注:欢迎大家点赞收藏+关注 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 算法(Algorithm):就是定义良好的计算过程

    2023年04月15日
    浏览(44)
  • 数据结构(时间复杂度,空间复杂度)

    算法的时间复杂度是一个数学函数,算法中的基本操作的执行次数,为算法的时间复杂度。 1.大O的表示法 2.推导大O表示法 1、用常数1取代运行时间中的所有加法常数。 2、在修改后的运行次数函数中,只保留最高阶项。 3、如果最高阶项存在且不是1,则去除与这个项目相乘的

    2024年02月07日
    浏览(51)
  • 数据结构 — 时间复杂度、空间复杂度

    数据结构_空间复杂度_时间复杂度讲解_常见复杂度对比 本文介绍数据结构中的时间复杂度和空间复杂度 ***文章末尾,博主进行了概要总结,可以直接看总结部分*** 博主博客链接:https://blog.csdn.net/m0_74014525 点点关注,后期持续更新系列文章 算法效率指的是算法在处理数据时

    2024年02月13日
    浏览(53)
  • 数据结构 --- 复杂度概念及计算讲解(时间复杂度,空间复杂度)

    今天没有sao话,今天认真学习 前言: 经常刷题的人都知道,我们在解决一道题时可能有多个解法,那么如何判断那个解法才是最优解呢? 我们通常从代码的两个方面进行判断:1.时间 2.空间。 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀

    2024年03月22日
    浏览(47)
  • 数据结构(2)时间复杂度——渐进时间复杂度、渐进上界、渐进下界

    目录 2.1.概述 2.2.时间复杂度的计算 2.2.1.渐进复杂度 2.2.2.渐进上界 2.2.3.渐进下届 2.2.4.复杂度排序 2.2.5.举几个例子 算法的基本定义: 求解问题的一系列计算或者操作。 衡量算法性能的指标: 时间复杂性 空间复杂性 这两个指标里最有用的是时间复杂度,平时谈的算法复杂度

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包