时间(空间)复杂度(结构篇)

news2024/12/23 18:40:11

目录

前言:

一、时间复杂度

1.1 时间复杂度的定义

1.2 时间复杂度的分析

表示方法: 

1.3 常见的时间复杂度

1.4 时间复杂度的计算以及简单的分析

冒泡排序

折半查找(二分查找)

斐波那契数列(递归)

二、空间复杂度

2.1 空间复杂度的定义

2.2 空间复杂度的分析

2.3 常见的空间复杂度

2.4 空间复杂度的计算以及简单分析

冒泡排序

斐波那契数列(迭代)


复杂度是计算机科学中的一个基础概念,它帮助我们理解和评估算法的效率,对于算法设计和优化至关重要。算法的复杂度通常分为时间复杂度和空间复杂度两个方面。

前言:

众所周知:程序 = 算法  + 数据结构;衡量一个算法的标准就是算法效率。那么,算法效率是指算法执行的时间和所需的存储空间。在计算机科学中,算法效率通常通过时间复杂度空间复杂度来衡量。

一、时间复杂度

1.1 时间复杂度的定义

  • 时间复杂度是衡量算法执行时间随输入规模增长而变化的度量,它指示了算法的效率和性能。
  • 时间复杂度通常使用大O符号(O)来表示,表示算法执行时间的上界。
  • 时间复杂度描述的是算法执行时间与输入规模的增长趋势,而不是具体的执行时间。

1.2 时间复杂度的分析

表示方法: 

大O 的表示法:是用于描述函数渐进行为的数学符号。

算法中的基本操作的执行次数,为算法 的时间复杂度。随着问题规模 n 的伴随某个函数f(n)变话记作:  T(n) = O(f(n)) 

  • 一般的忽略常数项。
  • 只保留最高次幂项。

注意:我们通常表示的是一个数量级,而不是具体值或某个函数。

1.3 常见的时间复杂度

  • 常数时间复杂度:O(1),表示算法的执行时间不随输入规模的增长而变化,是最理想的情况。 
  • 对数时间复杂度:O(log n),通常出现在二分查找等分治算法中。 
  • 线性时间复杂度:O(n),表示算法的执行时间与输入规模成正比。 
  • 线性对数时间复杂度:O(n log n),通常出现在快速排序、归并排序等分治算法中。 
  • 平方时间复杂度:O(n^2),通常出现在嵌套循环的算法中。 
  • 指数时间复杂度:O(2^n),通常出现在递归算法中。 
  • 多项式时间复杂度:O(n^k),k可能是大于 2 的正整数,这意味着算法在大规模数据上的性能下降较快。

1.4 时间复杂度的计算以及简单的分析

通过分析算法中基本操作的执行次数,并根据输入规模的增长情况确定时间复杂度。

三种情况:

  • 最好时间复杂度
  • 平均时间复杂度
  • 最坏时间复杂度
冒泡排序
// 计算BubbleSort的时间复杂度?
void BubbleSort(int* a, int n)
{
     assert(a);
      for (size_t end = n; end > 0; --end)
     {
         int exchange = 0;
     for (size_t i = 1; i < end; ++i)
         {
             if (a[i-1] > a[i])
             {
             Swap(&a[i-1], &a[i]);
             exchange = 1;
             }
         }
     if (exchange == 0)
     break;
     }
}

 分析:冒泡排序的时间复杂度:O(N^2)

解释:有N个个数,每次移动N-1次,剩下(N-1)移动(N-2)次,总共执行(N*(N-1)/2)次,根据大O表示就是:

折半查找(二分查找)
// 计算BinarySearch的时间复杂度?
int BinarySearch(int* a, int n, int x)
{
    assert(a);

    int begin = 0;
    int end = n - 1;
    while (begin < end)
    {
        int mid = begin + ((end - begin) >> 1);
        if (a[mid] < x)
            begin = mid + 1;
        else if (a[mid] > x)
            end = mid;
        else
            return mid;
    }

    return -1;
}

分析:折半查找的时间复杂度:最好是O( 1 ) ,最坏是O( log N ) ,该式表示:以2为底N的对数(仅限在计算机中表示)

解释:在查找的时候每次折半,也就是除以 2,一次是2^1,两次是 2^2,推广到N次数。

斐波那契数列(递归)
// 计算斐波那契递归Fib的时间复杂度?
long long Fib(size_t N)
{
    if (N < 3)
        return 1;

    return Fib(N - 1) + Fib(N - 2);
}

分析:斐波那契数列时间复杂度:O(2^n)

解释:

二、空间复杂度

2.1 空间复杂度的定义

  • 空间复杂度(Space Complexity)是衡量算法在执行过程中临时占用存储空间大小的量度。
  • 它反映了算法所需存储空间与输入数据大小之间的关系。
  • 空间复杂度通常用大O表示法来表示。

2.2 空间复杂度的分析

同时间复杂度一样用大O表示法表示;也是表示一个数量级。记作:S(n) = O(f(n)) 

2.3 常见的空间复杂度

  • 常数阶:如果算法的空间复杂度不随问题规模 n 的变化而变化,即算法所需的存储空间是一个常数,那么空间复杂度为 O(1)。
  • 线性阶:如果算法所需的存储空间与问题规模 n 成正比,即算法所需的存储空间随着 n 的增加而线性增加,那么空间复杂度为 O(n)。
  • 多项式阶:如果算法所需的存储空间与问题规模 n 的关系可以表示为多项式函数,即空间复杂度为 O(n^k),其中 k 是一个正整数。
  • 对数阶:如果算法所需的存储空间与问题规模 n 的关系可以表示为对数函数,即空间复杂度为 O(log n)。
  • 指数阶:如果算法所需的存储空间与问题规模 n 的关系可以表示为指数函数,即空间复杂度为 O(2^n)。

2.4 空间复杂度的计算以及简单分析

计算空间复杂度时,需要考虑算法在运行过程中显式申请的额外空间,而不是函数运行时所需要的栈空间,后者在编译期间已经确定好了

冒泡排序
// 计算BubbleSort的时间复杂度?
void BubbleSort(int* a, int n)
{
     assert(a);
      for (size_t end = n; end > 0; --end)
     {
         int exchange = 0;
     for (size_t i = 1; i < end; ++i)
         {
             if (a[i-1] > a[i])
             {
             Swap(&a[i-1], &a[i]);
             exchange = 1;
             }
         }
     if (exchange == 0)
     break;
     }
}

分析:冒泡排序空间复杂度:O(1)

解释:仅仅使用了一个额外变量。

斐波那契数列(迭代)
// 计算Fibonacci的空间复杂度?
// 返回斐波那契数列的前n项
long long* Fibonacci(size_t n)
{
    if (n == 0)
        return NULL;

    long long* fibArray = (long long*)malloc((n + 1) * sizeof(long long));
    fibArray[0] = 0;
    fibArray[1] = 1;
    for (int i = 2; i <= n; ++i)
    {
        fibArray[i] = fibArray[i - 1] + fibArray[i - 2];
    }

    return fibArray;
}

分析:斐波那契数列空间复杂度:O( N )

解释:开辟了N个空间。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android卡顿丢帧低内存与adb shell内存状态

Android卡顿丢帧低内存与adb shell内存状态 卡顿丢帧除了CPU/GPU层面&#xff0c;另外&#xff0c;也需要特别注意整机低内存情况。kswapd0 是一个内核工作线程&#xff0c;内存不足时会被唤醒&#xff0c;做内存回收工作。 当内存频繁在低水位的时候&#xff0c;kswapd0 会被频…

人类最友好语言? YAML 深入解析:从语法到最佳实践

什么是YAML YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种人类可读的数据序列化语言。它的设计目标是使数据在不同编程语言之间交换和共享变得简单。YAML采用了一种简洁、直观的语法&#xff0c;以易于阅读和编写的方式表示数据结构。 YAML广泛应用于配置文…

C语言题目-添加逗号(详解)

前言 今天来看看如何使用C语言对一串数字添加逗号吧&#xff0c;在我们电子账户上的余额都是每3位数有一个逗号吧&#xff0c;今天让我们来使用C语言实现这个功能。 题目描述 对于一个较大的整数 N(1<N<2,000,000,000) 比如 980364535&#xff0c;我们常常需要一位一位数…

8、Qt—Log4Qt使用小记2(每日产生文件)

前言&#xff1a; 开发平台&#xff1a;Win10 64位 开发环境&#xff1a;Qt Creator 13.0.0 构建环境&#xff1a;Qt 5.15.2 MSVC2019 64位 例如&#xff1a;上一篇文章中笔者记录了Log4qt的编译及配置使用&#xff0c;这篇文章重点写下每天产生文件到指定文件夹中&#xff0c;…

软考高级架构师:数据库案例篇 - ER 图和数据流图

一、讲解 从数据流图&#xff08;DFD&#xff09;转换为实体关系图&#xff08;ER图&#xff09;是一个重要的步骤&#xff0c;可以帮助将系统的动态流程转换为静态的数据模型。以下是一些经验和步骤&#xff0c;帮助你完成这一过程&#xff1a; 1. 理解数据流图 识别进程&a…

【操作系统】基本概念 解析+思维导图(特征、概念、功能)并发 共享 虚拟 异步

1.操作系统基本概念 思维导图 1.1 概念和功能 概念 操作系统&#xff08;Operating System&#xff0c;OS&#xff09; 1.操作系统是系统资源的管理者&#xff1a; ​ 操作系统是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理组织调度计算机的工作和资源分…

跟TED演讲学英文:How to escape education‘s death valley by Sir Ken Robinson

How to escape education’s death valley Link: https://www.ted.com/talks/sir_ken_robinson_how_to_escape_education_s_death_valley Speaker: Sir Ken Robinson Date: April 2013 文章目录 How to escape educations death valleyIntroductionVocabularySummaryTranscri…

redis6.2.7安装

1、下载上传到服务器 从官下载redis&#xff0c;地址 https://redis.io/download/#redis-downloads 然后上传到服务器目录 app/apps目录下 2、安装gcc编译器 使用gcc --version命令测试是否已经安装了gcc编译环境&#xff0c;如果没有安装执行以下命令安装 yum install -y …

2024系统架构师软考考题考点回忆版

2024系统架构师软考试题/考点梳理 选择题 (75道单选题) 软件测试(P205) 静态测试:是被测程序不运行,只依靠分析和检查源程序的语句、结构、过程来检查程序是否有错误。动态测试:运行被测试程序,对得到的结果与预期的结果进行比较分析,同时分析运行效率和健壮性能等。…

人力资源新趋势:RPO项目为何成为企业招聘首选?

随着市场竞争的加剧和人才需求的日益复杂化&#xff0c;企业对于高效、精准的招聘需求越来越迫切。在这样的背景下&#xff0c;人力RPO(招聘流程外包)项目应运而生&#xff0c;其独特的优势为企业带来了全新的招聘体验和效果。 首先&#xff0c;人力RPO项目能够显著降低企业的招…

python-情报加密副本

【问题描述】某情报机构采用公用电话传递数据&#xff0c;数据是5位的整数&#xff0c;在传递过程中是加密的。加密规则如下&#xff1a;每位数字都加上8,然后用和除以7的余数代替该数字&#xff0c;再将第1位和第5位交换&#xff0c;第2位和第4位交换。请编写程序&#xff0c;…

MySQL数据处理增删改

数据处理增删改DML 由于约束&#xff0c;以下操作都有可能执行失败&#xff08;后面讲约束&#xff09; 插入数据 INSERT 基础添加&#xff1a;VALUES 值的顺序必须和表中字段顺序相同 INSERT INTO class VALUES(1,王小,10); 向指定字段添加&#xff1a; 值的顺序和指定…

【QGIS入门实战精品教程】10.7: 基于DEM的地形因子分析(坡度、坡向、粗糙度、山体阴影、耐用指数)

文章目录 一、加载dem二、山体阴影三、坡度四、坡向五、地形耐用指数六、地形位置指数七、地表粗糙度一、加载dem 二、山体阴影 方法一:符号系统 利用符号系统中的山体阴影,渲染出阴影效果。 方法二:山体阴影工具 该算法计算输入中的数字化地形模型的山体阴影。根据太阳的位…

C++第十九弹---string模拟实现(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、修改操作 2、迭代器操作 3、字符串操作 4、非成员函数重载操作 总结 1、修改操作 1、string& operator (const char* s); //尾部插入…

科林Linux6_网络

#include<sys/socket.h> #include<arpa/inet.h> //大小端转换 #include<netdb.h> //DNS一、Socket套接字 为了开发网络应用&#xff0c;系统提供一套API函数接口&#xff0c;用于网络应用开发&#xff0c;这些接口称为套接字函数 struct sockaddr_in…

【STM32】计算定时器的溢出

TIM2、3、4、5、12、13、14在APB1上&#xff0c;最大计数频率84M。 TIM1、8、9、10、11在APB2上&#xff0c;最大计数频率168M。 time(arr1)/(prescale1)/Tclk 算出来的是秒 下图使用TIM14 84MHz 那么time33600*25000/8400000010S&#xff0c;10S进入一次中断 中断方式开…

【脚本篇】---spyglass lint脚本

目录结构 sg_lint.tcl &#xff08;顶层&#xff09; #1.source env #date set WORK_HOME . set REPORT_PATH ${WORK_HOME}/reports puts [clock format [clock second] -format "%Y-%m-%d %H:%M:%S"] #2.generate source filelist #3.set top module puts "##…

BFS 解决最短路问题

目录 一、前言 1.1 如何使用 BFS 找到最短路&#xff1a; 1.2 为什么不用 dfs &#xff1a; 二、模板套路 三、例题练习 3.1 例题1&#xff1a;迷宫中离入口最近的出口 3.2 例题2&#xff1a;最小基因变化 3.3 例题3&#xff1a;单词接龙 3.4 例题4&#xff1a;为高尔…

Springboot+Vue+ElementUI开发前后端分离的员工管理系统01--系统介绍

项目介绍 springboot_vue_emp是一个基于SpringbootVueElementUI实现的前后端分离的员工管理系统 功能涵盖&#xff1a; 系统管理&#xff1a;用户管理、角色管理、菜单管理、字典管理、部门管理出勤管理&#xff1a;请假管理、考勤统计、工资发放、工资统计、离职申请、个人资…

低频量化周报(指数分位值,指数风险溢价比,配债完整数据集,可转债策略)...

低频量化周报&#xff08;2024-05-25&#xff09; 指数分位值指数风险溢价比小规模配债<5亿配债完整数据 5 批文通过4 发哥通过3 交易所受理2 股东大会通过1 董事会预案可转债策略 双低策略四因子策略网格策略ETF抄底指标<3历史操作记录本周心得最后 指数分位值 指数名称…