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

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

✨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)。

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

相关文章
|
2月前
|
机器学习/深度学习 缓存 算法
Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【10月更文挑战第4天】在Python编程中,算法的设计与优化至关重要,尤其在数据处理、科学计算及机器学习领域。本文探讨了评估算法性能的核心指标——时间复杂度和空间复杂度。通过详细解释两者的概念,并提供快速排序和字符串反转的示例代码,帮助读者深入理解这些概念。同时,文章还讨论了如何在实际应用中平衡时间和空间复杂度,以实现最优性能。
72 6
|
2月前
|
搜索推荐 算法
插入排序算法的平均时间复杂度解析
【10月更文挑战第12天】 插入排序是一种简单直观的排序算法,通过不断将未排序元素插入到已排序部分的合适位置来完成排序。其平均时间复杂度为$O(n^2)$,适用于小规模或部分有序的数据。尽管效率不高,但在特定场景下仍具优势。
|
2月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
38 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
2月前
|
存储 算法
算法的时间复杂度和空间复杂度
本文详细讨论了算法的时间复杂度和空间复杂度,包括它们的概念、计算方法和常见复杂度的对比,并通过多个实例解释了如何计算算法的时间和空间复杂度。
109 0
算法的时间复杂度和空间复杂度
|
2月前
|
机器学习/深度学习 存储 算法
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
|
2月前
|
算法
[数据结构] -- 时间复杂度和空间复杂度
[数据结构] -- 时间复杂度和空间复杂度
16 0
|
2月前
|
算法 C语言
深入理解算法效率:时间复杂度与空间复杂度
深入理解算法效率:时间复杂度与空间复杂度
|
8天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
|
5天前
|
算法
基于WOA鲸鱼优化的购售电收益与风险评估算法matlab仿真
本研究提出了一种基于鲸鱼优化算法(WOA)的购售电收益与风险评估算法。通过将售电公司购售电收益风险计算公式作为WOA的目标函数,经过迭代优化计算出最优购电策略。实验结果表明,在迭代次数超过10次后,风险价值收益优化值达到1715.1万元的最大值。WOA还确定了中长期市场、现货市场及可再生能源等不同市场的最优购电量,验证了算法的有效性。核心程序使用MATLAB2022a实现,通过多次迭代优化,实现了售电公司收益最大化和风险最小化的目标。
|
3天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于深度学习网络的宝石类型识别算法matlab仿真
本项目利用GoogLeNet深度学习网络进行宝石类型识别,实验包括收集多类宝石图像数据集并按7:1:2比例划分。使用Matlab2022a实现算法,提供含中文注释的完整代码及操作视频。GoogLeNet通过其独特的Inception模块,结合数据增强、学习率调整和正则化等优化手段,有效提升了宝石识别的准确性和效率。