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

news2025/1/16 5:05:59

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

    • 时间复杂度
    • 空间复杂度
    • 示例
      • 常数时间复杂度 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.coloradmin.cn/o/1470640.html

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

相关文章

流浪动物救助平台:Java开发的实践与思考

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

获取tensorflow lite模型指定中间层的输出

以mobilenet v2为例子&#xff0c;我已经训练好了模型&#xff0c;有tflite格式和onnx格式两种模型的权重文件&#xff0c;我想获取tflite模型在推理阶段neck部分的输出。 查看onnx模型得到neck最后一层位置 使用netron查看onnx模型结构 从name中能知道Reshape是neck的最后一…

【蓝桥杯】拓扑排序

一.拓扑排序 1.定义&#xff1a; 设G&#xff08;V&#xff0c;E&#xff09;是一个具有n个顶点的有向图&#xff0c;V中的顶点序列称为一个拓扑序列&#xff0c;当且仅当满足下列条件&#xff1a;若从顶点到有一条路径&#xff0c;则在顶点序列中顶点必在之前。 2.基本思想…

前端学习---- 前端HTML基本元素的介绍

一&#xff1a;显示相关的HTML基础知识 1. 推荐的前端编写工具 2. VScode的html速写规则&#xff08;从a标签开始再用&#xff09; ①、&#xff01;&#xff1a;代表生成html的基本框架元素 ②、html元素&#xff1a;直接书写html,不需要加<>,按回车会自动生成 ③、{}…

社交媒体变革者:剖析Facebook对在线互动的贡献

随着数字化时代的蓬勃发展&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分。在这个领域的发展中&#xff0c;Facebook作为先行者和领导者&#xff0c;对在线互动的演变和发展产生了深远的影响。本文将深入剖析Facebook在社交媒体领域的贡献&#xff0c;以及它对在…

✅鉴权—cookie、session、token、jwt、单点登录

基于 HTTP 的前端鉴权背景cookie 为什么是最方便的存储方案&#xff0c;有哪些操作 cookie 的方式session 方案是如何实现的&#xff0c;存在哪些问题token 是如何实现的&#xff0c;如何进行编码和防篡改&#xff1f;jwt 是做什么的&#xff1f;refresh token 的实现和意义ses…

探索水下低光照图像检测性能,基于YOLOv6全系列【n/s/m/l】参数模型开发构建海底生物检测识别分析系统

底这类特殊数据场景下的检测模型开发相对来说比较少&#xff0c;在前面的博文中也有一些涉及&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 试探索水下目标检测&#xff0c;基于yolov5轻量级系列模型n/s/m开发构建海底生物检测系统》 《基于YOLOv5C3CBAMCBAM注意力…

查看笔记本电池健康状态-windows11

在 Windows 11 中获取详细的电池报告 Windows 11 中内置的 Powerfg 命令行选项来生成电池报告。 在任务栏上选择“搜索”&#xff0c;键入“cmd”&#xff0c;长按&#xff08;或右键单击&#xff09;“命令提示符”&#xff0c;然后选择“以管理员身份运行” ->“是”。 …

springboot215基于springboot技术的美食烹饪互动平台的设计与实现

美食烹饪互动平台的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统美食信息管理难度大&…

【电子书】数据库

资料 wx&#xff1a;1945423050 整理了一些互联网电子书&#xff0c;推荐给大家 数据库 ClickHouse原理解析与应用实践.epubECharts数据可视化&#xff1a;入门、实战与进阶.epubHAWQ数据仓库与数据挖掘实战.epubHBase不睡觉书.epubHBase原理与实践.epubMySQL 5.7从零开始学&…

主机开了电脑显示无视频输入怎么办 电脑显示无视频输入的解决方法

照理来说&#xff0c;我们开机之后电脑显示器就会进入工作状态&#xff0c;然后进入桌面&#xff0c;但最近由用户反映自己在开机之后显示无视频输入的字样&#xff0c;很是疑惑&#xff0c;那么电脑显示无视频输入怎么办?今天小编就专门给大家来讲一讲主机开了电脑显示无视频…

接口自动化测试用例如何设计

说到自动化测试&#xff0c;或者说接口自动化测试&#xff0c;多数人的第一反应是该用什么工具&#xff0c;比如&#xff1a;Python Requests、Java HttpClient、Apifox、MeterSphere、自研的自动化平台等。大家似乎更关注的是哪个工具更优秀&#xff0c;甚至出现“ 做平台的 &…

Python文件和异常(二)

目录 三、异常 &#xff08;一&#xff09;处理 ZeroDivisionError 异常 &#xff08;二&#xff09;使用 try-except 代码块 &#xff08;三&#xff09;使用异常避免崩溃 &#xff08;四&#xff09;else 代码块 &#xff08;五&#xff09;处理 FileNotFoundError 异常…

基于相位的运动放大:如何检测和放大难以察觉的运动(02/2)

目录 一、说明二、算法三、准备处理四、高斯核五、带通滤波器六、复杂的可操纵金字塔七、最终预处理步骤八、执行处理九、金字塔的倒塌十、可视化结果十一、结论 一、说明 日常物体会产生人眼无法察觉的微妙运动。在视频中&#xff0c;这些运动的幅度小于一个像素&#xff0c;…

【电子书】系统_网络_运维

资料 wx&#xff1a;1945423050 整理了一些互联网电子书&#xff0c;推荐给大家 系统_网络_运维 4G无线网络原理及优化.epubHyperledger Fabric 技术内幕&#xff1a;架构设计与实现原理.epubJSP应用与开发技术&#xff08;第3版&#xff09;.epubKali Linux 2网络渗透测试实…

前后端分离Vue+node.js在线学习考试系统gqw7o

与其它应用程序相比&#xff0c;在线学习平台的设计主要面向于学校&#xff0c;旨在为管理员和学生、教师、院系提供一个在线学习平台。学生、教师、院系可以通过系统及时查看公告信息等。 在线学习平台是在Windows操作系统下的应用平台。为防止出现兼容性及稳定性问题&#xf…

深入理解指针2

各位小伙伴们&#xff0c;我们继续来学习指针&#xff0c;指针和结构体以及动态内存管理对后面的数据结构学习有非常大的帮助&#xff0c;所有我们一定要把这些知识点学会。OK,正式进入学习之旅吧 1.数组名的理解 在上⼀个章节我们在使⽤指针访问数组的内容时&#xff0c;有这…

【RN】学习使用 Reactive Native内置UI组件

简言 当把导航处理好后&#xff0c;就可以学习使用ui组件了&#xff08;两者没有先后关系&#xff0c;个人习惯&#xff09;。 在 Android 和 iOS 开发中&#xff0c;一个视图是 UI 的基本组成部分&#xff1a;屏幕上的一个小矩形元素、可用于显示文本、图像或响应用户输入。甚…

300分钟吃透分布式缓存-14讲:大数据时代,MC如何应对新的常见问题?

大数据时代 Memcached 经典问题 随着互联网的快速发展和普及&#xff0c;人类进入了大数据时代。在大数据时代&#xff0c;移动设备全面融入了人们的工作和生活&#xff0c;各种数据以前所未有的 速度被生产、挖掘和消费。移动互联网系统也不断演进和发展&#xff0c;存储、计…

低代码与大语言模型的探索实践

低代码系列文章&#xff1a; 可视化拖拽组件库一些技术要点原理分析可视化拖拽组件库一些技术要点原理分析&#xff08;二&#xff09;可视化拖拽组件库一些技术要点原理分析&#xff08;三&#xff09;可视化拖拽组件库一些技术要点原理分析&#xff08;四&#xff09;低代码…