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

在这里插入图片描述

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

✨专栏:《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;elsereturn 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.hqwc.cn/news/417666.html

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

相关文章

架构的演进

1.1单体架构 单体架构也称之为单体系统或者是单体应用。就是一种把系统中所有的功能、模块耦合在一个应用中的架构方式。 存在的问题&#xff1a; 代码耦合&#xff1a;模块的边界模糊、依赖关系不清晰&#xff0c;整个项目非常复杂&#xff0c;每次修改代码都心惊胆战迭代困…

linux基础学习(5):yum

yum是为了解决rpm包安装依赖性而产生的一种安装工具 1.yum源 1.1配置文件位置 yum源的配置文件在/etc/yum.repos.d/中 *Base源是网络yum源&#xff0c;也就是需要联网才能使用的yum源。默认情况下&#xff0c;系统会使用Base源 *Media源是光盘yum源&#xff0c;是本地yum源…

论文阅读笔记AI篇 —— Transformer模型理论+实战 (三)

论文阅读笔记AI篇 —— Transformer模型理论实战 &#xff08;三&#xff09; 第三遍阅读&#xff08;精读&#xff09;3.1 Attention和Self-Attention的区别&#xff1f;3.2 Transformer是如何进行堆叠的&#xff1f;3.3 如何理解Positional Encoding&#xff1f;3.x 文章涉及…

【数据结构】详谈队列的顺序存储及C语言实现

循环队列及其基本操作的C语言实现 前言一、队列的顺序存储1.1 队尾指针与队头指针1.2 基本操作实现的底层逻辑1.2.1 队列的创建与销毁1.2.2 队列的增加与删除1.2.3 队列的判空与判满1.2.4 逻辑的局限性 二、循环队列2.1 循环队列的实现逻辑一2.2 循环队列的实现逻辑二2.3 循环队…

CodeReview 小工具

大家开发中有没有遇到一个版本开发的非常杂&#xff0c;开发很多个项目&#xff0c;改动几周后甚至已经忘了自己改了些什么&#xff0c;领导要对代码review的时候&#xff0c;理不清楚自己改过的代码&#xff0c;只能将主要改动的大功能过一遍。这样就很容易造成review遗漏&…

软件测试(一)

软件测试——测试用例 &#x1f3d0;测试用例要素&#xff08;四个重要的要素&#xff09;&#x1f3d0;测试用例的设计方法&#x1f3c0;基于需求的设计方法&#x1f3c0;等价类&#x1f3c0;边界值&#x1f3c0;判定表&#x1f3c0;正交表法&#x1f3c0;场景设计法&#x1f…

Prompt高级技巧:Few-Shots、COT、SC、TOT、Step-Back

CRISPE框架 如图所示。所谓CRISPE框架&#xff0c;指的是&#xff1a; CR&#xff1a;Capacity and Role&#xff08;能力与角色&#xff09;。你希望 ChatGPT 扮演怎样的角色。I&#xff1a;Insight&#xff08;洞察&#xff09;&#xff0c;背景信息和上下文。S:&#xff08…

在IDEA上运行成功,打包成jar包后,运行报错,程序自动退出

原因 java环境不正确&#xff0c;很有可能安装了多个环境&#xff0c;导致程序加载了错误程序。 解决办法 尝试修改环境变量&#xff0c;如果不行&#xff0c;建议删除掉多余的java环境。 注意&#xff1a;删除掉多余的Java环境需要用程序删除&#xff0c;直接删除文件&#xf…

两年过去,这个“核弹级”漏洞仍未消散

还记得2年前&#xff0c;那个号称“核弹级”的漏洞吗&#xff1f; 没错&#xff0c;就是现代网络安全史上最严重的漏洞“Log4shell”。当它刚被爆出的时候&#xff0c;全世界都炸了锅&#xff0c;各国政府积极响应&#xff0c;发布警告应对漏洞威胁&#xff0c;各家公司积极排…

海外云手机:跨境养号的新趋势

近年来&#xff0c;市场综合数据显示&#xff0c;利用海外云手机进行跨境养号已经成为跨境电商发展的新潮流。特别是在社交电商营销和短视频引流领域&#xff0c;海外云手机不仅能够提高流量的质量&#xff0c;还能让商家实现业务翻倍增长。接下来&#xff0c;本文将简要阐述海…

C++ 学习系列 -- std::function 与 std::bind

一 std::function 与 std::bind 的介绍 1. std::function std::function 是 c 11 的新特性 &#xff0c;包含在头文件<functional>中&#xff0c;为了更方便的调用函数而引入。 std::function 是一个函数包装器&#xff08;function wrapper&#xff09;&#xff0c;…

day24 回溯算法 组合

题目1&#xff1a;77 组合 题目链接&#xff1a;77 组合 题意 返回[1,n]中k个数的组合 元素不可以重复使用 回溯 回溯三部曲 1&#xff09;参数和返回值 void n k 2&#xff09;终止条件 叶子节点的大小为2 终止&#xff0c;放到数组中 3&#xff09;单层递归逻辑…