【数据结构与算法】时间复杂度&&空间复杂度

简介: 【数据结构与算法】时间复杂度&&空间复杂度

✨hello,进来的小伙伴们,你们好呐!✨

🌯🌯系列专栏:【数据结构与算法】

🍗🍗本篇内容:夯实基础——认识时间复杂度和空间复杂度!

🥞🥞作者简介:双非本科大三在读的一名Java初学者,星夜漫长,你我同行!

一、算法效率

🥭🥭衡量一个算法好坏的标准可以从这个算法的运行速度和所需的内存空间两个角度来分析,那么这两个因素哪个究竟是优先考虑的呢?

🍄🍄即时间效率被称为时间复杂度,而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间。

一、时间复杂度

🥠🥠定义:算法中的基本操作的执行次数,为算法的时间复杂度。

下面我将通过几个实例来演示如何计算一个算法的时间复杂度。

🚤🚤1.大O的渐进表示法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。

🛰️🛰️推导大O阶方法:

1、用常数1取代运行时间中的所有加法常数。

2、在修改后的运行次数函数中,只保留最高阶项。

3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大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);

   }

🍼🍼解答:

我们可以看到fun()函数里面开头是双层循环,先看最里面的j从0遍历到n-1共循环了N次,那么每循环一个j,外层循环i就会循环n次,也就是说循环了n*n次,也就是计算了n^2次,所以执行的基本操作次数n^2;接着看我们的K,因为k是小于2*n的,所以这部分代码执行的基本操作次数就是2*n;最后while(m--),因为M的值是10,所以执行的基本操作次数是10,加起来是n^2+2*n+10;

再根据上面的推导大O阶方法,常数用1取代,那么m就为1;又因为保留最高阶项,所以去掉我们的2*n;因为我们的最高阶项系数是1,所以最后得到的结果是n^2+1,那么我们可以想象一下,当n足够大时,这个1还有保留的必要吗?显然,我们可以省去1,那么func1()的时间复杂度就是O(n^2);🍬🍬

   🍖🍖结论:大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。

另外有些算法的时间复杂度存在最好、平均和最坏情况:

最坏情况:任意输入规模的最大运行次数(上界)

平均情况:任意输入规模的期望运行次数

最好情况:任意输入规模的最小运行次数(下界)

   ✈️✈️在实际中一般情况关注的是算法的最坏运行情况!

实例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);

⛵⛵解答:

可以看到,fun3是由两个循环来组成,所以基本语句的执行次数就是M+N,由于M和N是未知的,所以时间复杂度为O(M+N)。

实例3

计算fun4的时间复杂度?

   void func4(int N) {

     int count = 0;

     for (int k = 0; k < 100; k++) {

       count++;

    }

     System.out.println(count);

   }

 🚀🚀解答:

这一题猛一看上去就是 O(100)嘛,没的说,这么简单,其实从理论上来说没有问题的,因为基本操作执行了100次,但是根据我们的大O推导法,这里的100是常数项,那么时间复杂度就是O(1)。

下面我们来看几个难度升级的例子!

相关文章
|
1月前
|
算法 搜索推荐 程序员
数据结构中时间复杂度的介绍
冒泡排序是通过重复遍历数组,比较并交换相邻元素来排序数组的。因为它包含两层嵌套循环,每层循环的最大迭代次数近似于n,所以时间复杂度是O(n²)。 通过上述分析,我们可以看到不同代码结构对算法性能有着显著的影响。在设计数据结构和算法时,理解并计算时间复杂度是非常重要的,它帮助程序员选择或优化算法,以处理更大的数据集或提高程序的运行速度。
15 2
|
1月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
1月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
2天前
|
算法 数据安全/隐私保护
基于GA遗传优化算法的Okumura-Hata信道参数估计算法matlab仿真
在MATLAB 2022a中应用遗传算法进行无线通信优化,无水印仿真展示了算法性能。遗传算法源于Holland的理论,用于全局优化,常见于参数估计,如Okumura-Hata模型的传播损耗参数。该模型适用于150 MHz至1500 MHz的频段。算法流程包括选择、交叉、变异等步骤。MATLAB代码执行迭代,计算目标值,更新种群,并计算均方根误差(RMSE)以评估拟合质量。最终结果比较了优化前后的RMSE并显示了SNR估计值。
16 7
|
4天前
|
算法 数据挖掘
MATLAB数据分析、从算法到实现
MATLAB数据分析、从算法到实现
|
10天前
|
机器学习/深度学习 算法 调度
Matlab|基于改进鲸鱼优化算法的微网系统能量优化管理matlab-源码
基于改进鲸鱼优化算法的微网系统能量管理源码实现,结合LSTM预测可再生能源和负荷,优化微网运行成本与固定成本。方法应用于冷热电联供微网,结果显示经济成本平均降低4.03%,提高经济效益。代码包括数据分段、LSTM网络定义及训练,最终展示了一系列运行结果图表。
|
10天前
|
算法
基于Dijkstra算法的最优行驶路线搜索matlab仿真,以实际城市复杂路线为例进行测试
使用MATLAB2022a实现的Dijkstra算法在城市地图上搜索最优行驶路线的仿真。用户通过鼠标点击设定起点和终点,算法规划路径并显示长度。测试显示,尽管在某些复杂情况下计算路径可能与实际有偏差,但多数场景下Dijkstra算法能找到接近最短路径。核心代码包括图的显示、用户交互及Dijkstra算法实现。算法基于图论,不断更新未访问节点的最短路径。测试结果证明其在简单路线及多数复杂城市路况下表现良好,但在交通拥堵等特殊情况下需结合其他数据提升准确性。
|
16天前
|
算法 安全 数据库
基于结点电压法的配电网状态估计算法matlab仿真
**摘要** 该程序实现了基于结点电压法的配电网状态估计算法,旨在提升数据的准确性和可靠性。在MATLAB2022a中运行,显示了状态估计过程中的电压和相位估计值,以及误差随迭代变化的图表。算法通过迭代计算雅可比矩阵,结合基尔霍夫定律解决线性方程组,估算网络节点电压。状态估计过程中应用了高斯-牛顿或莱文贝格-马夸尔特法,处理量测数据并考虑约束条件,以提高估计精度。程序结果以图形形式展示电压幅值和角度估计的比较,以及估计误差的演变,体现了算法在处理配电网状态估计问题的有效性。
|
12天前
|
数据采集 存储 算法
基于BP算法的SAR成像matlab仿真
**摘要:** 基于BP算法的SAR成像研究,利用MATLAB2022a进行仿真。SAR系统借助相对运动合成大孔径,提供高分辨率图像。BP算法执行回波数据预处理、像素投影及图像重建,实现精确成像。优点是高精度和强适应性,缺点是计算量大、内存需求高。代码示例展示了回波生成、数据处理到插值显示的全过程。
|
20天前
|
机器学习/深度学习 自然语言处理 算法
m基于深度学习的OFDM+QPSK链路信道估计和均衡算法误码率matlab仿真,对比LS,MMSE及LMMSE传统算法
**摘要:** 升级版MATLAB仿真对比了深度学习与LS、MMSE、LMMSE的OFDM信道估计算法,新增自动样本生成、复杂度分析及抗频偏性能评估。深度学习在无线通信中,尤其在OFDM的信道估计问题上展现潜力,解决了传统方法的局限。程序涉及信道估计器设计,深度学习模型通过学习导频信息估计信道响应,适应频域变化。核心代码展示了信号处理流程,包括编码、调制、信道模拟、降噪、信道估计和解调。
44 8