数据结构-初识复杂度以及如何计算时间复杂度和空间复杂度(详细)

这篇具有很好参考价值的文章主要介绍了数据结构-初识复杂度以及如何计算时间复杂度和空间复杂度(详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🌸🌸从今天开始将持续更新数据结构的相关知识点~

🌸首先,从复杂度开始~

复杂度怎么算,数据结构&MySQL,数据结构,Powered by 金山文档

复杂度(complexity)

什么是复杂度呢?

从字面来看就是说复杂的程度,我们需要具备一种工具可以评估某种算法(程序)的好坏,比如运行时间、占用空间等等。

复杂度具体体现在三个方面:

1.算法

2.数据规模

3.输入数据的情况(最好情况、最坏情况和平均情况,主要考虑最坏情况)

如何考察程序(算法)的运行时间?

❌直观想法:直接测量时,由于外界环境干扰(比如计算机自身的性能或者其他程序也在运行),因此不能直接完成。

⭕基本假设:理想中的计算机在执行一些步骤时,所用时间是一定的。例如,a=a+1;//是一个加法操作以及一个赋值操作 a=a+b+c;//两个加法操作和一个赋值操作

当执行的步骤越多,程序运行的时间也就越长。

将估算时长的问题转化成了计算程序中基本指令个数的问题。

基本指令:+、-、*、%、&&、||、!、赋值等等。

非基本指令:int a=add( ); int a=5^2;

时间复杂度(time complexity)

public class TestCsdn {
    void func(int n) {
        int count = 0;  //1条基本指令
    for(int i = 0; i<2*n;i++) {
        count++;        //2N条基本指令
    }

    int M = 10;        //1条基本指令
    while((M--)>0) {
        count++;       //10条基本指令
    }
    System.out.println(count);
  }
}

执行指令个数:f(N)=(2+C1)N+10+2+C2,即f(N)=aN+b。

当N趋于正无穷时,函数变化关系的比较:
f(n)=a*n+b;
g(n)=c*n^2+b;
对于上面两个函数关系, 当n趋于无穷时f(n)执行的指令个数小于g(n)的指令个数,即f(n)用时较少,所以算法更少。
大O渐进表示法:O(f(n))=O(n) O(g(n))=O(n^2)

大O渐进表示法:

1.只保留最高次项(对最终结果影响的更大的一项);

2.系数变为1(不关心具体的系数)。

时间复杂度的大O渐进表示法:

1.将求运行时间的问题转化成求基本指令个数的问题;

2.求出算法执行指令个数(因变量)和数据规模(自变量)的问题;

3.进而考察在数据规模(n)趋于无穷大时的大小关系;

具体实现:求最坏情况,找到运行次数最多的那条语句,找出n的函数关系,用大O渐进表示法表示,保留最高项将系数化为1。

复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档

接下来我们通过几个例题来练习一下:

例题1
复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档

函数关系:f(m,n)=a*m+b*n+c

大O渐进表示法:O(m+n)

例题2(循环)
复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档

函数关系:f(n)=100(指令个数与n无关,执行了常数次,即n的0次方为最高次,系数化为1)

大O渐进表示法:O(1)

例题3(冒泡排序)
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;
    }
}
复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档
复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档

综上我们可以得到一个基本规律,当两层循环嵌套时时间复杂度一般为O(n^2),如下:

for(int i=0;i<n;i++){//循环条件为i=i+2同样适用(加常数)
    for(int j=0;j<n;j++){
        //基本语句
    }
}
///时间复杂度O(n^2)

但是,需要特别注意的是,当循环条件为i=i*2(或者其他增长特变快的关系式时),时间复杂度并不是复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档.

for(int i=0;i<n;i=i*2){//循环条件为i=i+2同样适用(加常数)
    for(int j=0;j<n;j++){
        //基本语句
    }
}
///时间复杂度O(log(n))
例题4(二分查找)
复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档
复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档
例题5(求阶乘)
复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档

时间复杂度:O(n)

例题6(求斐波那契数列)
int fibonacc(int n){
    return n<2?n:fibonacc(n-1)+fibonacc(n-2);
    //f(n)=f(n-1)+f(n-2)
}
复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档
为了方便计算,我们进行估算,即将斐波那契数列近似为等比数列,n为组成的三角形的高度,S(n)为圆形的个数,根据等比数列求和公式: 复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档,a1=1,q=2,可得: 复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档

即时间复杂度:复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档

常见的时间复杂度

复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档 常数

复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档 线性函数

复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档 对数函数

复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档 幂函数

复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档

复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档 指数函数

时间复杂度的具体应用

冒泡排序:排序5万个数需要1.37s,冒泡排序的时间复杂度为复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档,现在排序10万个数,数据规模扩大两倍,即时间复杂度为复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档=复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档,耗时为原来的4被左右。

public class Tset0325 {
    public static void sort(long[] array){
        for (int i = 0; i < array.length-1; i++) {
            for (int j = 0; j < array.length-i-1; j++) {
                if(array[i]>array[i+1]){
                    long t=array[i];
                    array[i]=array[i+1];
                    array[i+1]=t;
                }
            }
        }
    }
    public static void main(String[] args){
        long[] array=new long[5_0000];
        Random random=new Random(); //alt+enter调用Random包
        for (int i = 0; i < array.length; i++) {
            array[i]=random.nextLong();//向数组中放入随机数
        }
        //时间戳(毫秒):从某个时刻开始到现在 经过的毫秒数
        long s=System.currentTimeMillis();  //获取当前的时间戳(timestamp)以毫秒为单位
        sort(array);
        long e=System.currentTimeMillis();
        long ms=e-s;
        double sec=ms/1000.0;   //long类型向double类型提升
        System.out.printf("排序经过 %.2f 秒\n",sec); //保留小数点后两位
    }
}
复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档
复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档
得出结论:数据规模扩大2倍,所用时间扩大4倍。

时间复杂度小结

1.时间复杂度的作用:估算算法的好坏;

2.计算时间复杂度;

3.常见的时间复杂度以及大小关系。

空间复杂度(space complexity)

算法和数据规模的规模之间的函数关系,执行一个算法额外需要多少内存空间。

下面我们通过几个例题来具体看一下如何计算空间复杂度:

复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档
例题1(冒泡排序)
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;
    }
}

空间占用只有3个变量(end、sorted、i),数据规模无论怎么变换,占据的空间是一定长度的,即空间复杂度为O(1)

例题2(斐波那契数列)
long[] fibonacc(int n){//数据规模是n
    long[] fibArray = new long[n+1];
    //定义数组时占用空间,引用数据类型(数组对象)放在堆上
    fibArray[0]=0;
    fibArray[1]=1;
    for (int i = 0; i <= n; i++) {
    //局部变量放在栈上
        fibArray[i]=fibArray[i-1]+fibArray[i-2];
    }
    return fibArray;
}

变量占用的空间是固定的O(1),定义数组时占用空间和数据规模n呈线性关系,因此空间复杂度为O(n)

栈上占用的空间基本是固定的:O(1)。
堆上占用的空间随着数据规模n而变化。
例题3(求阶乘)
long factorial(int n){
    if(n<2){
        return n;
    }else{
        long r=factorial(n-1);
        return r*n;
    }
}

递归调用过程中,factorial(5)没有返回之前,就得执行factorial(4),所以空间是不能释放的,执行factorial(5)时,需要5个空间,和数据规模n呈线性关系,因此空间复杂度是O(n)

🌸关于复杂度,我们就先认识到这里~文章来源地址https://www.toymoban.com/news/detail-792099.html

复杂度怎么算,数据结构&amp;MySQL,数据结构,Powered by 金山文档

到了这里,关于数据结构-初识复杂度以及如何计算时间复杂度和空间复杂度(详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 数据结构 — 时间复杂度、空间复杂度

    数据结构_空间复杂度_时间复杂度讲解_常见复杂度对比 本文介绍数据结构中的时间复杂度和空间复杂度 ***文章末尾,博主进行了概要总结,可以直接看总结部分*** 博主博客链接:https://blog.csdn.net/m0_74014525 点点关注,后期持续更新系列文章 算法效率指的是算法在处理数据时

    2024年02月13日
    浏览(53)
  • 数据结构之时间复杂度-空间复杂度

    大家好,我是深鱼~ 目录 1.数据结构前言 1.1什么是数据结构 1.2什么是算法 1.3数据结构和算法的重要性 1.4如何学好数据结构和算法 2.算法的效率 3.时间复杂度 3.1时间复杂度的概念 3.2大O的渐进表示法 【实例1】:双重循环的时间复杂度:O(N) 【实例2】:双重循环的时间复杂度

    2024年02月14日
    浏览(42)
  • 【数据结构】时间复杂度与空间复杂度

    在学习C语言的时候,大多数的小伙伴们并不会对算法的效率了解,也许算法也是一个陌生的领域,当进入了数据结构这个模块,就应该对算法的效率做一个清晰的认识。但是算法的效率是什么呢?这里就引出来时间复杂度与空间复杂度的概念了。 算法效率 指的是算法解决问

    2024年02月07日
    浏览(44)
  • 数据结构--时间复杂度与空间复杂度

    在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有程序在机器上跑起来,才能知道,但是如果所有的算法都需要在机器上运行起来去测试时间复杂度就会很麻烦,所以才有了时

    2024年02月16日
    浏览(43)
  • 【数据结构】---时间复杂度与空间复杂度

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 · 时间复杂度的定义

    2024年02月15日
    浏览(53)
  • 数据结构——时间复杂度和空间复杂度

    1.算法效率 2.时间复杂度 3.空间复杂度 4. 常见时间复杂度以及复杂度oj练习 1.算法效率 1.1 如何衡量一个算法的好坏 如何衡量一个算法的好坏呢?比如对于以下斐波那契数的计算 我们看到虽然用递归的方式实现斐波那契很简单,但是简单一定代表效率高吗? 我们接着往下看。

    2024年02月13日
    浏览(49)
  • 数据结构入门 — 时间复杂度、空间复杂度

    数据结构_空间复杂度_时间复杂度讲解_常见复杂度对比 本文介绍数据结构中的时间复杂度和空间复杂度 ***文章末尾,博主进行了概要总结,可以直接看总结部分*** 博主博客链接:https://blog.csdn.net/m0_74014525 点点关注,后期持续更新系列文章 算法效率指的是算法在处理数据时

    2024年02月13日
    浏览(54)
  • 数据结构——时间复杂度与空间复杂度

    目录 一.什么是空间复杂度与时间复杂度 1.1算法效率 1.2时间复杂度的概念 1.3空间复杂度的概念 二.如何计算常见算法的时间复杂度 2.1大O的渐近表示法  使用规则 三.如何计算常见算法的空间复杂度 3.1 大O渐近表示法 3.2 面试题——消失的数字  3.3 面试题——旋转数组 分为两

    2024年02月07日
    浏览(46)
  • 数据结构 --- 复杂度概念及计算讲解(时间复杂度,空间复杂度)

    今天没有sao话,今天认真学习 前言: 经常刷题的人都知道,我们在解决一道题时可能有多个解法,那么如何判断那个解法才是最优解呢? 我们通常从代码的两个方面进行判断:1.时间 2.空间。 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀

    2024年03月22日
    浏览(46)
  • 数据结构:时间复杂度和空间复杂度计算

    算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度, 而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主 要衡量一个算法所需要的额外空间,在计算机发展的早期,计算机的存储容量很小

    2024年02月11日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包