编程的基础:理解时间和空间复杂度

编程的基础:理解时间和空间复杂度

    • 时间复杂度
    • 空间复杂度
    • 示例
      • 常数时间复杂度 O(1)
      • 线性时间复杂度 O(n)
      • 线性对数时间复杂度 O(n log n)
      • 二次时间复杂度 O(n^2)
      • 指数时间复杂度 O(2^n)
    • 空间复杂度
    • 示例
      • 常数空间复杂度 O(1)
      • 线性空间复杂度 O(n)
      • 线性对数空间复杂度 O(log n)
    • 总结

了解时间和空间复杂度对于编写高效的代码至关重要。在这篇博客中,我们将深入探讨这两个概念,并提供示例来帮助您计算时间和空间复杂度。

时间复杂度

时间复杂度是指算法运行所需时间的量度,它是输入规模的函数。它通常使用大 O 符号表示,大 O 符号描述了最坏情况下的时间复杂度上限。

时间复杂度的几个常见类别包括:

  • O(1) - 常数时间复杂度:无论输入规模如何,算法运行所需的时间都保持不变。
  • O(log n) - 对数时间复杂度:随着输入规模的增大,算法运行需要的时间变长,但增长速度与输入规模的对数成正比。
  • O(n) - 线性时间复杂度:随着输入规模的增大,算法运行需要的时间变长,增长速度与输入规模成线性关系。
  • O(n log n) - 线性对数时间复杂度:随着输入规模的增大,算法运行需要的时间变长,增长速度与输入规模的对数和线性关系成正比。
  • O(n^2) - 二次时间复杂度:随着输入规模的增大,算法运行需要的时间变长,增长速度与输入规模的平方成正比。
  • O(2^n) - 指数时间复杂度:随着输入规模的增大,算法运行需要的时间变长,增长速度呈指数增长。

空间复杂度

空间复杂度是指算法运行所需的内存量的量度,包括输入数据和算法本身所需的空间。空间复杂度也通常使用大 O 符号表示。

空间复杂度的几个常见类别包括:

  • O(1) - 常数空间复杂度:无论输入规模如何,算法运行所需的内存都保持不变。
  • O(n) - 线性空间复杂度:算法运行所需的内存与输入规模成正比。
  • O(n^2) - 二次空间复杂度:算法运行所需的内存与输入规模的平方成正比。
  • O(log n) - 对数空间复杂度:算法运行所需的内存与输入规模的对数成正比。

示例

常数时间复杂度 O(1)

下面是一个计算数组元素之和的 Java 代码,它的时间复杂度为 O(1):

public static int sumOfArray(int[] arr) {if (arr == null || arr.length == 0) {return 0;}return arr[0] + arr[arr.length - 1];
}

这个 Java 代码的时间复杂度为 O(1),因为无论输入规模如何,算法运行所需的时间都保持不变。

线性时间复杂度 O(n)

下面是一个计算数组元素之和的 Java 代码,它的时间复杂度为 O(n):

public static int sumOfArray(int[] arr) {if (arr == null || arr.length == 0) {return 0;}int total = 0;for (int i = 0; i < arr.length; i++) {total += arr[i];}return total;
}

这个 Java 代码的时间复杂度为 O(n),其中 n 是输入数组的长度。原因是,当输入规模增大时,算法运行需要的时间变长,并且时间与输入规模成线性关系。

线性对数时间复杂度 O(n log n)

下面是一个对数序列的排序算法 Java 代码,它的时间复杂度为 O(n log n):

public static void sort(int[] arr) {if (arr == null || arr.length == 0) {return;}Arrays.sort(arr);
}

这个 Java 代码的时间复杂度为 O(n log n),因为它使用了 Java 标准库中的排序算法,该算法的时间复杂度为 O(n log n)。

二次时间复杂度 O(n^2)

下面是一个计算两个数组的交集的 Java 代码,它的时间复杂度为 O(n^2):

public static int[] intersection(int[] arr1, int[] arr2) {if (arr1 == null || arr2 == null || arr1.length == 0 || arr2.length == 0) {return new int[0];}int[] result = new int[Math.min(arr1.length, arr2.length)];int index = 0;for (int i = 0; i < arr1.length; i++) {for (int j = 0; j < arr2.length; j++) {if (arr1[i] == arr2[j]) {result[index++] = arr1[i];break;}}}return Arrays.copyOfRange(result, 0, index);
}

这个 Java 代码的时间复杂度为 O(n^2),因为它使用了双重循环,时间与输入规模的平方成正比。

指数时间复杂度 O(2^n)

下面是一个计算斐波那契数列的 Java 代码,它的时间复杂度为 O(2^n):

public static long fibonacci(int n) {if (n <= 1) {return n;}return fibonacci(n - 1) + fibonacci(n - 2);
}

这个 Java 代码的时间复杂度为 O(2^n),因为它使用了递归调用,时间呈指数增长。

空间复杂度

空间复杂度是指算法运行所需的内存量的量度,包括输入数据和算法本身所需的空间。空间复杂度也通常使用大 O 符号表示。

空间复杂度的几个常见类别包括:

  • O(1) - 常数空间复杂度:无论输入规模如何,算法运行所需的内存都保持不变。
  • O(n) - 线性空间复杂度:算法运行所需的内存与输入规模成正比。
  • O(n^2) - 二次空间复杂度:算法运行所需的内存与输入规模的平方成正比。
  • O(log n) - 对数空间复杂度:算法运行所需的内存与输入规模的对数成正比。

示例

常数空间复杂度 O(1)

下面是一个计算数组元素之和的 Java 代码,它的空间复杂度为 O(1):

public static int sumOfArray(int[] arr) {if (arr == null || arr.length == 0) {return 0;}return arr[0] + arr[arr.length - 1];
}

这个 Java 代码的空间复杂度为 O(1),因为无论输入规模如何,算法运行所需的内存都保持不变。

线性空间复杂度 O(n)

下面是一个计算数组元素之和的 Java 代码,它的空间复杂度为 O(n):

public static int sumOfArray(int[] arr) {if (arr == null || arr.length == 0) {return 0;}int total = 0;for (int i = 0; i < arr.length; i++) {total += arr[i];}return total;
}

这个 Java 代码的空间复杂度为 O(n),因为算法运行所需的内存与输入规模成正比。

线性对数空间复杂度 O(log n)

下面是一个二分查找算法 Java 代码,它的空间复杂度为 O(log n):

public static int binarySearch(int[] arr, int target) {if (arr == null || arr.length == 0) {return -1;}int left = 0;int right = arr.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid;} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1;
}

这个 Java 代码的空间复杂度为 O(log n),因为算法运行所需的内存与输入规模的对数成正比。

总结

了解时间和空间复杂度对于编写高效的代码至关重要,这些代码在运行时需要最少的时间并使用最小的内存。通过分析代码的时间和空间复杂度,您可以做出明智的决策,以优化代码以获得更好的性能。通过练习,您将能够识别不同算法的时间和空间复杂度,并为不同需求选择最有效的算法。

版权声明:
原创博主:牛哄哄的柯南
博主原文链接:https://keafmd.blog.csdn.net/
个人博客链接:https://www.keafmd.top/

看完如果对你有帮助,感谢点击下面的点赞支持!
[哈哈][抱拳]

在这里插入图片描述
加油!

共同努力!

Keafmd

感谢支持牛哄哄的柯南,期待你的三连+关注~~

keep accumulate for my dream【共勉】

                                                       ↓   ↓   ↓   合作 交流  ↓   ↓   ↓  

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

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

相关文章

apache 模式、优化、功能 与 nginx优化、应用

一、I/O模型——Input/Output模型 1.同步/异步 A程序需要调用B程序的某一个功能&#xff0c;A发送一个请求需要B完成一个任务 同步&#xff1a;B不会主动去通知A是否完成需要A自己去问 异步&#xff1a;B会主动通知A是否完成 2.阻塞/非阻塞 A发送一个请求需要B完成一个任务 …

Vision Mamba:使用双向状态空间模型进行高效视觉表示学习

模型效果 将DeiT和Vim模型之间的性能和效率比较&#xff0c;为了进行准确性比较&#xff0c;我们首先在IN1K分类数据集上预训练DeiT和Vim&#xff0c;然后在不同的下游密集预测任务上微调通用主干&#xff0c;即&#xff0c;语义分割、目标检测、实例分割。结果表明&#xff0c…

Maven 私服 Nexus3

一、Maven和Nexus3 简介 Maven是一个采用纯Java编写的开源项目管理工具&#xff0c;采用一种被称之为Project Object Model(POM)概念来管理项目&#xff0c;所有的项目配置信息都被定义在一个叫做POM.xml的文件中, 通过该文件Maven可以管理项目的整个生命周期&#xff0c;包括…

2024年危险化学品经营单位主要负责人证考试题库及危险化学品经营单位主要负责人试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年危险化学品经营单位主要负责人证考试题库及危险化学品经营单位主要负责人试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特…

Ubuntu22.04和Windows10双系统安装

概要 本篇演示Ubuntu22.04和Windows10双系统的安装。先安装Ubuntu22.04&#xff0c;再安装Windows10。 一、说明 1、电脑 笔者的电脑品牌是acer(宏碁/宏基) 电脑开机按F2进入BIOS 电脑开机按F12进入Boot Manager 2、U盘启动盘 需要用到两个U盘启动盘 &#xff08;1&a…

市场复盘总结 20240223

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 57% 最常用的…

牛客周赛 Round 33 解题报告 | 珂学家 | 思维场

前言 整体评价 感觉这场更偏思维&#xff0c;F题毫无思路&#xff0c;但是可以模拟骗点分, E题是dij最短路. A. 小红的单词整理 类型: 签到 w1,w2 input().split() print (w2) print (w1)B. 小红煮汤圆 思路: 模拟 可以从拆包的角度去构建模拟 注意拆一包&#xff0c;可以…

vmware安装centos 7.9 操作系统

vmware安装centos 7.6 操作系统 1、下载centos 7.9 操作系统镜像文件2、安装centos 7.9 操作系统3、配置centos 7.6 操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载centos 7.9 操作系统镜像文件 本文选择centos 7.9 最小化安装镜像包 这里选…

Nest创建神经元,并显示电压变化曲线

nest 安装与介绍 NEST&#xff08;神经模拟工具&#xff09;最初是在 1990 年代后期开发的。它的主要目标是作为计算神经科学模拟器。它支持具有不同生物学细节水平的各种神经元和突触模型。例如&#xff0c;NEST 的神经元模型范围从泄漏积分和激发模型到详细的 Hodgkin-Huxle…

python jupyter notebook打开页面方便使用

如果没安装jupyter, 请安装&#xff1a; pip install jupyter notebook 运行jupyter notebook jupyter-notebook

03|Order by与Group by优化

索引顺序依次是 &#xff1a; name,age,position 案例1 EXPLAIN SELECT * FROM employees WHERE name LiLei AND position dev ORDER BY age;分析: 联合索引中只是用到了name字段做等值查询[通过key_len 74可以看出因为name字段的len74]&#xff0c;在这个基础上使用了age进…

学会字符转换

字符转换 题目描述&#xff1a;解法思路&#xff1a;解法代码&#xff1a;运行结果&#xff1a; 题目描述&#xff1a; 输入⼀一个字符串&#xff0c;将字符串中大写字母全部转为小写字母&#xff0c;小写字母转成大写字母&#xff0c;其他字符保持不变。注&#xff1a;字符串…

pthread_cond_timedwait()函数

绝对时间&#xff1a;相对于1970年1月1日0时0分0秒 相对时间&#xff1a;相对于当前时间&#xff0c;如sleep(3);相对于当前&#xff0c;过3s.

1110. 删点成林

1110. 删点成林 关键要点 通过O(1)时间复杂度确认节点是否需要删除 Set to_deleteSet new HashSet<>(); Arrays.stream(to_delete).forEach(to_deleteSet::add); 使用深度优先搜索&#xff08;DFS&#xff09;遍历树 node.left dfs(node.left, s, ans); node.right …

组态软件在物联网中的应用

随着物联网的快速发展&#xff0c;组态软件在物联网中的应用也越来越广泛。组态软件是一种用于创建和管理物联网系统的可视化工具&#xff0c;它能够将传感器、设备和网络连接起来&#xff0c;实现数据的采集、分析和可视化。本文将探讨组态软件在物联网中的应用&#xff0c;并…

【Django开发】0到1开发美多shop项目:短信验证码和RabbitMQ。全md文档笔记(附代码 文档)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论django商城项目相关知识。项目利用Django框架开发一套前后端不分离的商城项目&#xff08;4.0版本&#xff09;含代码和文档。功能包括前后端不分离&#xff0c;方便SEO。采用Django Jinja2模板引擎 Vue.js实现前后端…

基于虚拟力优化的无线传感器网络覆盖率matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 虚拟力优化算法 4.2 覆盖覆盖率计算 5.完整程序 1.程序功能描述 基于虚拟力优化的无线传感器网络覆盖率&#xff0c;仿真输出优化前后的网络覆盖率&#xff0c;覆盖率优化收敛迭代曲线…

jQuery瀑布流画廊,瀑布流动态加载

jQuery瀑布流画廊&#xff0c;瀑布流动态加载 效果展示 手机布局 jQuery瀑布流动态加载 HTML代码片段 <!-- mediabanner --><div class"mediabanner"><img src"img/mediabanner.jpg" class"bg"/><div class"text&qu…

【计算机网络】深度学习使用应用层的HTTP协议

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【计算机网络】深度学习使用应用层的HTTP协议 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录 一:HTTP是什么二:HTTP请求1.HTTP请求的组成2.HTTP请求的方法…

Linux之部署前后端分离项目

Nginx配置安装 1.安装依赖 我们这里安装的依赖是有4个的 [rootlocalhost opt]# yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2.上传解压安装包 [rootlocalhost opt]# tar -xvf nginx-1.13.7.tar.gz -C /usr/local/java/3.安装Nginx &#xff0…