1.时间复杂度与空间复杂度

news2024/9/23 9:24:20

时间复杂度

  • 时间复杂度是用来估算算法运行时间的式子(单位);

  • 一般来说,时间复杂度高的算法比时间复杂度低的算法慢;

  • 常见的时间复杂度(按照算法运行所耗的时间排序)

O(1) < O(logn) < O(n) < O(nlogn) < O(n^2^) < O (n^2^logn) < O(n^3^)


时间复杂度为:O(1) 算法枚举的执行一次或几次

例子1 输出一句
printf("Hello World\n");

例子2 输出三句时间复杂度也是O(1)
printf("Hello jim\n");
printf("Hello jack\n");
printf("Hello kevin\n");

时间复杂度为:O(logn) 算法每次执行都折半,那么该算法循环的次数为以2为底n的对数,即,那么该算法的时间复杂度为O()或写成O(logn)

例子1
int n = 64;
while (n > 1)
{
    n /= 2;
    printf("n = %d\n", n);
}

时间复杂度为:O(n) 算法循环的执行n次

例子1
int n = 100;
for (int i = 0; i < n; i++)
    printf("i = %d\n", i);

时间复杂度为:O(nlogn) 算法循环的执行n次,并每次嵌套内循环,这个内循环每次执行都折半

例子1
int n = 64;
for (int i = 0; i < n; i++)
{
    int temp = n;
    while (temp > 1)
    {
        temp /= 2;
        printf("temp = %d\n", temp);
    }
}

时间复杂度为:O(n^2^) 算法循环执行n次,并每次嵌套内循环,这个内循环每次执行n次

例子1
for (int i = 0; i < n; i++)
{
    printf("i = %d\n", i);
    for (int j = 0; j < n; j++)
        printf("j = %d\n", j); 
}

时间复杂度为:O(n^2^logn) 算法循环执行n次,并每次嵌套内循环,这个内循环每次执行n次,并这个内循环再嵌套一个内循环,并且这个内循环每次执行折半

例子1
int k = 64;
for (int i = 0; i < n; i++)
{
    printf("i = %d\n", i);
    for (int j = 0; j < n; j++)
    {
        printf("j = %d\n", j);
        int temp = k;
        while (temp > 1)
            temp /= 2;
    } 
}

时间复杂度为:O(n^2^logn) 算法循环执行n次,并每次嵌套内循环,这个内循环每次执行n次,并这个内循环再嵌套一个内循环,并且这个内循环每次执行n次

例子1
for (int i = 0; i < n; i++)
{
    printf("i = %d\n", i);
    for (int j = 0; j < n; j++)
    {
        printf("j = %d\n", j);
        for (int k = 0; k < n; k++)
            printf("k = %d\n", k);
    } 
}

空间复杂度

  • 空间复杂度是用来估算算法内存占用大小的式子(单位);

  • 空间复杂度的表示方式跟时间复杂度完全一样

  1. 算法使用了一个或几个变量,空间复杂度为:O(1)

  1. 算法使用了长度为n的一维列表,空间复杂度为:O(n)

  1. 算法使用了长度为m行n列的二维列表,空间复杂度为:O(mn)

  1. 算法使用了j个长度为m行n列的二维列表,空间复杂度为:O(jmn)

  1. 算法使用了i个三维列表,并每个三维列表有j个长度为m行n列的二维列表,空间复杂度为:O(ijmn)


空间复杂度为:O(1)

例子1 该算法只在栈中开辟了n这3个变量,所以空间复杂度为O(1)
int n = 1;

例子2 该算法只在栈中开辟了m,n,k这3个变量,所以空间复杂度为O(1)
int m = 1;
int n = 1;
int k = 1;

例子3 该算法只在栈中开辟了i,j,temp这3个变量,所以空间复杂度为O(1)
void sort_arr(int *const arr, const int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = i + 1; j < n; j++)
        {
            if (arr[i] > arr[j])
            {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

ending😃

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

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

相关文章

面试半年,总结了1000道2023年Java架构师岗面试题

半年前还在迷茫该学什么&#xff0c;怎样才能走出现在的困境&#xff0c;半年后已经成功上岸阿里&#xff0c;感谢在这期间帮助我的每一个人。 面试中总结了1000道经典的Java面试题&#xff0c;里面包含面试要回答的知识重点&#xff0c;并且我根据知识类型进行了分类&#xf…

Vue组件间通信方式超详细(父传子、父传后代、子传父、后代传父、兄弟组件传值)

一、父传子、父传后代 方式一&#xff1a;子通过props来接收 父组件&#xff1a;父组件引入子组件时&#xff0c;通过<child :parentValue "parentValue"></child>子组件传值。 备注&#xff1a;这种方式父传值很方便&#xff0c;但是传递给后代组件不…

高燃!GitHub上标星75k+超牛的Java面试突击版

前言不论是校招还是社招都避免不了各种面试。笔试&#xff0c;如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的&#xff0c;我这个有章可循‘说的意思只是说应对技术面试是可以提前准备。运筹帷幄之后&#xff0c;决胜千里之外!不打毫无准备的仗,我觉得大…

电子科技大学软件工程期末复习笔记(四):软件设计

目录 前言 重点一览 软件工程设计 软件设计定义 软件设计包含的两类活动 软件设计包涵 软件的质量属性 各种设计技术 程序结构(深度、宽度、扇入、扇出) 完整的设计规格 软件体系架构 用户界面设计的3条原则 用户界面设计的3种分析 结构化设计方法 结构化程序设…

linux所需的pcre库和zlib库从网上下载的步骤

在linux服务器安装Nginx的时候需要下载一些依赖的库,其中就有pcre 和 zlib正常情况下执行如下命令就可以了yum install -y pcre pcre-develyum install -y zlib zlib-devel但是有时候会有各种原因报错,你可以选择去解决,也可以换个思路,那么我不从yum源下载了,直接从网上下载所…

PGLBox 超大规模 GPU 端对端图学习训练框架正式发布

作者 | PGLBox项目组 导读 PGLBox是百度研发的基于GPU的大规模图模型训练框架&#xff0c;支持数百亿节点和边的图模型全GPU训练&#xff0c;已在百度广泛部署。相比业界主流的分布式 CPU 解决方案&#xff0c;PGLBox 具有超高性能、超大规模、算法丰富、灵活易用、落地广泛等优…

springBoot 处理静态资源原理

springBoot是如何自动处理静态并映射静态资源的&#xff0c;直接上代码。 一、在springBoot autoconfigure jar包中&#xff0c;存在WebMvcAutoConfiguration 自动配置类&#xff0c;该类的生效条件是&#xff1a;存在Servlet ,DispatcheServlet ,WebMvcConfigurer这三个类…

k8s 配置ingress 并做一个demo

需求&#xff1a;k8s 配置好之后除了 nodeport 以外都是对集群内部的行为使用nodeport 并不是很友好&#xff0c;要自己处理很多的端口管理使用ingress 可以更好的整合配置服务进程&#xff1a;下载ingress-nginx 的yaml 文件https://github.com/kubernetes/ingress-nginx/blob…

京东HBase异地多活调研

京东HBase平台架构 HBase Replication原理 HBase的Replication是基于WAL日志文件的&#xff0c;在主集群中的每个RegionServer上&#xff0c;由ReplicationSource线程来负责推送数据&#xff0c;在备集群的RegionServer上由ReplicationSink线程负责接收数据。ReplicationSourc…

Web自动化测试框架Selenium

作者&#xff1a;霍格沃兹测试开发学社 链接&#xff1a;https://www.zhihu.com/question/59854292/answer/2827875817 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 什么是自动化测试 自动化测试就是&#xff0…

电子技术——AB类输出阶

电子技术——AB类输出阶 原理 交越失真可以通过通过一个较小的偏置电流解除&#xff0c;如下图&#xff1a; QNQ_NQN​ 和 QPQ_PQP​ 的基极之间存在偏置电压 VBBV_{BB}VBB​ 。对于完美匹配的晶体管&#xff0c;当 vI0v_I 0vI​0 的时候&#xff0c;此时 vO0v_O 0vO​0 。每…

初识CSS

1.CSS语法形式CSS基本语法规则就是:选择器若干属性声明由选择器选择一个元素,其中的属性声明就作用于该元素.比如:<body><p>这是一个段落</p><!-- style可以放在代码的任意地方 --><style>p{/* 将字体颜色设置为红色 */color: red;}</style&g…

Android 动画详解

Android动画的分类与使用学习Android必不可少的就是动画的使用了&#xff0c;在Android版本迭代的过程中&#xff0c;出现了很多动画框架&#xff0c;这里做一个总结。Android动画类型分类逐帧动画【Frame Animation】&#xff0c;即顺序播放事先准备的图片。补间动画【Tween A…

Mysql——双机同步

遇到一个需求&#xff0c;需要两台服务器的上的mysql数据库数据实时同步&#xff0c;包括结构也同步。 利用mysql本身的binlog确实实现了这个效果&#xff0c;但是因为个实际业务场景不满足&#xff0c;所以pass掉了&#xff0c;但是记录一下。 目录一、环境二、配置2.1 创建同…

件测试之易用性测试

一、易用性测试概述我们所说的易用性测试是指软件界面的测试&#xff0c;而对于产品的易用性来说&#xff0c;不仅仅是软件界面&#xff0c;还包括硬件(即产品的外观)&#xff0c;如按钮图标是否易懂、菜单是否易找到等。易用性主要研究3个方向&#xff1a;用户研究、交互设计、…

【使用两个队列实现栈】

文章目录前言使用两个队列实现栈1.队列接口函数引入2.栈的初始化3.向栈中插入元素4.出栈操作5.取出栈顶元素6.判断栈是否为空7.释放内存空间总结前言 本文章主要介绍栈和队列的相互转换。 使用两个队列实现栈 我们知道&#xff0c;栈的特点是后进先出&#xff0c;而队列的特点…

[工具笔记]1.UnityEngine.Plane

public struct Plane : IFormattable{} Plane是存在于 3D 空间中&#xff0c;无限大的平坦表面&#xff0c;将空间划分为两半&#xff08;称为半空间&#xff09;。可方便地确定特定点处于两个半空间的哪一个中&#xff0c;以及确定该点与平面相距多远。 此对象在unity并不可见…

一分钟掌握技术术语:API(接口)

很多产品经理在项目开发过程中经常听到&#xff1a;你调我这个接口就好了&#xff1b;这个功能你写个接口给我&#xff1b;有什么不懂的就看下API接口文档。 开发经常说的接口是什么意思呢&#xff1f;术语解释&#xff1a;API&#xff08;Application Programming Interface&…

【C++】泛型编程——模板初阶

文章目录1. 泛型编程2. 函数模板2.1 函数模板的概念2.2 函数模板的使用2.3 函数模板的原理2.4 函数模板的实例化隐式实例化显式实例化2.5 模板参数的匹配原则3. 类模板1. 泛型编程 首先我们来思考一个问题&#xff1a;如何实现一个通用的交换函数呢&#xff1f; 即我们想交换两…

神经网络中的激活函数

文章目录为什么要使用激活函数常用的激活函数如何选择激活函数ReLU激活函数的优点及局限性为什么Sigmoid和Tanh会导致梯度消失的问题为什么Tanh收敛速度⽐Sigmoid快&#xff1f;为什么要使用激活函数 在真实情况中&#xff0c;我们往往会遇到线性不可分问题&#xff0c;需要非…