数据结构-复杂度(深入学习版+Java版)

news/2024/5/2 18:51:34/文章来源:https://blog.csdn.net/m0_63979882/article/details/127142534

在这里插入图片描述

文章目录

  • 一、复杂度经典例子分析
    • 1、计算时间复杂度分析
      • 题1:O(N+M),循环
      • 题2:O(N^2),冒泡排序
      • 题3:O(logN),二分查找
      • 题4:O(N),阶乘递归
      • 题5:O(2^N),斐波那契递归(满二叉树)
    • 2、空间复杂度分析
      • 题1:O(1),冒泡排序
      • 题2:O(N),斐波那契循环
      • 题3:O(N),阶乘递归,斐波那契递归
  • 二、复杂度习题
    • 题1:消失的数字
      • 法一:求和
      • 法二:异或
      • 法三:空间换时间
    • 题2:轮转数组
      • 法一:空间换时间
      • 法二:逆置三次
      • 法三:循环换位(不可取)

一、复杂度经典例子分析

1、计算时间复杂度分析

时间复杂度规则

  • 用1取代常数
  • 只保留最高阶项
  • 去掉最高阶项的系数

题1:O(N+M),循环

// 计算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);
}

题2:O(N^2),冒泡排序

// 计算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;}}
}

分析
在这里插入图片描述

题3:O(logN),二分查找

// 计算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;elsereturn mid;}return -1;
}

分析
在这里插入图片描述

题4:O(N),阶乘递归

注意:递归算法的时间复杂度 = 递归次数

// 计算阶乘递归factorial的时间复杂度
long factorial(int N) {return N < 2 ? N : factorial(N-1) * N;
}

在这里插入图片描述

题5:O(2^N),斐波那契递归(满二叉树)

// 计算斐波那契递归fibonacci的时间复杂度
int fibonacci(int N) {return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2);
}

在这里插入图片描述

2、空间复杂度分析

空间复杂度规则计算变量的个数,而不是占用内存大小

题1:O(1),冒泡排序

解释: 使用了常数个额外空间,所以空间复杂度为 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;}}
}

题2:O(N),斐波那契循环

解释: 动态开辟了N个空间,空间复杂度为 O(N)

// 计算fibonacci的空间复杂度
int[] fibonacci(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;
}

题3:O(N),阶乘递归,斐波那契递归

解释:从开始调用递归到最远距离的这一路径递归了N次
阶乘递归:很好理解,它调用了n次
斐波那契递归开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)
斐波那契递归空间复杂度: 斐波那契递归归的时候,销毁了这一层函数的栈帧,回到上一层,因此只算从开始到最远的距离,而不像时间复杂度那样累加。

阶乘递归

// 计算阶乘递归factorial的空间复杂度
long factorial(int N) {return N < 2 ? N : factorial(N-1) * N;
}

斐波那契递归

//计算斐波那契递归fibonacci的空间复杂度
int fibonacci(int N) {return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2);
}

二、复杂度习题

题1:消失的数字

链接:
LeetCode 面试题 17.04.消失的数字

法一:求和

class Solution {public int missingNumber(int[] nums) {//法一:求和int nsum = 0;int numsum = 0;for(int i=0; i<= nums.length; i++) {nsum += i;}for(int i=0; i<nums.length; i++) {numsum += nums[i];}return nsum - numsum;}}

法二:异或

class Solution {public int missingNumber(int[] nums) {//法二:异或int t = 0;for(int i=0; i<nums.length; i++) {t ^= nums[i];}for(int i=0; i <= nums.length; i++) {t ^= i;}return t;}
}

法三:空间换时间

class Solution {public int missingNumber(int[] nums) {//法三:以空间换时间。int[] ret = new int[nums.length+1];Arrays.fill(ret,-1);for(int i=0; i<nums.length; i++) {ret[nums[i]] = nums[i];}for(int i=0; i <= nums.length; i++) {if(ret[i] == -1) {return i;}}return -1;}
}

题2:轮转数组

链接:
LeetCode189.轮转数组

法一:空间换时间

class Solution {public void rotate(int[] nums, int k) {//法二:开辟新空间,以空间换时间int cnt=0;k %= nums.length;int[] newnums = new int[nums.length];//注意1:将原数组的数据按照移动后的顺序放入新数组for(int i=nums.length-k; i<nums.length; i++) {newnums[cnt++] = nums[i];}for(int i=0; i<nums.length-k; i++) {newnums[cnt++] = nums[i];}//注意2:把新开辟的数组里的值拷贝回原来数组for(int i=0; i<nums.length; i++) {nums[i] = newnums[i];}}
}

法二:逆置三次

逆置分析:
在这里插入图片描述
旋转数组代码:

class Solution {public void rotate(int[] nums, int k) {//法三:利用逆置解决。两次小逆置,一次大逆置k %= nums.length;reverse(nums, 0 , nums.length-k-1);reverse(nums, nums.length-k, nums.length-1);reverse(nums, 0, nums.length-1);}public static void reverse(int[] nums, int left, int right) {while(left<=right){int tmp = nums[left];nums[left] = nums[right];nums[right] = tmp;left++;right--;}}
}

法三:循环换位(不可取)

class Solution {public void rotate(int[] nums, int k) {//法一:循环换位,世界复杂度为O(n*k)=>O(n^2),超过时间限制,不可取。k %= nums.length;while(k>0) {int i = 0;int tmp = nums[nums.length-1];for(i=nums.length-1; i > 0; i--) {nums[i] = nums[i-1];}nums[i] = tmp;k--;}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ffmpeg、ffplay、ffprobe 常用命令详解(音视频必备)

前言&#xff1a; &#x1f604;作者简介&#xff1a;小曾同学.com,小伙伴们也可以叫我小曾&#xff0c;一个致力于测试开发的博主⛽️ 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;…

回溯算法 - 二叉树中和为某一值的路径 字符串的排列

目录 1.二叉树中和为某一值的路径 1.1 题目描述 1.2 回溯算法的一般步骤 1.3 解题思路 1.4 代码实现 2. 字符串的排列 2.1 题目描述 2.2 解题思路 2.3 代码实现 1.二叉树中和为某一值的路径 1.1 题目描述 输入一颗二叉树的根节点root和一个整数expectNumber&#xff…

华为模拟器ensp学习笔记

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 目录前言1️⃣如何注册eNSP设备?2️⃣如何通过SecureCRT登录eNSP模拟设备&#xff1f;结语前言 记录华为模拟器使用中遇到的问题 1️⃣如何注册eNSP设备? 如何注册eNSP设备 重新注册AR、WLAN设备&#xff1a; 启动AR时&…

模块化:CommonJS规范

目录 CommonJS规范 模块使用环境区分 核心语法 如何使用 CommonJS&#xff1a;服务器端使用 CommonJS&#xff1a;浏览器端使用 CommonJS规范 模块使用环境区分 CommonJS规范中&#xff0c;每一个JS文件都可以作为一个模块。模块的引入&#xff0c;主要区分两个环境&…

基于Java后台(Springboot框架)+前端小程序(MINA框架)+Mysql数据库的医院预约挂号小程序系统设计与实现

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于微信小程序医院预约挂号系统&#xff0c;前台用户使用小程序&#xff0c;后台管理使用基JavaMySql技术&#xff1b;通过后台设置医院信息、录入医院科室信息、录入医生信息、设置医生排班信息、查看预约…

(附源码)计算机毕业设计SSM毕业设计管理系统

毕设帮助&#xff0c;指导&#xff0c;本源码分享&#xff0c;调试部署(见文末) 3.3功能需求分析 本系统采用从上往下的步骤开发&#xff0c;基本功能如下&#xff1a; 本课题要求实现一套毕业设计管理系统&#xff0c;系统主要包括&#xff08;管理员&#xff0c;教师和学生&a…

python-pyecharts基础知识

资料来源&#xff1a;2022新版黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了_哔哩哔哩_bilibili 折线图 地图 动态GDP增长图 补充知识&#xff1a; json 1&#xff09;JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去…

群晖Docker套件注册Harbor私有镜像仓库,并下载运行自己发布的Docker镜像

[群晖Docker套件注册Harbor私有镜像仓库&#xff0c;并下载运行自己发布的Docker镜像] 在进行微服务开发时&#xff0c;一些基础服务组件&#xff08;Nacos、Redis、Mysql&#xff09;的运行以及越来越多的业务服务组件的开发&#xff0c;会导致开发者电脑的内存资源紧张&#…

Android:玩转Jetpack Compose之MVI架构——基类中使用页面UiState

系列文章目录 架构一&#xff08;MVP&#xff09;&#xff1a;Android:玩转RetrofitOkHttpKotlin协程 网络请求架构 架构二&#xff08;MVVM&#xff09;&#xff1a;Android:玩转网络请求架构 RetrofitKotlin协程简单使用(MVVM架构模式) 架构三&#xff08;MVI&#xff09;&a…

吴恩达machine-learning-specialization2022第1周的optional lab

1. 使用python和numpy实现一个线性回归 要求使用梯度下降法&#xff0c;可视化losslossloss随着迭代次数的变化曲线 2. 说明 2.1 拟合函数 fw,b(x(i))wx(i)bf_{w,b}(x^{(i)})wx^{(i)}bfw,b​(x(i))wx(i)b 2.2 均方误差损失函数 J(w,b)12m∑i0m−1(fw,b(x(i))−y(i))2J(w,b)…

【云原生丨Kubernetes系列15】创建 ConfigMap 资源对象

前言 前⾯我们深入学习了 Servie 的使⽤&#xff0c; Service 是 Kubernetes 系统中⾮常重要的⼀个核⼼概念&#xff0c;这节课我们来学习另外⼀个⾮常重要的资源对象&#xff1a; ConfigMap 文章目录前言引入创建引入 应用部署的一个最佳实践是将应用所需的配置信息与程序进行…

【ML13】overfitting and underfitting 过拟合与欠拟合

过拟合与欠拟合过拟合与欠拟合概念过拟合解决办法解决办法一&#xff1a;在训练集中加入更多数据解决办法二&#xff1a;优化数据集 feature selection解决方法三&#xff1a;正则化 Regularization正则化线性回归Recape of Cost Function of Linear RegressionAdd the regular…

算法刷题:可交换的连续最大和

目录前言1. 题目描述2. 题目分析3. 代码实现4. 运行测试后记前言 好久没有做题了&#xff0c;前两天做了一道题&#xff0c;感觉还比较有意思&#xff0c;来分享一下。想学习&#xff0c;但是自己实在是懒&#xff0c;懒癌怎么治&#xff1f;期待着自己彻底奋发图强那一天。 …

【Ubuntu】常用软件下载与安装汇总

前言 发现很多诸如Detectron2的开源项目官方仅提供Liunx系统的安装方式&#xff0c;于是愤而将工作机系统换成了Ubuntu20.04&#xff0c;下面记录一些常用软件的安装方式&#xff0c;以便再次换机时能快速迁移&#xff0c;后续装新的软件会持续更新。 安装yum 直接安装会报错…

潜伏在ISP网络中数月的新黑客组织“Metador”

研究人员称之为“Metador”的一个以前未知的威胁因素已经入侵电信、互联网服务提供商(ISP)和大学大约两年了。 Metador的目标是中东和非洲的组织&#xff0c;他们的目的似乎是长期坚持间谍活动。该组织使用了两种基于Windows的恶意软件&#xff0c;它们被描述为“极其复杂”&a…

JavaScript:BOM

目录 一、BOM介绍 1、BOM的构成 二、window对象常用方法 1、窗口加载事件 2、window.onresize 3、confirm()方法 4、open()方法 5、setTimeout()定时器 6、this的使用 7、JS是单线程 8、JS执行机制 9、URL 10、location对象的属性 11、document对象 12、Date对象…

(附源码)计算机毕业设计ssm办公自动化系统

毕设帮助&#xff0c;指导&#xff0c;本源码分享&#xff0c;调试部署(见文末) 3.3系统流程和逻辑 系统业务流程图&#xff0c;如图所示&#xff1a; 图3-1登录流程图 图3-2添加信息流程图 图3-3注册信息流程图 4.1 概述 办公自动化系统基于Web服务模式&#xff0c;是一个适…

实训十七:交换机单端口环路检测配置

一、实验目的 1、了解单端口环路检测的作用 2、熟悉单端口环路检测的配置 二、 应用环境 1、针对网络中存在用户自行架设的 HUB 设备可能导致的环路&#xff0c;在交换机设备上运行单端 口环路检测以防止由于 HUB 连线失误导致的网络环路。 三、 实验设备 1、 DCN-CS6200 …

【CH559L单片机】串口下载程序说明

【CH559L单片机】串口下载程序说明&#x1f4cc;关篇《【硬件开源电路】CH559L开发板和CH55x_DAP-Link二合一开发板分享》 &#x1f4e2;CH559L单片机想通过串口来实现程序的烧录&#xff0c;折腾了我2天了&#xff0c;一直是失败&#xff0c;没有成功过一次&#xff0c;昨天跑…

【CSS3】 平面转换 空间转换 动画

目录平面转换平移缩放倾斜旋转transform复合属性空间转换空间位移空间旋转呈现立体图形空间缩放动画动画属性steps逐帧动画多组动画平面转换 CSS3中动画效果包括3个部分&#xff1a;过渡&#xff08;transition&#xff09;、变形&#xff08;transform&#xff09;、动画&…