算法学习笔记——时间复杂度和空间复杂度

news2025/1/24 2:27:39

时间复杂度和空间复杂度

常数操作:

  • 固定时间的操作,执行时间和数据量无关

  • 位运算 > 算数运算 > 寻址 > 哈希运算,都是常数操作,哈希运算操作时间最慢

  • 链表的get(i)方法不是常数操作,因为链表不是连续的存储空间,靠着指针链接着,要靠头节点一个个的往下查,是一定要查找这么多个数的

  • 例如:

    int a=3, b=5相加的时间和int a=3000万,b=20亿相加的时间差不多

    寻址中拿到a[1007]和a[1007万]时间也是差不多,因为是靠偏移量来查找的

时间复杂度:

  • 一个和数据量有关、只要高阶项、不要低价项、不要常数项的操作次数的表达式
  • O(...)表示趋向那个级别的规模
  • 忽略常数项原因:当N->无穷时常数项已经不重要了,例如:y = x^2, y = k*x,无论K多大,最终x^2的曲线最终会超过k*N的直线
  • 忽略低价项的原因:影响整体级别的规模是高阶项
  • 选择排序,是(0~N-1),到(1~N-1),再到(2~N-1)等,所以是N+(N-1)+(N-2)+(N-3)+...+1,这是一个等差数列,首项是1,公差是1,因为只要高阶项,所以时间复杂度是O(n^2),冒泡排序也类似

等差数列求和公式:

S = n / 2 * (2 * a1 + (n - 1) * d)

其中,S是等差数列的和;n是项数;a1是首项;d是公差。

也可以认为任何等差数列的都符合:

a * n^2 + b * n + c,其中a、b、c都是常数

  • 严格固定流程的算法,一定要强调最差情况!比如插入排序
  • 算法流程上利用随机行为作为重要部分的,要看平均或者期望的时间复杂度,因为最差的时间复杂度无意义,比如:生成相邻值不同的数组,从[0~3]之间中随机出来,组成相邻值不同的数组,单次随机为O(1),最差情况为O(无穷)当数组第一个数是1,后面一直随机出来是1那就无法形成符合要求的数组,则获取出来的时间复杂度无意义。这期望的时间复杂度是O(n)。、
  • 时间复杂度的内涵:描述算法运行时间和数据量大小的关系,而且当数据量很大很大时,这种关系相当的本质,并且排除了低价项、常数时间的干扰

空间复杂度:

  • 强调额外空间;常数项时间,放弃理论分析、选择用实验来确定,因为不同常数操作的时间不同
  • 与入参和出参的空间无关,比如:通过设计一个算法完成这个功能,如果没有申请额外的空间去进行操作,则空间复杂度为O(1),如果申请了一个长度为N的辅助数组,则则空间复杂度为O(N)

最优解:

  • 先满足时间复杂度最优,然后尽量少用空间的解

时间复杂度的均摊:

  • 涉及动态数组,先申请一个固定大小的数组,当数组不够用时,再申请一个相应倍数的数组,把旧数组中的值拷贝到旧数组中,一共加入了N个数总代价,单次调用是O(1)
    在这里插入图片描述

  • 因为一次扩容后可能很久不会再扩容了,每次都计算整体的复杂度太麻烦就把每次扩容能分摊到的时间复杂度进行计算,看整个过程调用了多少次来估计整体的时间复杂度

  • 把每一个单次操作理解为常数操作,就可以好估计这个函数的时间复杂度

  • 并查集、单调队列、单调栈、哈希表等结构,均有这个概念

分析复杂度常见的错误:

  • 不要用代码结构来判断时间复杂度,通过两个for循环嵌套就说是时间复杂度是O(N^2)是错误的

  • 比如只有一个while的循环的冒泡排序,其实时间复杂度是O(N^2)

    // 只用一个循环完成冒泡排序
    // 但这是时间复杂度O(N^2)的!
    public static void bubbleSort(int[] arr){
        if (arr == null || arr.length < 2) {
            return;
        }
        int n = arr.length;
        int end = n - , i = 0;
        while (end > 0) {
            if (arr[i] > arr[i + 1]) {
                swap(arr, i, i + 1);
            }
            if (i < end - 1){
                i++;
            } else{
                end--;
                i = 0;
            }
        }
    }
    // 数字中交换i和j位置的数
    public static void swap(int[] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    
  • 比如:N/1 + N/2 + N/3 + ... + N/N,这个流程的时间复杂度是O(N * logN),著名的调和级数

    for (int i = 1; i <= N; i++) {
        for (int j = i; j <= N; j += i) {
            // 这两个嵌套for循环的流程,时间复杂度为O(N * logN)
            // 1/1 + 1/2 + 1/3 + 1/4 + 1/5 + ... + 1/n,也叫“调和级数”,收敛于O(logN)
            // 所以如果一个流程的表达式:n/1 + n/2 + n/3 + ... n/n
            // 那么这个流程时间复杂度O(N * logN)
        }
    }
    

    在这里插入图片描述

  • 时间复杂度只能是对算法流程充分理解才能分析出来,而不是简单的看代码结构!这个是一个常见的错误!甚至有些算法的实现用了多层循环嵌套,但时间复杂度是O(N)

常见复杂度一览:

  • O(1) O(logN) O(N) O(N*logN) O(N^2) ... O(N^K) O(2^N) ... O(K^N) ... O(N!)
  • 时间复杂度非常重要,可以直接判断某个方法能不能通过一个题目,根据数据量猜解法。

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

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

相关文章

【第三节】C/C++数据结构之栈与队列

目录 一、数据结构-栈 1.1 栈的定义 1.2 栈的 ADT (Abstract Data Type) 1.3 栈的顺序存储结构及实现 二、数据结构-队列 2.1 队列的定义 2.2 队列的 ADT 2.3 队列的顺序存储结构与实现 2.4 优先队列 2.5 各种队列异同点 一、数据结构-栈 1.1 栈的定义 栈(Stack)可…

[数据集][目标检测]道路圆石墩检测数据集VOC+YOLO格式461张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;462 标注数量(xml文件个数)&#xff1a;462 标注数量(txt文件个数)&#xff1a;462 标注类别…

node创建项目

前言 &#xff08;一&#xff09;、Web Web的开发体系中&#xff0c;分成前端&#xff0c;后端&#xff0c;工具&#xff0c;三个主要的领域。 前端主要由由浏览器&#xff0c;HTMLCSS浏览器端JS完成。 后端主要是由Web服务器&#xff0c;数据库&#xff0c;动态脚本语言&a…

初识 peerDependencies

目录 初步认识 peerDependencies semver 介绍 # 摘要 # 简介 # 语义化版本控制规范&#xff08;SemVer&#xff09; # 合法语义化版本的巴科斯范式语法 # 为什么要使用语义化的版本控制&#xff1f; # FAQ 示例讲解&#xff1a;vue-router 插件 # 说明 声明 验证 初…

信息系统项目管理师0143:过程概述(9项目范围管理—9.2项目范围管理过程—9.2.1过程概述)

点击查看专栏目录 文章目录 9.2 项目范围管理过程9.2.1 过程概述 9.2 项目范围管理过程 9.2.1 过程概述 项目范围管理过程包括&#xff1a; 规划范围管理&#xff1a;为了记录如何定义、确认和控制项目范围及产品范围&#xff0c;创建范围管理计划。收集需求&#xff1a;为了…

以sqlilabs靶场为例,讲解SQL注入攻击原理【18-24关】

【less-18】 打开时&#xff0c;获取了自己的IP地址。&#xff0c;通过分析源码知道&#xff0c;会将用户的user-agent作为参数记录到数据库中。 提交的是信息有user-Agent、IP、uname信息。 此时可以借助Burp Suite 工具&#xff0c;修改user_agent&#xff0c;实现sql注入。…

小白级教程—安装Ubuntu 20.04 LTS服务器

下载 本教程将使用20.04版进行教学 由于官方速度可能有点慢&#xff0c;可以下方的使用清华镜像下载 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/ 点击20.24版本 选择 ubuntu-20.04.6-live-server-amd64.iso 新建虚拟机 下载好后 我们使用 VMware 打开它 这里选…

103、python-第三阶段-13-大数据分布式集群运行

hadoop集群 4个多G的数据在集群中用了2.9分钟&#xff0c;如果在一个机器上运行大概需要十几分钟&#xff0c;所以集群速度还是很快的。

sql 查询 不满足 (一个教师编号 的角色 (role =‘2‘or(role=‘1‘and role =‘0‘)) )

sql 查询 不满足 &#xff08;一个教师编号 的角色 &#xff08;role 2’or&#xff08;role1’and role ‘0’&#xff09;&#xff09; &#xff09; 准备 一个 teacher 表 和数据 表 teacher 和数据 -- ---------------------------- -- Table structure for teacher -- …

短期业绩波动较大被券商不予评级,金种子酒背靠华润如何发力?

《港湾商业观察》施子夫 王璐 虽然一季度成功实现了扭亏为盈&#xff0c;但从近些年年报来看&#xff0c;金种子酒&#xff08;600199.SH&#xff09;的业绩压力依然不容小觑。白酒主业萎靡不振时&#xff0c;金种子酒开始了剥离非主营业务。 这些措施能否有利于主业向好&am…

MQ之初识kafka

1. MQ简介 1.1 MQ的诞生背景 以前网络上的计算机&#xff08;或者说不同的进程&#xff09;传递数据&#xff0c;通信都是点对点的&#xff0c;而且要实现相同的协议&#xff08;HTTP、 TCP、WebService&#xff09;。1983 年的时候&#xff0c;有个在 MIT 工作的印度小伙突发…

软理复习范围

1.直觉主义逻辑常采用三值逻辑来处理命题的真值&#xff0c;包括以下三个真值&#xff1a; 真&#xff08;True&#xff09;&#xff1a;表示命题是确定为真的。假&#xff08;False&#xff09;&#xff1a;表示命题是确定为假的。未知&#xff08;Unknown&#xff09;&#…

Keil编译bin格式固件方法

打开Option选项卡&#xff0c;选择User&#xff0c;在After Build/Rebuild下面增加以下命令&#xff1a; fromelf.exe --bin -o "L.bin" "#L"

短剧APP开发,推动短剧市场的全新发展

近几年&#xff0c;短剧火爆出圈&#xff0c;迎来了爆发式增长态势&#xff0c;市场规模一跃达到了百亿元&#xff01;短剧节奏快、剧情爽、情节猎奇&#xff0c;极大地满足了用户的追剧需求&#xff0c;深受大众的喜爱。 短剧巨大的市场发展前景也衍生出了各种新的短剧发展赛…

FSR 3 - Upscaling for Unity(性能优化工具)

FSR 3 - Upscaling for Unity已在Unity版本2021、2022和2023中进行了测试! 使用FSR 3 Upscaling for Unity提升帧数! FSR 3是一种升级技术,它基于较低分辨率的输入创建高质量和高分辨率的帧。通过使用这种方法,您的项目可以在极低的分辨率下运行,而不会损失视觉质量,也不…

连锁实体店同城引流的两种方式

连锁实体店开在哪里&#xff0c;它的影响力就在哪里&#xff0c;所以&#xff0c;连锁店的选址很重要&#xff0c;这点是毋庸置疑的&#xff0c;今天我们聊聊连锁实体店引流的两种方式。 1、同城引流新客到店 实体店的覆盖范围在3-5公里 使用抖音同城引流快速覆盖这个范围内的…

产品经理:做好有效的客户需求分析

需求分析是产品开发过程中的重要环节&#xff0c;它直接决定了产品是否能够满足市场需求和用户期望。通过深入了解客户需求&#xff0c;产品经理可以确保产品功能的设计符合用户的实际需求&#xff0c;从而提高产品的用户满意度和市场竞争力。 一、识别用户需求 识别用户需求…

从头搭hadoop集群--模版虚拟机的配置

软件说明&#xff1a; VMware Workstation Pro MobaXterm_Personal_12.4 映像文件&#xff1a;CentOS-7-x86_64-DVD-1908.iso jdk版本&#xff1a;jdk1.8.0_111 映射文件和jdk文件如下&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/18dsDlLk4WeW2Y8O2jUSkGQ?pw…

微服务学习Day9-分布式事务Seata

文章目录 分布式事务seata引入理论基础CAP定理BASE理论 初识Seata动手实践XA模式AT模式TCC模式SAGA模式 高可用 分布式事务seata 引入 理论基础 CAP定理 BASE理论 初识Seata 动手实践 XA模式 AT模式 TCC模式 Service Slf4j public class AccountTCCServiceImpl implements A…

运维开发介绍

目录 1.什么是运维开发 2.作用 3.优点 4.缺点 5.应用场景 5.1.十个应用场景 5.2.网站和Web应用程序 6.案例 7.小结 1.什么是运维开发 运维开发&#xff08;DevOps&#xff09;是一种结合软件开发&#xff08;Development&#xff09;与信息技术运维&#xff08;Opera…