数据结构基础--复杂度计算

2023-11-11

一、算法的复杂度

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。


时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,计算机的存储容呈很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。
 

二、时间复杂度

时间复杂度的定义:在计算机科学中,(算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算田来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。
 

大O表示法:算法的时间复杂度通常用大O符号表述,定义为T[n] = O(f(n))。称函数T(n)以f(n)为界或者称T(n)受限于f(n)。 如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n)。T(n)称为这一算法的“时间复杂度”。当输入量n逐渐加大时,时间复杂度的极限情形称为算法的“渐近时间复杂度”。

推导大O阶方法:

1.用常数1取代运行时间中所有的加法常数

2.在修改后的运行次数函数中,只保留最高阶项,其他项对结果的影响不大

3.如果最高阶项存在,且不是1,则去除与这个项相乘的常数,也就是不要系数

 

 

 算法的时间复杂度存在最好、平均和最坏情况,这里用在长度为N的数组中搜索x举例

最好情况:任意输入规模的最少运行次数(上界),1次找到

平均情况:任意输入规模的期望运行次数,2/N次找到

最坏情况:任意输入规模的最大运行次数(下界),N次找到

假设数组为acdhegfs。如果逐个遍历,查找a一次就能找到,查找h四次就能找到,查找s八次才能找到; 

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 void Swap(int* a,int* b)
 {
     int c=*a;
     *a=*b;
     *b=c;
 }
int* sortArray(int* nums, int numsSize, int* returnSize)
{
    for(int i=0;i<numsSize;i++)
    {
        int if_finish=0;
        for(int j=1;j<numsSize-i;j++)
        {
            if(nums[j-1]>nums[j])
            {
                Swap(&nums[j-1],&nums[j]);
                if_finish=1;
            }
        }
        if(if_finish==0)
        {
            break;
        }
    }
    *returnSize=numsSize;
    return nums;
}

对于如上的冒泡排序,第一个元素要对比N-1次,第二个元素对比N-2次,以此类推,第k个元素对比N-k次,最后一个元素对比1次。将所有的对比次数求和,等差数列求和为N*(N-1)/2,所以时间复杂度为O(N^2) 

如上图所示的二分查找法,对有序的数组进行查找,假设数组是递增的,每次查找,查找区间缩小一半,直到最后只剩一个数字,也就是查找的数字。假设查找m次,那么N=1*2*2*2*2……,N=2^m次,m=log2(N),2为底数 

递归时间复杂度:每次递归调用执行次数累加

如上图所示的阶乘, Fac(N)+Fac(N-1)+Fac(N-2)+……+Fac(1),总共是N个递归函数调用,所以时间复杂度为O(N)

如上图所示的阶乘内部带循环, Fac(N)+Fac(N-1)+Fac(N-2)+……+Fac(1),总共是N个递归函数调用,第一次调用内部循环N次,第二次调用内部循环N-1次,第k次调用内部循环N-k次,第N次调用内部循环1次。所以是等差数列求和,N+(N-1)+(N-2)+(N-3)+……+1。也就是N*(N-1)/2。时间复杂度为O(N^2)

如上图所示的斐波那契数列 ,总共调用了2^0+2^1+2^2+……+2^(N-2)=2^(N-1)-1,等比数列求和,所以时间复杂度为O(2^N)

三、空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度
空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。
注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

空间复杂度为O(1) 


冒泡排序的空间复杂度为O(1) 

阶乘的空间复杂度为O(N),因为每次调用都会开辟一块新的空间, Fac(N)+Fac(N-1)+Fac(N-2)+……+Fac(1),总共是N个递归函数调用,所以空间复杂度为O(N)

如上图所示的斐波那契数列,用malloc开辟了n+1块大小为sizeof(long long)的空间,所以空间复杂度为O(N)

 递归的斐波那契数列,由于函数调用的栈帧不能无限创建,如果N过大程序会报错。空间可以重复利用,所以总共开辟了Fib(N)+Fib(N-1)+Fib(N-2)+……+Fib(1),总共开辟了N个空间,所以空间复杂度为O(N)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构基础--复杂度计算 的相关文章

随机推荐

  • DigitalOcean 的技术写作指南

    DigitalOcean 很高兴能够继续构建与服务器管理和软件工程相关的技术文章集 为了确保 DigitalOcean 文章具有一致的质量和风格 我们制定了以下准则 本指南分为四个部分 Style 我们编写技术教程的高级方法 结构 对我们的
  • 如何使用 Vanilla JavaScript 和 HTML 创建拖放元素

    介绍 拖放是一种常见的用户交互 您可以在许多图形用户界面中找到它 有预先存在的 JavaScript 库可用于向您的应用程序添加拖放功能 但是 在某些情况下 库可能不可用 或者会引入项目不需要的开销或依赖项 在这些情况下 了解现代 Web
  • 如何在 Ubuntu 18.04 上安装 Apache Tomcat 9

    介绍 Apache Tomcat 是一个 Web 服务器和 servlet 容器 用于为 Java 应用程序提供服务 Tomcat 是 Java Servlet 和 JavaServer Pages 技术的开源实现 由 Apache Sof
  • 如何在 Apache Web 服务器中安装、配置和使用模块

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级
  • 如何使用 Python 调试器

    介绍 在软件开发中 调试是查找并解决阻止软件正常运行的问题的过程 Python调试器为Python程序提供了调试环境 它支持设置条件断点 一次一行单步执行源代码 堆栈检查等 先决条件 您应该在计算机或服务器上安装 Python 3 并设置编
  • 如何在 Apache 上为 Debian 8 创建 SSL 证书

    介绍 本教程将引导您完成使用 SSL 证书保护的 Apache 服务器的设置和配置 在本教程结束时 您将拥有一个可通过 HTTPS 访问的服务器 SSL 基于将大整数解析为其同样大的质因数的数学难题 使用它 我们可以使用私钥 公钥对来加密信
  • 如何在 DigitalOcean 上使用 WordPress 一键安装

    介绍 WordPress是世界上最受欢迎的内容管理和博客平台之一 可让您高效地创建和管理网站内容 本教程将指导您使用以下命令设置 WordPress 网站WordPress 一键式应用程序 一键部署 除了常规 Ubuntu 20 04 Dr
  • localStorage和sessionStorage简介

    介绍 The localStorage and sessionStorage对象是 Web 存储 API 的一部分 是用于在本地保存键 值对的两个出色工具 使用localStorage and sessionStorage用于存储是使用 c
  • vue 遍历目录下的文件,获取图片名并直接遍历渲染

    使用场景 搭了个资源网站 想直接遍历显示当前图片目录下的所有图片 但是图片名字乱七八糟花里胡哨 举例说明获取目录下的文件名 新创建一个 vue 项目 获取 views 目录下的以 vue 结尾的文件的文件名 mounted 参数 1 路径
  • web安全漏洞总结

    目录 一 网络安全常见漏洞 1 sql注入漏洞 漏洞解释与形成原因 漏洞分类 漏洞存在常见地方 漏洞利用 漏洞防御 攻击流量特征 绕开waf拦截的常用方法 2 文件上传漏洞 漏洞解释与形成原因 漏洞利用 漏洞存在常见地方 漏洞防御 绕开wa
  • 各类常用符号

    常用符号 1 几何符号 2 代数符号 3 运算符号 如加号 减号 乘号 或 除号 或 两个集合的并集 交集 根号 对数 log lg ln 比 微分 dx 积分 曲线积分 等 4 集合符号 5 特殊符号 圆周率 6 推理符号 a
  • 项目环境由pytorch1.10升级1.11中间要改的东西

    1 THC THCDeviceUtils cuh 该文件弃用 nightly missing THC THCDeviceUtils cuh include
  • VMware中CentOS7.5 启用NAT模式配置静态IP连接外网

    1 在cmd中查看本机VMnet8的ipv4地址及子网掩码 C gt ipconfig 2 在VMware里 依次点击 编辑 虚拟网络编辑器 如下图 选择NAT模式 3 取消勾选 使用本地DHCP服务将IP分配给虚拟机 这个选项 配置子网i
  • STM32与BLE蓝牙通信 Android APP配置(二)

    事务的难度远远低于对事物的恐惧 0 前言 在 Android BLE蓝牙配置全流程 一 附APP源码 中已经完成了前期的准备工作 在这里我们得到了需要连接的蓝牙设备的名字和地址 需要完成蓝牙设备的连接和数据传输功能 1 初始化界面 首先需要
  • 成都瀚网科技:抖音发作品到底需要多久的时间才能够给流量呢?

    如果在抖音平台上面发作品 那自然也需要先去了解一下抖音发作品到底应该要怎么做才能够火 另外也要清楚抖音发作品到底需要多久的时间才能够给流量呢 1 视频时长 注意视频时长问题 一般抖音用户 只能上传60秒内的视频 但严格意义上 抖音最喜欢的是
  • 2.1.1 匹配位置的元字符

    匹配位置的元字符包括 3 个字符 和 b 其中 脱字符号 通常在文章中插入字时使用 和 美元符号 都匹配一个位置 它们分别匹配行的开始和结尾 以下正则表达式匹配以 String 开头的行 即被匹配的行的第一个字符串为 String Stri
  • vue2中的mixin

    1 什么是Mixin混入 混入 Mixin 是 Vue js 中用于复用部分组件逻辑的一种技术 通过混入 你可以将组件的方法 生命周期钩子 甚至 data 都进行复用 混入的基本工作原理是把一个特定的对象 混入 到另外一个对象之中 如方法
  • Open3D——KITTI数据集.bin文件批量转.pcd点云

    目录 一 概述 二 代码实现 三 结果展示 四 批量转换 一 概述 之前的文章python KITTI数据集 bin转 pcd txt并可视化已经对Open3D进行 bin文件读取进行了简要的代码实现 本文给出使用Open3D进行 bin文
  • 【Linux问题】Linux修改文件出现错误E45:“readonly” option is set(add ! to override)退出不了vim

    出现这种错误时会退出不了vim 那么出现这种错误的原因有 1 该错误为当前用户没有权限对文件修改 2 该文件没有正确保存退出 正在打开状态 关闭后再保存 3 若该文件所有都关闭 提示有的人没有关闭 则删除该文件的临时文件则可正常打开 修改
  • 数据结构基础--复杂度计算

    一 算法的复杂度 算法在编写成可执行程序后 运行时需要耗费时间资源和空间 内存 资源 因此衡量一个算法的好坏 一般是从时间和空间两个维度来衡量的 即时间复杂度和空间复杂度 时间复杂度主要衡量一个算法的运行快慢 而空间复杂度主要衡量一个算法运