【数据结构】算法效率揭秘:时间与空间复杂度的较量

这篇具有很好参考价值的文章主要介绍了【数据结构】算法效率揭秘:时间与空间复杂度的较量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在计算机科学中,时间复杂度和空间复杂度是衡量算法性能的两个重要指标。它们分别表示算法在执行过程中所需的时间和空间资源。了解这两个概念有助于我们评估和比较不同算法的优劣,从而选择更合适的算法解决问题~

【数据结构】算法效率揭秘:时间与空间复杂度的较量,数据结构,数据结构

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

前言

 算法效率

时间复杂度

大O的渐进表示法

推导大O阶

示例1  冒泡排序

若没有优化的代码

考虑最好的情况

考虑最坏的情况

代码优化后

考虑最好的情况

示例2  二分查找

示例3  递归(一路)

示例4  递归(二路)

空间复杂度

示例1(代码与上面示例1同)冒泡排序

示例2

示例3(代码与上面示例3同)递归(一路)


 算法效率

算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作 空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间,

时间复杂度

在计算机科学中,算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间

一个 算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。一个算 法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

大O的渐进表示法

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


// 请计算一下func1基本操作执行了多少次?
void func1(int N){
    int count = 0;
    for (int i = 0; i < N ; i++) {
        for (int j = 0; j < N ; j++) {
            count++;//n^2
       }
   }
for (int k = 0; k < 2 * N ; k++) {
        count++;//2n
   }
 
    int M = 10;
    while ((M--) > 0) {
        count++;//n
   }
 
    System.out.println(count);
}

【数据结构】算法效率揭秘:时间与空间复杂度的较量,数据结构,数据结构

实际中我们计算时间复杂度时,只需要大概执行次数,所以使用大O的渐进表示法。N代表问题的规模。

推导大O阶

  1. 常数1取代运行时间中的所有加法常数
  2. 在修改后的运行次数函数中,只保留最高阶项
  3. 如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

使用大O的渐进表示法以后,Func1的时间复杂度为:O(N^2)

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

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

  • 最坏情况:任意输入规模的最大运行次数(上界)
  • 平均情况:任意输入规模的期望运行次数
  • 最好情况:任意输入规模的最小运行次数(下界)

例如:在一个长度为N数组中搜索一个数据x

最好情况:1次找到

最坏情况:N次找到 

平均情况:N/2次找到

在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)

示例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;
       }
   }
}

若没有优化的代码

        if (sorted == true) {
            break;

考虑最好的情况

外循环end=n时,内循环要走n-1次

外循环end=n-1时,内循环要走n-2次

……

外循环end=2时,内循环要走1次

所以最好的情况总次数(n-1)+(n-2)+(n-3)+……+1=n^2/2-n/2,所以时间复杂度为O(n^2)

考虑最坏的情况

因为有两个for循环,直接n*n=n^2

代码优化后

考虑最好的情况

第一遍就是有序的,即至少要遍历一遍数据,所以时间复杂度为O(n)

示例2  二分查找

// 计算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;
        else
            return mid;
   }
 
    return -1;
}

二分查找,每次去除掉一半的数据,

考虑最坏的情况:找到最后一个数字为目标数字,

有N个数据,设当折半x次找到,则N/2^x=1,得x=log2N

【数据结构】算法效率揭秘:时间与空间复杂度的较量,数据结构,数据结构

示例3  递归(一路)

递归的时间复杂度=递归的次数 * 每次递归后的代码的执行次数

// 计算阶乘递归factorial的时间复杂度?
long factorial(int N) {
 return N < 2 ? N : factorial(N-1) * N;
}

这里的递归次数为N次

每次递归回来执行了三目运算符,即1次

所以时间复杂度为N*1=N,即O(N)

示例4  递归(二路)

// 计算斐波那契递归fibonacci的时间复杂度?
int fibonacci(int N) {
 return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2);
}

考虑最坏的情况,这里的递归次数为2^0+2^1+……+2^(N-1)=2^N-1次

每次递归回来执行了三目运算符,即1次

所以时间复杂度为2^N-1,即O(2^N)

空间复杂度

是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度算的是变量的个数。空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法。

示例1(代码与上面示例1同)冒泡排序

使用了常数个额外空间,所以空间复杂度为 O(1)

示例2

// 计算fibonacci的空间复杂度?
int[] fibonacci(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;
}

 示例2动态开辟了N个空间,空间复杂度为 O(N)

示例3(代码与上面示例3同)递归(一路)

递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)文章来源地址https://www.toymoban.com/news/detail-861211.html

到了这里,关于【数据结构】算法效率揭秘:时间与空间复杂度的较量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法与数据结构】--算法应用--算法和数据结构的案例研究

    一、项目管理中的算法应用 在项目管理中,算法和数据结构的应用涉及项目进度、资源分配、风险管理等方面。以下是一些案例研究,展示了算法在项目管理中的实际应用: 项目进度管理 : 甘特图算法 :甘特图是一种项目进度管理工具,它使用甘特图算法来展示项目任务

    2024年02月08日
    浏览(15)
  • 评估算法优劣的关键:时间与空间复杂度入门指南

            在这篇文章中,我们将介绍评估算法优劣的核心指标:时间复杂度、额外空间复杂度以及常数项时间。算法是解决问题和执行任务的一系列指令,而评估算法的效率对于编程和软件开发至关重要。即使你是算法的初学者,本文也将帮助你理解这些概念,并教你如何分

    2024年01月18日
    浏览(8)
  • 数据结构与算法设计分析—— 数据结构及常用算法

    1、顺序表与链表 线性表是 线性结构 ,是包含n个数据元素的有限序列,通过顺序存储的线性表称为 顺序表 ,它是将线性表中所有元素按照其逻辑顺序,依次存储到指定存储位置开始的一块连续的存储空间里;而通过链式存储的 链表 中,每个结点不仅包含该元素的信息,还

    2024年02月07日
    浏览(20)
  • 数据结构和算法——数据结构

    目录 线性结构  队列结构的队列 链表结构的队列 链表的面试题 单向链表应用场景 约瑟夫环问题 栈结构 中缀表达式 前缀表达式 后缀表达式 非线性结构 图 递归解决迷宫问题 递归解决八皇后问题 顺序存储方式,顺序表 常见的顺序存储结构有:数组、队列、链表、栈 链式存

    2024年02月07日
    浏览(16)
  • 数据结构与算法 --- 数据结构绪论

    早期人们都把计算机理解为数值计算工具,就是感觉计算机当然是用来计算的,所以计算机解决问题,应该是先从具体问题中抽象出一个适当的数据模型,设计出一个解此数据模型的算法,然后再编写程序,得到一个实际的软件。 可现实中,我们更多的不是解决数值计算的问

    2024年02月14日
    浏览(12)
  • 数据结构与算法——数据结构有哪些,常用数据结构详解

    数据结构是学习数据存储方式的一门学科,那么,数据存储方式有哪几种呢?下面将对数据结构的学习内容做一个简要的总结。 数据结构大致包含以下几种存储结构: 线性表,还可细分为顺序表、链表、栈和队列; 树结构,包括普通树,二叉树,线索二叉树等; 图存储结构

    2024年02月15日
    浏览(16)
  • 【数据结构与算法】1.数据结构绪论

    📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点,相互学习进步! 数据结构是计算机中存储、组织数据的方式。 数据结构是一种具有一定逻辑关系,

    2024年01月23日
    浏览(13)
  • 【数据结构与算法】不就是数据结构

      嗨喽小伙伴们你们好呀,好久不见了,我已经好久没更新博文了!之前因为实习没有时间去写博文,现在已经回归校园了。我看了本学期的课程中有数据结构这门课程(这么课程特别重要),因为之前学过一点,所以就想着深入学习一下子。毕竟这门课程对于 考研 和 就业

    2024年02月07日
    浏览(10)
  • 数据结构与算法——什么是数据结构

    当你决定看这篇文章,就意味着系统学习数据结构的开始。下面我们先来讲什么是数据结构。 数据结构,直白地理解,就是研究数据的存储方式。 我们知道,数据存储只有一个目的,即为了方便后期对数据的再利用,就如同我们使用数组存储  {1,2,3,4,5}  是为了后期取得它们

    2024年02月15日
    浏览(18)
  • 数据结构--》掌握数据结构中的查找算法

            当你需要从大量数据中查找某个元素时,查找算法就变得非常重要。         无论你是初学者还是进阶者,本文将为你提供简单易懂、实用可行的知识点,帮助你更好地掌握查找在数据结构和算法中的重要性,进而提升算法解题的能力。接下来让我们开启数据

    2024年02月08日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包