时间复杂度和空间复杂度详解带例题(精)

【时间复杂度练习题与解析】 1、设n为如下程序段处理的数据个数,求时间复杂度 for(i=l;<n;i=2*i) std::cout<<“i=”<<std::end1; 分析: 主看for循环,当>=n时结 束,假设执行m次结束,i1=2= 21 ,i2 =2*2 = 22,..,im二2m,则有2m=n,大致口算m=1og2n, 则时间复杂度为O( log2n ) 2、分析以下时间复杂度 void fun(int n) { int i=0,s=0; while(s<n) { ... 阅读详情

算法

算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。

那么我们应该如何去衡量不同算法之间的优劣呢?

主要还是从算法所占用的「时间」和「空间」两个维度去考量。

  • 时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。
  • 空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。

因此,评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况。然而,有的时候时间和空间却又是「鱼和熊掌」,不可兼得的,那么我们就需要从中去取一个平衡点。

下面我来分别介绍一下「时间复杂度」和「空间复杂度」的计算方式。


时间复杂度

首先要说的是,时间复杂度的计算并不是计算程序具体运行的时间,而是算法执行语句的次数。
当我们面前有多个算法时,我们可以通过计算时间复杂度,判断出哪一个算法在具体执行时花费时间最多和最少。

常见的时间复杂度有:

  • 常数阶O(1),
  • 对数阶O(log2 n),
  • 线性阶O(n),
  • 线性对数阶O(n log2 n),
  • 平方阶O(n^2),
  • 立方阶O(n^3)
  • k次方阶O(n^K),
  • 指数阶O(2^n)。

随着n的不断增大,时间复杂度不断增大,算法花费时间越多。

计算方法
①选取相对增长最高的项
②最高项系数是都化为1
③若是常数的话用O(1)表示
如f(n)=2*n^3+2n+100
则O(n)=n^3。

通常我们计算时间复杂度都是计算最坏情况

时间复杂度例题

1. 常数例题的时间复杂度

int x = 90;
     int y = 100;
     while (y > 0)
     {
          if (x > 100)
          {
              x = x - 10;
              y--;
          }
          else
          {
              x++;
          }
     }

这段代码里只有常量,所以时间复杂度只有O(1)


2. for循环的时间复杂度

for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}

这段代码,for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码都可以用O(n)来表示它的时间复杂度。


  1. 嵌套循环的时间复杂度
for (i = 0; i < n; i++)
     {
          for (j = 0; j < i; j++)
          {
              for (k = 0; k < j; k++)
              {
                   x++;
              }
          }
     }

当有若干个循环时,时间复杂度是和嵌套层数最多的循环语句中最内层的频度决定的,时间复杂度:O(n^3)


  1. 求二分法的时间复杂度
int select(int a[], int k, int len)
{
     int left = 0;
     int right = len - 1;
     while (left <= right)
     {
          int mid = left + ((right - left) >> 2);
          if (a[mid] == k)
          {
              return 1;
          }
          else if (a[mid] > k)
          {
              right = mid - 1;
          }
          else
          {
              left = mid + 1;
          }
     }
     return NULL;
}

在这里插入图片描述
在最坏的情况下循环x次后找到,n/(2^x)=1;x=log2n;
所以二分查找的时间复杂度为:O(log2n)

空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。

计算方法:
①忽略常数,用O(1)表示
②递归算法的空间复杂度=递归深度N*每次递归所要的辅助空间
③对于单线程来说,递归有运行时堆栈,求的是递归最深的那一次压栈所耗费的空间的个数,因为递归最深的那一次所耗费的空间足以容纳它所有递归过程。

空间复杂度例题

1. 常数

int fun(int n,)
{
int k=10;
if(n==k)
return n;
else
return fun(++n);
}

递归实现,调用fun函数,每次都创建1个变量k。调用n次,空间复杂度O(n*1)=O(n)


2. 实现二分查找算法的递归及非递归

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<string.h>
#include<assert.h>

int BinarySearch(int arr[], int len, int num)
{
    assert(arr);

    int left = 0;
    int right = len - 1;
    int mid;

    while (left <= right)
    {
        mid = left + (right - left) / 2;

        if (num > arr[mid])
        {
            left = mid + 1;
        }
        else if (num < arr[mid])
        {
            right = mid - 1;
        }
        else
        {
            return mid;
        }
    }

    return -1;
}
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9 };
    int length = sizeof(arr) / sizeof(arr[0]);
    int aim = 9;
    int result;

    result = BinarySearch(arr, length, aim);

    if (result == -1)
    {
        printf("Can't find %d\n", aim);
    }
    else
    {
        printf("%d at %d postion\n", aim,result + 1);
    }


    return 0;
}

二分查找时,每次都在原有查找内容进行二分,所以时间复杂度为O(log2 n)
因为变量值创建一次,所以空间复杂度为O(1)


3. 递归算法

int BinarySearchRecursion(int arr[5], int lef, int rig,int aim)
{
    int mid = lef + (rig - lef) / 2;


    if (lef <= rig)
    {
        if (aim < arr[mid])
        {
            rig = mid - 1;
            BinarySearchRecursion(arr, lef, rig, aim);
        }
        else if (arr[mid] < aim)
        {
            lef = mid + 1;
            BinarySearchRecursion(arr, lef, rig, aim);
        }
        else if (aim == arr[mid])
        {
            return mid;
        }

    }
    else
        return -1;

}


int main()
{
    int arr[] = { 1,2,3,5,6, };
    int sz = sizeof(arr)/sizeof(arr[0]);
    int result;

    result = BinarySearchRecursion(arr, 0, sz - 1, 4);

    if (-1 == result)
    {
        printf("Can't find it.\n");
    }
    else
        printf("Aim at %d location\n", result+1);
}

时间复杂度为O(log2 n)
每进行一次递归都会创建变量,所以空间复杂度为O(log2 n)

【数据结构与算法】学习笔记2——算法的时间和空间复杂度分析(附例题) 【本节目标】 什么时时间复杂度和空间复杂度? 如何计算常见算法的时间复杂度和空间复杂度? 例题练习 【引言】 算法的特性 1. 有穷性:一个算法必须在执行有穷步之后结束。且每一步都在有穷时间内完成。 2. 确定性:算法中的每一条指令必须由确切的含义,即在任何条件下,只有唯一的一条执行路径,即对于 相同的属兔只能得到相同的输出。 3. 可行性:算法是可执行的,算法描述的操作可以通过已经实现的基本操作执行有限次来实现。 4. 输... 阅读详情

相关推荐

时间、空间复杂度的例题详解

时间、空间复杂度实例计算,双指针方法解题,根据时间空间复杂度解题

V5Jackeylove的博客 1129

【非常全面和详细】时间复杂度计算-例题集合

自用时间复杂度分析

啊枫 6万+

【MATLAB强化学习工具箱】学习笔记--在Simulink环境中训练智能体Create Simulink Environment and Train Agent

Simulink中便于搭建各类动力学与控制模型,通过将原有的控制器替换为AI控制器,可以方便使用已有模型,提供增量效果。 本节的重点是如何引入Simulink模型作为env,其他的内容在之前的文章中已有说明。 以水箱模型watertank为例,如下图所示: 采用PI控制器,控制效果如下所示: 将此PI控制器替换为神经网络控制器后,系统架构如下图所示: 具体替换策略如下所示: (1)删去PID控制器; (2)增加RL Agent模块; (3)观测器模块: 观测向量为:,其中...

bear_miao的博客 1万+

时间复杂度例题与解析

1.分析以下时间复杂度 void fun(int n) { int i=0,s=0; while(s<n) { ++i; s=s+i; } } 答:n为规模,基本操作语句是++i和s=s+i,while循环处当s>=n不符合条件停止,假设执行m次结束,i=1,2,3..依次渐加,i只影响s值,主要看s, s1 =1, s2 =1+2=3, s3 =1+2+3=6,... sm=1+2+3+...+m=m(m+1)/2 ,正解答案...

qq_64609045的博客 4907

基于FPGA的CORDIC算法实现——Verilog版

目前,学习与开发FPGA的程序员们大多使用的是Verilog HDL语言(以下简称为Verilog),关于Verilog的诸多优点一休哥就不多介绍了,在此,我们将重点放在Verilog的运算操作上。 我们都知道,在Verilog中,运算一般分为逻辑运算(与或非等)与算术运算(加减乘除等)。而在一开始学习Verilog时,老司机一定会提醒我们,“切记,千万别用‘/’除、‘%’取模(有的也叫取余)和‘

善良の一休君的博客 6万+

anaconda安装-超详细版

文章目录一、anaconda安装1.1 anaconda安装地址1.2 安装详细步骤检验安装是否成功更改conda源(后续安装第三方库可以加快速度) 一、anaconda安装 Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。装anaconda,就不需要单独装python了。 anaconda优点: 1、anaconda里面集成了很多关于python科学计算的第三方库,主要是安装方便,而p

in546的博客 25万+

时间复杂度计算例题

时间复杂度计算例题

qq_65556196的博客 2151

保姆级避坑指南:在Ubuntu 22.04上从零编译Autoware.universe(含ROS2 Humble和CUDA配置)

本文提供了一份详细的Autoware.universe编译指南,涵盖Ubuntu 22.04系统优化、ROS2 Humble安装避坑、CUDA配置及Demo运行技巧。通过分步操作和实战经验,帮助开发者高效完成环境搭建,避免常见错误,提升自动驾驶开发效率。

weixin_30642561的博客 347

时间复杂度和空间复杂度详解

时间复杂度和空间复杂度详解 目录1.算法效率2.时间复杂度3.空间复杂度 1.算法效率 算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间,在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机 行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。 2.时间复杂度 1.时间复杂

qq_49613557的博客 1万+

迫零均衡前与迫零均衡后眼图对比附Matlab代码

迫零均衡(Decision Feedback Equalization,DFE)是一种常用的数字通信技术,用于抑制信号传输中的多径干扰。迫零均衡(Decision Feedback Equalization,DFE)是一种常用的数字通信技术,用于抑制信号传输中的多径干扰。眼图是一种常用的信号质量评估工具,通过绘制接收到的信号在时域上的波形,可以直观地观察到噪声、失真和干扰等问题。眼图是一种常用的信号质量评估工具,通过绘制接收到的信号在时域上的波形,可以直观地观察到噪声、失真和干扰等问题。

ByteSparkX的博客 459

黑猫带你学UFS协议第1篇:全网最全UFS协议中文详讲,这份学习框架图,你值得拥有!!!(持续更新中...)

本文由黑猫学长撰写,深入解析UFS协议,覆盖从基础概念到高级特性的全方位教程。适合存储芯片行业从业者和嵌入式开发者,旨在帮助读者快速掌握UFS协议,适用于高端智能手机、平板等智能设备。预计15万字,涵盖UFS 3.1协议,讲解UFS协议栈、物理层、链路层、传输层等内容。

黑猫奥利奥的博客 3687

判断斐波那契递归的时间复杂度和空间复杂度以及例题

了解什么是斐波那契数 以及计算他的时间复杂度和空间复杂度 以及相关例题

wutongguo的博客 2210

【中国大学生计算机设计大赛信息可视化赛道】国奖项目深入剖析—中国古代奇异怪兽移动端可视化应用项目

【中国大学生计算机设计大赛信息可视化赛道】国奖项目深入剖析—中国古代奇异怪兽移动端可视化应用项目 注:本文主要目的是对于往年国奖项目案例-可视化项目的深入剖析讲解,对源码、项目特点、要点、特色继续深入分析。帮助大家学习技术,掌握规律。

一键难忘的博客 3729

算法的时间复杂度、空间复杂度如何比较?

本篇文章讲解了如何求解出时间复杂度和空间复杂度,并且利用他们求解题目。

可涵的博客 3658

GEE APP:基于GEE的红树林监测平台

本文将介绍如何利用Google Earth Engine平台,结合Landsat系列卫星影像和SRTM高程数据,实现红树林分布的动态监测与变化分析。

此星光明博客 160

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

时间复杂度和空间复杂度

时间复杂度和空间复杂度的解释,配套例题加深理解

hu_ju_hong的博客 1177

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

时间复杂度和空间复杂度计算

时间复杂度和空间复杂度计算方法 大O阶方法

m0_58761900的博客 5336

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

时间、空间复杂度详解(带例题)

时间和空间复杂度详细介绍,层层递进,逐步深入

zlz304的博客 2086

详解时间复杂度和空间复杂度

今天的你,学习了吗?敲代码了吗?比昨天有哪些进步? 文章目录1.算法效率1.1 算法的复杂度2.时间复杂度2.1 时间复杂度的定义 1.算法效率 1.1 算法的复杂度 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。 时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行.....

forever的博客 2285

算法的时间复杂度和空间复杂度

算法时间和空间复杂度的分析对比。

2303_81060385的博客 1702

时间复杂度和空间复杂度(含例题讲解)

时间复杂度和空间复杂度前言算法效率时间复杂度1.时间复杂度的概念2.大O的渐进(估算)表示法推导大O阶方法(重点!!!):另外有些算法的时间复杂度存在最好、平均、和最坏情况(重点!!!):3.常见时间复杂度计算举例实例1:实例2:实例3实例4:实例5:空间复杂度1.空间复杂度的概念2.常见空间复杂度计算举例实例1:实例2: 前言 时间复杂度和空间复杂度的求解可以说是所有数据结构初学者所面对的第一个重点,它是衡量一段代码优劣的重要指标。本篇文章博主会详细的向大家介绍求解一段代码时间复杂度和空间复杂度的方法,并

折木的博客 3636

什么是时间复杂度和空间复杂度

先简要介绍一下: 算法复杂度分为时间复杂度和空间复杂度。其作用:时间复杂度是指执行这个算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。时间和空间(即寄存器)都是计算机资源的重要体现,而算法的复杂性就是体现在运行该算法时的计算机所需的资源多少。 时间复杂度: 1:算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好地反映出算法的优劣与否; 2

leikun153的博客 3万+
上一篇: Java基础语法以及Eclipse IDE 的使用
下一篇: Java基础语法之各种循环数组详细介绍
Debug_EDM
博客等级 码龄8年 21粉丝 47原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值