分析复杂度来判断算法效率

简介: 算法复杂度用于分析算法运行所需计算机资源的量,需要的时间资源为时间复杂度,需要的空间资源为空间复杂度。在判断一个算法的优劣时,可以抛开软件和硬件因素,只考虑问题的规模。编写程序前预先估计算法优劣,可以改进并选择更高效的算法。


一、时间复杂度



编程实现算法后,算法就是由一组语句构成,算法的执行效率就由各语句执行的次数所决定。一个算法花费的时间与算法中语句的执行次数成正比,把时间复杂度记为   ,一般情况下,算法的基本操作重复执行的次数是关于模块  的一个函数  ,因此,可以把算法的时间复杂度记做:  。

随着模块  的增大,算法执行的时间的增长率和  的增长率成正比,所以  越小,算法的时间复杂度越低,算法的效率越高。

研究复杂度的目的是要比较两个算法的效率的高低,并不需要仔细分析这个算法比那个算法多几次运算那么清,所以采用渐近复杂度分析来比较算法的效率。

在分析算法的时间复杂度时,一般都会规定各种输入情况得出最好情况下  、最坏情况下  和平均情况下  。


1. 求绝对值


求一个整数的绝对值,代码如下:

public static int abs(int a) {
    return a < 0 ? -a : a;
}

该代码中只有一条运算指令语句,时间复杂度为  。

微信图片5.png

2. 数组求和


对数组内所有整数求和,代码如下:

public static int sum(int[] a) {
    int s = 0;
    for (int i : a) {
        s += i;
    }
    return s;
}

如果输入数组的大小为  ,执行语句中初始化赋值需要时间  ,循环语句中的赋值操作需要时间为  ,所以语句执行的时间为:

该时间复杂度随着规模大小趋势如下:

微信图片4.png

3. 二分查找


使用二分法在有序数组中找到某个元素的位置,代码如下:

public static int binarySearch(int[] a, int b) {
    int i, r = 0, l = a.length;
    while (r <= l) {
        i = (r + l) / 2;
        if (a[i] < b) {
            r = i + 1;
        } else if (a[i] > b) {
            l = i - 1;
        } else {
            return i;
        }
    }
    return -1;
}

假设这个循环执行了  次,每一次循环都会将规模  除以 2:

  • 第 1 次,规模为  ;
  • 第 2 次,规模为  ;
  • 第 3 次,规模为  ;
  • 第  次,规模为  。

当  的时候,查找结束,所以需要满足  ,简化后得  ,所以二分查找的时间复杂度为  。

微信图片3.png


4. 冒泡排序


使用冒泡算法对整型数组进行排序,代码实现如下:

public static int[] bubbleSort(int[] a) {
    int temp;
    for (int i = 0; i < a.length - 1; i++) {
        for (int j = 0; j < a.length - 1 - i; j++) {
            if (a[j] > a[j + 1]) {
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }
    return a;
}

两层循环中比较的次数为  ,根据等差数列求和公式得出结果为  ,忽略低次项,所以该算法的时间复杂度为  。

微信图片2.png

不是时间复杂越低的越好,要考虑数据规模,如果数据规模很小,甚至可以用  的算法比  的更合适。

微信图片1.png

二、空间复杂度



衡量算法性能的另一个重要方面,就是算法需要使用的存储空间量,即算法空间复杂度。我们希望对于同样的输入规模,在时间复杂度相同的前提下,算法所占的空间越少越好。

每次基本操作只会涉及到常数规模的空间,所以在分析和讨论算法时,只关注时间复杂度。当然,空间复杂度在对空间效率非常在乎的应用场景时,或者是问题的输入规模极为庞大时,也有其存在的意义。

目录
相关文章
|
1月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
60 4
|
24天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
1月前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
1月前
|
移动开发 算法 前端开发
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
21 0
|
1月前
|
算法
PID算法原理分析及优化
【10月更文挑战第6天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
2月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
41 1
|
1月前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
40 0
|
27天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
12天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
13天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。