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

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

    • 时间复杂度
    • 空间复杂度
    • 示例
      • 常数时间复杂度 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.hqwc.cn/news/492644.html

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

相关文章

Jmeter学习系列之八:控制器Controllers 的入门介绍

一、Controllers 简介 Jmeter有两种类型的控制器&#xff1a;Samplers&#xff08;取样器&#xff09;和Logical Controllers&#xff08;逻辑控制器&#xff09;&#xff1b;它们驱动着测试的进行取样器&#xff1a;让jmeter发送请求到服务器以及接收服务器的响应数据逻辑控制…

字节、腾讯、华为等50家大厂年终奖曝光,技术岗依旧很吃香!

一、大厂年终奖发放时间与数额 每到年末&#xff0c;年终奖就成了大家关心的话题&#xff0c;今年情况怎么样呢&#xff1f; 我们来看看互联网大厂的年终奖就知道了&#xff0c;先来看看发放时间。 一般来说&#xff0c;大厂年终奖发放多集中在12月-2月发放。 从上图一些网友…

【Spring Cloud】高并发带来的问题及常见容错方案

文章目录 高并发带来的问题编写代码修改配置压力测试修改配置&#xff0c;并启动软件添加线程组配置线程并发数添加Http取样配置取样&#xff0c;并启动测试访问message方法观察效果 服务雪崩效应常见容错方案常见的容错思路常见的容错组件 总结 欢迎来到阿Q社区 https://bbs.c…

3分钟快速实现串口PLC远程下载程序操作说明

3分钟快速实现串口PLC远程下载程序操作说明 搜索蓝蜂物联网官网&#xff0c;即可免费领取样机使用&#xff01;&#xff01;先到先得&#xff01;&#xff01;&#xff01; 一. 适用产品型号 其余型号网关此功能正在开发中&#xff0c;敬请期待。 二. 远程下载功能使用流程 …

基于STM32的儿童智能安全防护书包设计

一、前言 1.1 项目介绍 【1】项目功能介绍 随着社会的进步和科技的发展&#xff0c;儿童安全问题日益引起广泛关注。在日常生活中&#xff0c;尤其是在上学放学途中、户外活动时&#xff0c;儿童走失事件时有发生&#xff0c;给家庭和社会带来了极大的困扰和担忧。随着学业负…

ad如何生成gerber文件

1 2 3 4 5 6 7 8![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f576afa92b054a5ca68bc383a4c3c27d.png#pic_ce 8 9 10

乡村研学|乡村研学小程序|基于微信小程序的乡村研学平台设计与实现(源码+数据库+文档)

乡村研学小程序目录 目录 基于微信小程序的乡村研学平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 &#xff08;1&#xff09;乡村研学管理 &#xff08;2&#xff09;商品信息管理 &#xff08;3&#xff09;商品类型管理 …

C++ 入门(六)— 调试程序(Debugging)

文章目录 语法和语义错误调试(Debugging)调试过程调试策略常用的调试策略更多调试策略 使用集成调试器步进&#xff08;Stepping&#xff09; 语法和语义错误 语法错误 编写根据 C 语言的语法无效的语句时&#xff0c;会发生语法错误。例如缺少分号、使用未声明的变量、括号或…

Docker Nginx 负载均衡搭建(服务宕机-配置高可用) - 附(Python案例,其它语言同理)

目录 一 . 概要 1. 什么是负载均衡 2. 负载均衡有哪些优势&#xff1f; &#xff08;1&#xff09;应用程序可用性 &#xff08;2&#xff09;应用程序可扩展性 &#xff08;3&#xff09;应用程序安全 &#xff08;4&#xff09;应用程序性能 3 . Nginx负载均衡调度策…

【力扣白嫖日记】180.连续出现的数字

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 180.连续出现的数字 表&#xff1a;Logs 列名类型idintnumvarchar 找出所有至少连续出现三次的数字。 返回…

视频会议参会成员入会时无规律掉线解决方案:奇安信防火墙关闭ALG(反向代理)

【问题描述】 单位组织视频会议&#xff0c;出现很严重的问题是参会人员不能全部入会&#xff0c;多家单位依次都出现这种现象&#xff0c;无法入会的单位不固定。 【问题原因】 抓包查询到上级单位的奇安信防火墙出现了问题。 H323协议和SIP协议的视频流数据包经过防火墙以后…

数字热潮:iGaming 能否推动加密货币的普及?

过去十年&#xff0c;iGaming&#xff08;互联网游戏&#xff09;世界有了显著增长&#xff0c;每月有超过一百万的新用户加入。那么&#xff0c;这一主流的秘密是什么&#xff1f;让我们在本文中探讨一下。 领先一步&#xff1a;市场 数字时代正在重新定义娱乐&#xff0c;iG…