【数据结构与算法】1.时间复杂度和空间复杂度

news2024/11/14 14:31:03

在这里插入图片描述

📚博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️

🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!


文章目录

  • 时间和空间复杂度
    • 1. 算法效率
    • 2. 时间复杂度
      • 2.1 时间复杂度的概念
      • 2.2 大O渐进表示法
      • 2.3 推导大O阶方法
      • 2.4 常见的时间复杂度
    • 3. 空间复杂度

时间和空间复杂度

1. 算法效率

算法效率分为两种:第一种是时间效率;第二种是空间效率。时间效率又称为时间复杂度,而空间效率又称为空间复杂度。时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度衡量一个算法所需要的额外空间。

在计算机的发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到很高的程度。所以我们如今不需要特别关注空间复杂度。

2. 时间复杂度

2.1 时间复杂度的概念

时间复杂度的定义:算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间。应该算法所花费的时间与其中语句执行次数成正比。算法的基本操作的执行次数,为算法的时间复杂度

2.2 大O渐进表示法

// 请计算一下func1基本操作执行了多少次?
void func1(int N){
     int count = 0;
     for (int i = 0; i < N ; i++) {
         for (int j = 0; j < N ; j++) {
                count++;
            }
     }
     for (int k = 0; k < 2 * N ; k++) {
          count++;
     }
     int M = 10;
     while ((M--) > 0) {
          count++;
     }
     System.out.println(count);
}

Func1 执行的基本次数:F(N) = N2 +2 * N + 10

  • N = 10, F(N) = 130;
  • N = 100, F(N) = 10210;
  • N = 1000, F(N) = 1002010;

在实际上我们计算机时间复杂度的,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么我们使用大O渐进表示法。

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

2.3 推导大O阶方法

  1. 用常数1取代运行时间中的所有加法常数。
  2. 在修改后的运行次数函数中,只保留最高阶项。
  3. 如果最高阶存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

使用大O的渐进表示法以后,Func1的时间复杂度为:O(N2)

  • N = 10, F(N) = 100
  • N = 100 ,F(N) = 1000
  • N = 1000, F(N) = 1000000

通过上面我们会发现大0渐进表示法去掉了那些对结果影响不大的项。简洁明了的表示出了执行次数。

另外有些算法的时间复杂度存在最好、平均和最坏情况:

  • 最坏情况:任意输入规模的最大运行次数(上界)

  • 平均情况:任意输入规模的期望运行次数

  • 最好情况:任意输入规模的最小运行次数(下界)

在实际中一般情况关注的是算法的最坏运行情况

2.4 常见的时间复杂度

【例子1】:

// 计算func2的时间复杂度?
void func2(int N) {
   int count = 0;
   for (int k = 0; k < 2 * N ; k++) {
       count++;
  }
   int M = 10;
   while ((M--) > 0) {
       count++;
  }
   System.out.println(count);
}
/*
	func2基本操作执行次数 2N + 10次
	时间复杂度:O(N)
*/

【例子2】:

// 计算func3的时间复杂度?
void func3(int N, int M) {
   int count = 0;
   for (int k = 0; k < M; k++) {
       count++;
  }
   for (int k = 0; k < N ; k++) {
       count++;
  }
   System.out.println(count);
}
/*	
	func3基本操作次数 M + N 次
	时间复杂度:0(M + N)
*/

【例子3】:

// 计算func4的时间复杂度?
void func4(int N) {
   int count = 0;
   for (int k = 0; k < 100; k++) {
       count++;
  }
   System.out.println(count);
}
/*
	func4基本操作次数 100次
	时间复杂度:O(1)
*/

【例子4】:

// 计算bubbleSort的时间复杂度?
void bubbleSort(int[] array) {
   for (int end = array.length; end > 0; end--) {
       boolean sorted = true;
       for (int i = 1; i < end; i++) {
           if (array[i - 1] > array[i]) {
               Swap(array, i - 1, i);
               sorted = false;
          }
      }
   if (sorted == true) {
       break;
   }
 }
/*
	bubbleSort的最好情况为N次,最坏情况为(N * (N - 1) / 2)
	时间复杂度为:O(N ^ 2)
*/

【例子5】:

// 计算binarySearch的时间复杂度?
int binarySearch(int[] array, int value) {
   int begin = 0;
   int end = array.length - 1;
   while (begin <= end) {
       int mid = begin + ((end-begin) / 2);
       if (array[mid] < value)
           begin = mid + 1;
       else if (array[mid] > value)
           end = mid - 1;
       else
           return mid;
  }
   return -1;
}
/*
	binarySearch的时间复杂度:O(longN)
*/

【例子6】:

// 计算阶乘递归factorial的时间复杂度?
long factorial(int N) {
	return N < 2 ? N : factorial(N-1) * N;
}
/*
	factorial基本操作递归了N次
	时间复杂度为O(N)。
*/

【例子7】:

// 计算斐波那契递归fibonacci的时间复杂度?
intbonacci(int N) {
	return N < 2 ? N :bonacci(N-1)+bonacci(N-2);
}
/*
	fibonacci基本操作递归了2^N次,时间复杂度为O(2^N)
*/

3. 空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法

【例子1】:

// 计算bubbleSort的空间复杂度?
void bubbleSort(int[] array) {
   for (int end = array.length; end > 0; end--) {
       boolean sorted = true;
       for (int i = 1; i < end; i++) {
           if (array[i - 1] > array[i]) {
               Swap(array, i - 1, i);
               sorted = false;
          }
      }
      if (sorted == true) {
           break;
      }
  }
}
/*
	bubbleSort使用了常数个额外空间
	空间复杂度为 O(1)
*/

【例子2】:

// 计算fibonacci的空间复杂度?
int[]bonacci(int n) {
   long[] fibArray = new long[n + 1];
   fibArray[0] = 0;
   fibArray[1] = 1;
   for (int i = 2; i <= n ; i++) {
       fibArray[i] = fibArray[i - 1] + fibArray [i - 2];
   }
   return fibArray;
}
/*
	fibonacci动态开辟了N个空间
	空间复杂度为 O(N)
*/

【例子3】:

// 计算阶乘递归Factorial的空间复杂度?
long factorial(int N) {
    return N < 2 ? N : factorial(N-1)*N;
}
/*
	factorial递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。
	空间复杂度为O(N)
*/

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

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

相关文章

Java设计模式-UML与设计原则(1)

大家好&#xff0c;我是馆长&#xff01;在正式讲解Java设计模式之前&#xff0c;馆长先整理了一些概要信息&#xff0c;方便大家了解和学习。了解这些技术和理论信息&#xff0c;可以为设计模式的讲解更加的透彻与易学。 简介 统一建模语言&#xff08;Unified Modeling Langu…

【react】创建react项目+项目结构

使用create-react-app快速搭建开发环境 create-react-app是一个快速创建React开发环境的工具&#xff0c;底层由Webpack构建&#xff0c;封装了配置细节 npx create-react-app react_hm执行命令后开始创建 创建好执行cd react_hm npm start 当看到webpack compiled successfu…

(超详细)7-YOLOV5改进-添加 CoTAttention注意力机制

1、在yolov5/models下面新建一个CoTAttention.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import numpy as np import torch from torch import flatten, nn from torch.nn import init from torch.nn.modules.activation import ReLU from torch.nn.mod…

Redis最新版本搭建主从环境,Redis主从复制环境搭建

一般网站搭建都会使用Redis做缓存&#xff0c;当单台Redis承受不住压力时&#xff0c;会考虑搭建Redis主从。在没有业务的情况下&#xff0c;一般不会一下子上来就去搭建Redis无中心集群 Redis主从复制环境搭建&#xff0c;前面跟部署单台Redis一致&#xff0c;只不过后面是从R…

【C++入门】STL容器--vector底层数据结构剖析

目录 前言 1. vector的使用 vector的构造 vector迭代器 vector空间相关的接口 vector 功能型接口 find swap insert erase 2. vector内部数据结构剖析 reserve push_back和pop_back size、capacity、empty、operator[ ]&#xff1b; insert和erase resize swap 拷贝构造和…

acwing讲解篇之92. 递归实现指数型枚举

文章目录 题目描述题解思路题解代码 题目描述 题解思路 本题相当于二叉树的深度优先遍历&#xff0c;树的第i层是第i个数选或不选 我们记录当前递归的深度deep 然后用state进行状态压缩&#xff0c;state第i位是1表示选第i个数&#xff0c;第i位是0表示不选第i个数 进行dfs 如…

【面试突击】硬件级别可见性问题面试实战(上)

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复…

算法训练 day24 | 77. 组合

77. 组合 题目链接:组合 视频讲解:带你学透回溯算法-组合问题 回溯其实和递归是密不可分的&#xff0c;解决回溯问题标准解法也是根据三部曲来进行的。 1、递归函数的返回值和参数 对于本题&#xff0c;我们需要用一个数组保存单个满足条件的组合&#xff0c;还需要另一个结果数…

qt初入门5:字体设置和元对象系统的练习

空闲时间&#xff0c;参考课本demo&#xff0c;做一下练习。 字体的颜色主要用QPalette类&#xff0c;调色板的作用&#xff0c;控制着窗口部件的颜色和外观&#xff0c;包括背景色、前景色、文本颜色、边框颜色等。 字体的显示样式主要用Font类&#xff0c;用于管理字体。 元…

【想要安利给所有人的开发工具】最强工具ChatGPT——分享一些使用经验

目录 &#x1f525;个人使用ChatGPT的经验 &#x1f525;如何使用ChatGPT 方法一 方法二 &#x1f525;&#x1f525;提问技巧分享 1、英语翻译员 2、面试官 3、javascript 控制台 4、Excel表格 5、作曲家 6、辩手 7、小说家 8、诗人 9、数学老师 10、网络安全…

【第七在线】利用大数据与AI,智能商品计划的未来已来

随着科技的快速发展&#xff0c;大数据和人工智能(AI)已经成为各行各业变革的重要驱动力。在服装行业&#xff0c;这两大技术的结合正在深刻改变着传统的商品计划方式&#xff0c;引领着智能商品计划的未来。 一、大数据与AI在智能商品计划中的角色 大数据为智能商品计划提供了…

实用干货:最全的Loading动画合集网站!复制即用

大家好&#xff0c;我是大澈&#xff01; 本文约1000字&#xff0c;整篇阅读大约需要2分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01…

心跳检测与服务剔除

社保中心的忧桑 今天社保中心来了一位钉子户&#xff0c;90多岁的王大爷又兴高采烈的来给自己快120岁的老父亲领社保了! 工作人员这一-想&#xff0c;好像哪里不对啊&#xff0c;这老父亲120岁的年纪都可以上吉尼斯世界纪录了&#xff0c;要不咱帮老爷子去申请一下?王大爷一听…

Java 实际开发中,实现微信小程序/微信公众号的微信注册登录

1.功能   实际开发中&#xff0c;实现微信小程序/微信公众号的微信注册登录 2.前置条件   这里只关注注册登录逻辑&#xff0c;所以前提是先对接好微信授权的相关接口。比如&#xff1a;      1. 获取微信公众号/小程序token接口      2. 获取微信公众号/小程序授…

Springboot常见报错及解决方案

1、多模块项目无法启动&#xff0c;报错Failed to execute goal on project*: Could not resolve dependencies for project 2、报错找不到符号&#xff08;在多moudle调用的时候&#xff0c;公共模块新增了东西的时候发生&#xff09; Rebuild项目

【实战】SpringBoot自定义 starter及使用

文章目录 前言技术积累SpringBoot starter简介starter的开发步骤 实战演示自定义starter的使用写在最后 前言 各位大佬在使用springboot或者springcloud的时候都会根据需求引入各种starter&#xff0c;比如gateway、feign、web、test等等的插件。当然&#xff0c;在实际的业务…

C语言从入门到实战——文件操作

文件操作 前言一、 为什么使用文件二、 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 三、 二进制文件和文本文件四、 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭4.4 文件的路径 五、 文件的顺序读写5.1 顺序读写函数介绍fgetcfp…

pearcmd文件包含漏洞

1.什么是pearcmd.php pecl是PHP中用于管理扩展而使用的命令行工具&#xff0c;而pear是pecl依赖的类库。在7.3及以前&#xff0c;pecl/pear是默认安装的&#xff1b;在7.4及以后&#xff0c;需要我们在编译PHP的时候指定--with-pear才会安装 不过&#xff0c;在Docker任意版本…

python 自动化模块 - pyautogui初探

python 自动化模块 - pyautogui 引言一、安装测试二、简单使用三、常用函数总结 引言 在画图软件中使用pyautogui拖动鼠标&#xff0c;画一个螺旋式的正方形 - (源码在下面) PyAutoGUI允许Python脚本控制鼠标和键盘&#xff0c;以自动化与其他应用程序的交互。API的设计非常简…

卡萨帝洗衣机:被模仿也是竞争力

如何用一句话形容某家企业的竞争力和领导地位&#xff1f;“某某一出手&#xff0c;就知有没有。”这句话相当匹配。如果再加一条&#xff0c;“被模仿”也恰到好处。 从顶流公司OpenAI&#xff0c;苹果Apple Vision Pro&#xff0c;再到卡萨帝洗衣机&#xff0c;被跟随、模仿…