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

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

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

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

相关文章
|
23天前
|
机器学习/深度学习 算法 程序员
读《趣学算法》:重开算法之门,时间复杂度与空间复杂度
本文是作者阅读《趣学算法》后的笔记,介绍了算法复杂度的基本概念,包括时间复杂度和空间复杂度的不同阶表示,并通过具体例子展示了如何计算和理解算法的效率。
55 2
读《趣学算法》:重开算法之门,时间复杂度与空间复杂度
|
1月前
|
机器学习/深度学习 存储 算法
算法时间复杂度分析
这篇文章讲解了如何分析算法的时间复杂度,包括关注循环执行次数最多的代码段、总复杂度的确定、嵌套代码复杂度的计算方法,并提供了大O阶的推导步骤和常见时间复杂度的列表,同时还介绍了空间复杂度的概念及其重要性。
|
1月前
|
搜索推荐
九大排序算法时间复杂度、空间复杂度、稳定性
九大排序算法的时间复杂度、空间复杂度和稳定性,提供了对各种排序方法效率和特性的比较分析。
57 1
|
2月前
|
算法 Python
震惊!Python 算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
【7月更文挑战第23天】在Python算法设计中,时间与空间复杂度是幕后操控程序效率的双雄。时间复杂度反映算法执行时间随输入规模增长的速度,空间复杂度则计量算法运行时额外内存的使用。如顺序查找的时间复杂度O(n)与固定空间O(1),对比冒泡排序的O(n^2)时间和快速排序的O(n log n)时间优势,后者虽递归消耗空间,但在多数情况下提供更佳性能。根据需求,可权衡选择,如利用哈希表在充足内存下实现O(1)查找,或在空间受限时,偏好空间效率更高的算法,实现Python代码的高性能与优雅。
40 6
|
2月前
|
存储 算法 搜索推荐
揭秘!Python算法设计的隐形杀手:忽视时间复杂度与空间复杂度的后果有多严重?
【7月更文挑战第24天】在 Python 编程中, 算法设计是性能与效率的基石。忽视时间复杂度 (如使用 O(2^n) 的斐波那契数列递归算法而非 O(n) 的动态规划版本) 和空间复杂度 (如在插入排序中每次迭代都复制整个已排序数组, 导致 O(n^2) 的空间复杂度) 可能严重拖累程序。性能优化至关重要, 合理的算法设计保证程序高效稳定, 是攀登技术高峰的坚实阶梯。
37 3
|
2月前
|
算法 搜索推荐 数据处理
震惊!Python算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
【7月更文挑战第24天】在编程世界里, Python以简洁强大备受欢迎, 但算法设计与复杂度分析对程序性能至关重要。算法是程序的灵魂, 其效率直接影响数据处理能力。时间复杂度衡量算法执行速度, 如冒泡排序O(n²)与快速排序O(n log n)的显著差异; 空间复杂度关注内存占用, 递归算法需警惕栈溢出风险。优秀算法需平衡时间和空间效率, 深入理解问题本质, 迭代优化实现高效可靠。
32 2
|
2月前
|
算法 Python
算法小白秒变高手?一文读懂Python时间复杂度与空间复杂度,效率翻倍不是梦!
【7月更文挑战第24天】在编程中,算法效率由时间复杂度(执行速度)与空间复杂度(内存消耗)决定。时间复杂度如O(n), O(n^2), O(log n),反映算法随输入增长的耗时变化;空间复杂度则衡量算法所需额外内存。案例对比线性搜索(O(n))与二分搜索(O(log n)),后者利用有序列表显著提高效率。斐波那契数列计算示例中,递归(O(n))虽简洁,但迭代(O(1))更节省空间。掌握这些,让代码性能飞跃,从小白到高手不再是梦想。
45 1
|
1月前
|
存储 算法
【数据结构】——时间复杂度与空间复杂度
【数据结构】——时间复杂度与空间复杂度
|
15天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
15天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。