精华内容
下载资源
问答
  • 这里我们来简单介绍一下时间复杂度和空间复杂度,并且给出表示的方法和例子。 时间复杂度关系到程序运行快慢,(时间上的效率) 空间复杂度运行时占用的内存/外存的空间多少 衡量一段代码效率,不一样的机器,不...

    复杂度可以看作是一段程序执行时,所要耗费时间或者空间上的量级。这里我们来简单介绍一下时间复杂度和空间复杂度,并且给出表示的方法和例子。

    • 时间复杂度关系到程序运行快慢,(时间上的效率)
    • 空间复杂度运行时占用的内存/外存的空间多少

    衡量一段代码效率,不一样的机器,不一样的环境。
    通过基本操作的数量,重复执行次数越多,程序运行就越慢

    O 渐进表示法:只是关注基本操作执行次数的数量级,不用很精确

    • 数组顺序查找时间复杂度为O(N),O(N) 表示基本操作大概执行N次.
    • 固定次数执行基本操作就可以记作O(1)
    • N 指的是数据的规模,两个数据规模相加
    • O(1) 程序运行时间不一定比 O(N)的运行时间短,宏观来看前者更快一些
    • 冒泡排序的时间复杂度为O(N^2) ,比较慢。二分查找时间复杂度为O(logN),与O(N)相差很多,比较快。
    • 递归阶乘O(N)
    展开全文
  • 计算执行程序的过程中,有两个衡量一个程序的所要消耗的空间和时间,这两个单位就是空间和时间复杂度。 因为如果只是单纯的对计算机的执行时间进行一个时间复杂度的定义,因为每台计算机的执行速度因配置而定,很...

    在计算执行程序的过程中,有两个衡量一个程序的所要消耗的空间和时间,这两个单位就是空间和时间复杂度。

    因为如果只是单纯的对计算机的执行时间进行一个时间复杂度的定义,因为每台计算机的执行速度因配置而定,很难完全相同,所以这样定义的时间复杂度是有问题的,但是如果将时间复杂度定义为一个程序最大执行的次数,就可以避开这个问题,因为无论是配置怎样高的计算机,他对一个程序的执行次数是肯定的,所以时间复杂度就是一个程序执行的次数。我么这里说的执行次数都是最大执行次数,因为一个程序的最差的情况往往是越容易发生的,所以我们选取最大的运行次数来计算时间复杂度。

    而空间复杂度的含义就和他的字面意思一样,就是程序在运行过程中所需要消耗的内存空间的大小。

     

    上面的是基本的定义,我们这里进行一个时间复杂度的具体讨论,空间复杂的具体讨论参照时间复杂度,就不一 一列举了。

    1.当计算机的执行次数为有限次的时候,时间复杂度是 O(1)。

            如果一个程序中有一个循环,循环进行的次数是确定的,那么这个循环的时间复杂度就是 O(1)。所以当我们看到一个时间复杂度为O(1)的程序的时候,并不是说这个程序仅仅执行了一个,而是这个程序执行了有限次,你可以知道的有限次,哪怕执行了一万次,一千万次,只要他的执行次数是已知的,时间复杂度都是O(1)。

    for(int i = 0;i < 10;i++)//这样的循环有10次,时间复杂度是O(1)
    {
        printf("%d\n",i);
    }
    
    for(int i = 0;i < 100000000;i++)//这样的循环有100000000次,时间复杂度是O(1)
    {
        printf("%d\n",i);
    }

    2.当计算机的执行次数并不能之直接指导具体的执行次数的时候,根据情况,进行时间复杂度的分析

            看一下例子,如果一个循环的循环次数并不已知,而是根据传入的参数进行变化,那就把这个次数定位n,当出现执行次数为N*N的时候,时间复杂度就是 N^2,不能进行简化,但是如果执行次数为2N的时候,时间复杂度就是N,因为在计算机的运行过程中,这样有限的已知的倍数可以化简为1,所以不进行计算。并且如果一个 N+20的运行次数,也应该简化为N,因为有限的运行次数都是需要进行简化的。

            这里的简化标准仅仅只是一个开始,我准备了一些例子,通过例子,来看具体的简化操作。答案我会附在后面,可以自己作对比。

    void Func1(int N) 
    { 
        int count = 0; 
        for (int i = 0; i < N ; ++ i)//执行次数为N*N
        {    
            for (int j = 0; j < N ; ++ j) 
           {       
               ++count;  
           }
        } 
        for (int k = 0; k < 2 * N ; ++ k)//执行次数为2N
        {
            ++count;
        }
     
        int M = 10; 
        while (M--)
        {    
            ++count;
        }
     
        printf("%d\n", count);
    } 
    void Func2(int N)// 计算Func2的时间复杂度?
    { 
    	int count = 0;
    	for (int k = 0; k < 2 * N; ++k) 
    	{ 
    		++count;
    	}
    
    
    	int M = 10; 
    	while (M--) 
    	{ 
    		++count; 
    	}
    	printf("%d\n", count);
    }
     
    void Func3(int N, int M)// 计算Func3的时间复杂度?
    { 
    	int count = 0;
    	for (int k = 0; k < M; ++k)
    	{
    		++count; 
    	}
    	for (int k = 0; k < N; ++k)
    	{ 
    		++count; 
    	}
    	printf("%d\n", count); 
    }
    
    
    
    void Func4(int N)// 计算Func4的时间复杂度? 
    {
    	int count = 0;
    	for (int k = 0; k < 100; ++k) 
    	{ 
    		++count;
    	}
    	printf("%d\n", count); 
    }
    
    
    void BubbleSort(int* a, int n) // 计算BubbleSort的时间复杂度? 
    { 
    	assert(a);
    	for (size_t end = n; end > 0; --end) 
    	{  
    		int exchange = 0;   
    		for (size_t i = 1; i < end; ++i)  
    		{     
    			if (a[i-1] > a[i])  
    			{           
    				Swap(&a[i-1], &a[i]); 
    				exchange = 1;    
    			}  
    		}
    		if (exchange == 0)    
    			break;
    	}
    }
    
    int BinarySearch(int* a, int n, int x)// 计算BinarySearch的时间复杂度?
    { 
    	assert(a);
    	int begin = 0; 
    	int end = n - 1;
    	while (begin < end)
    	{ 
    		int mid = begin + ((end - begin) >> 1);   
    		if (a[mid] < x)     
    			begin = mid + 1;    
    		else if (a[mid] > x)        
    			end = mid;   
    		else       
    			return mid;
    	}
    
    	return -1;
    }
    

    这里是答案:

    2. 实例2基本操作执行了M+N次,有两个未知数M和N,时间复杂度为 O(N+M) 
    3. 实例3基本操作执行了10次,通过推导大O阶方法,时间复杂度为 O(1)
    4. 实例4基本操作执行最好1次,最坏N次,时间复杂度一般看最坏,时间复杂度为 O(N)
    5. 实例5基本操作执行最好N次,最坏执行了(N*(N+1)/2次,通过推导大O阶方法+时间复杂度一般看最 坏,时间复杂度为 O(N^2) 
    6. 实例6基本操作执行最好1次,最坏O(logN)次,时间复杂度为 O(logN)  ps:logN在算法分析中表示是底 数为2,对数为N。有些地方会写成lgN。(建议通过折纸查找的方式讲解logN是怎么计算出来的

     

     

     

     

     

     

    展开全文
  • 一、时间复杂度 时间复杂度的表示方式:大O表示法 常见的时间复杂度表示公式: 公式的正确读法:如O(log2),读作O log2的时间复杂度,...二、空间复杂度 两个原则: 实例:LeetCode爬楼梯题目 ...

    1. 时间复杂度

    1.1 大O法

    对于一个算法,我们通常关注两个要点:(1)算法的运算时间;(2)算法运行占用的存储空间。

    在《算法精解》一书中,详细的分析了算法为什么要做计算最坏的情况分析。主要原因有四个:(1)最坏的情况消耗最多的时间;(2)最佳情况下的性能没有太大意义;(3)分析平均情况是不容易实现的;(4)最坏情况能告诉我们算法性能的上限,其他情况肯定最坏的情况还要好。所以我们需要关注的是:当输入的数据量达到无穷大的时候,算法的效率如何。

    大O法:也称为O表示法,是一种表示算法增长规律的方法。通常以函数所处理的数据量来表示算法的性能,即对于大小为n的数据,用函数f(n)来表示它的性能。

    下面两幅图是时间复杂度随n的增长T(n)增长的曲线:

     

    这里引用某博文的话:

    不同算法的时间复杂度,在不同数据输入规模下是存在时间的差异的。我们在决定使用那些算法的时候 ,不是时间复杂越低的越好,要考虑数据规模,如果数据规模很小,用O(n^2)的算法可能比 O(n)的更合适。

    当输入数据量规模趋于无穷大时,时间复杂度由小到大依次为:O(1)<O(log2n)<O(n)<O(n^2)<O(n^3)<O(n^k)<O(nlog2n)<O(2^n)<O(n!)。

    常见复杂计算发生的复杂度(来源:《算法精解:C语言的描述》):

    这里再补充一张图,非常不错,不同复杂度的代码也提供出来了,来源

    1.2 关于O(logn)

    为什么log n可以忽略底数,这个问题是我看了代码随想录中的博文才明白怎样做的,文中直接默认大家是知道换底公式的,这里提供一下换底公式:

    这里对底数C要求实际上是:必须是大于0且不等于1的实数,这样再看博文中的推导就可以很清晰了:

    2. 空间复杂度

    关于空间复杂度,下面这句话表述是非常清楚的,来源

    算法的空间复杂度也用O表示,指的是该算法所占用的空间随问题规模n的增长所变化的情况,O(1)表示算法所占用空间不随n的增长而增长;O(n)表示算法所占用空间随n的增长线性增长。

    在衡量一个算法的效率时,主要考虑时间复杂度,因为时间复杂度直接与用户体验相关,用空间换取时间也是可行的。

     

    展开全文
  • 求解时间复杂度

    千次阅读 热门讨论 2015-11-15 21:00:12
    算法复杂度分为时间复杂度和空间... 那么,时间复杂度需要怎样计算呢! 【平行循环】  一个算法的时间复杂度要看这个算法的执行次数,首先要找这个方法的基础语句,算法中执行次数最多的那条语句就是基本语句,
            算法复杂度分为时间复杂度和空间复杂度。 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。复杂度的大小可以分为:O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)
    
            那么,时间复杂度需要怎样计算呢!
    【平行循环】
            一个算法的时间复杂度要看这个算法的执行次数,首先要找这个方法的基础语句,算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。
            两个或者多个平行循环,它的时间复杂度是取这几个循环中循环次数最多的那个循环的循环次数来做这个算法的时间复杂度。
    for(i=0;i<n;i++)
    {
        b[i][0]=0;
    }
    for(j=0;j<5;j++)
    {
        b[0][j]=0;
    }
    则这个算法的时间复杂度为O(n)
    【嵌套循环】
            嵌套循环的时间复杂度则是,将一个嵌套循环中的所有循环的复杂度的积
    for(i=0;i<n;i++)
    {
        d[i]=0;
        for(j=0;j<n;j++)
        {
            s[i][j]=0;
        }
    }
    则这个算法的时间复杂度为O(n2)
            也有一些嵌套循环中的单个循环的时间复杂度不想同的,这样的不影响按照嵌套循环的方法求解其时间复杂度
    for(i=0;i<n;i++)
    {
        d[i]=0;
        for(j=0;j<m;j++)
        {
            s[i][j]=0;
        }
    }
    则这个算法的时间复杂度为O(mn)
    【While循环】
            while循环则是没有写到的O(log2n)的循环体了。
    i=1; 
    while (i<=n)
        i=i*2; 
    则这个算法的时间复杂度为O(log2n)
    【总结】
            时间复杂度的具体算法对于做题来说不用纠结的那么详细,这些也就够了。详细的说明可以参考http://blog.csdn.net/firefly_2002/article/details/8008987
    展开全文
  • N,没有重复的元素,要求打印缺少的2个数字, 空间复杂度O(1)。 这个题其实考察的是我们怎样用最少的辅助空间求出数组中缺少的两个数。其实可以通过数学思想解决这两个问题。 首先缺少的两个数假设是a和b,那...
  • 计算机的资源,最重要的是时间和空间(即存储器)资源。因而,算法的复杂性有时间复杂性和空间复杂性之分。 对于任意给定的问题,设计出复杂性尽可能低的算法是我们在设计算法时追求的一个重要目标;另一方面,当...
  • 本讲介绍模型复杂度怎样影响预测精度和计算性能。我们使用的数据集仍然是波士顿房价数据集。对于模型的每一类,我们通过选择有关的模型参数,度量计算性能和预测功效的影响,以此考察模型的复杂度。下面,我们用...
  • -自空间分析,通过线性或线性变换压缩到一个低维的子空间中,在低维的子空间中使样本的分布更紧凑,更加有利于分类,计算复杂度减少。 • 升到更高维度上再进行处理; 经典空间分析方法: 1.主成分分析,PCA----...
  • CV中的机器机器学习方法 子空间分析 怎样处理大数据量、高维数、非... 子空间分析:把高维空间中松散分布的样本,通过线性或非线性变换压缩到一个低维子空间中,使样本的分布更紧凑、更利于分类,同时降低复杂度
  • 1.什么是数据结构与算法? 数据结构:一组数据的存储结构。(线性表,散列表,图,树) 算法:操作数据的一组方法。...复杂度分析:空间复杂度,时间复杂度。 4.散列表(哈希表)(散列函数构造、处理冲...
  • 逐层打印二叉树

    2012-07-01 13:23:00
    分析:逐层打印是个很明显的广度优先算法,BFS的首选自然是用队列保存没有被遍历过的节点,每一层查一个marker以区分不同的层,算法复杂度是每个节点被遍历一次,所以为O(n),空间复杂度为某一层的最大节点数。...
  • 当我们将低维空间的数据映射到高维空间的时候,我们甚至不需要知道映射函数是什么,就算知道了又能怎么样,它只会给我们带来计算复杂度。我们需要的是这种类型的核函数可以在低维空间中用怎样的形式表现出来,因为...
  • 所以所谓的空间复杂度就是为了支持你的计算所必需存储的状态最多有多少,所谓时间复杂度就是从初始状态到达最终状态中间需要多少步。 总结 一个问题是该用递推、贪心、搜索还是动态规划,完全是由这个问题本身...
  • 所以所谓的空间复杂度就是为了支持你的计算所必须存储的状态最多都多少,所谓的时间复杂度就是从初始状态到达最终状态中间需要多少步。 总结 一个问题是该用递推、贪心、搜索还是动态规划,完全是有这个问题本身阶段...
  • 重学数据结构与算法

    2020-07-30 15:58:45
    重学数据结构与算法一、 时间复杂度和空间复杂度二、优化代码的方法论三、数据结构基础四、如何完成线性表的增删查五、栈:后进先出的线性表,如何实现增删查? 最近很迷茫,不知道应该学什么好了,似乎什么都需要去...
  • 机器学习,需要一定的数学基础,也需要一定的代码能力。...各种方法的时间空间复杂度、收敛性如何;还要知道怎样构造目标函数,才便于用凸优化或其他框架来求解,这些都需要一定的数学基础。可以说,数学基...
  • 引出算法效率的概念,并通过刷盘子的例子来比较不同的算法怎样产生不同的效率。 在研究算法的时候,准确的增长函数不如算法的渐进复杂度实用 提高CPU的计算速度并不能很好的弥补算法的缺陷 教材学习中的问题和解决...
  • 如上图所示,左边3D图像,存在大量冗余数据,我们把这样的数据转移到2D可以更加清晰的观察数据本身,同时降低计算复杂度。 1.PCA原理详解 如果我们要对上图二维空间的特征点做特征降维,那怎样的降维结果对我们来说...
  • 1.4.2 空间复杂度 1.5 一个算法实例 1.5.1 查找数字 1.5.2 创建项目 1.5.3 编译执行 1.6 Java程序的基本结构 1.6.1 类是一个基本单元 1.6.2 main方法 1.6.3 自定义方法 1.6.4 System.out.println的使用 1.6.5 一个...
  • 1.6.2 空间复杂度 8 1.7 算法实例 8 1.7.1 查找数字 8 1.7.2 创建项目 10 1.7.3 编译执行 12 1.8 算法的新进展 13 1.9 小结 14 第2章 数据结构 15 2.1 数据结构概述 15 2.1.1 什么是数据结构 15 2.1.2 ...
  • 《数据结构 1800题》

    热门讨论 2012-12-27 16:52:03
    6.数据结构中评价算法的两个重要指标是(时间复杂度和空间复杂度) 【北京理工大学 2001 七、1(2分)】 7. 数据结构是研讨数据的_(1)物理结构_和_(2)逻辑结构 _,以及它们之间的相互关系,并对与这种结构定义...
  • 3、 算法的空间复杂度指的是什么?如何表示? 4、 什么是最坏时间复杂性?什么是最好时间复杂性? 5、 什么是递归算法?什么是递归函数? 6、 分治法的设计思想是什么? 7、 动态规划基本步骤是什么? 8、 回溯法与...
  • 需要最优的算法,分析算法的空间和时间复杂度 1.3.6 假如给你一个新产品,你将从哪些方面来保障它的质量? 1.3.7 请评估一下程序的执行结果? 华为篇 2.1.0 static有什么用途?(请至少说明两种) 2.1.1 ...
  • C++程序员面试宝典

    热门讨论 2013-04-01 13:36:19
    面试题80 如何分配和释放存储空间 84 7.4 虚函数与纯虚函数 85 面试题81 虚函数与纯虚函数的区别 85 面试题82 如何使用纯虚函数 86 第8章 指针(教学视频:60分钟) 88 8.1 指针概述 88 面试题83 什么是指针 88 面试...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    答:一般在8位单片机与ARM方面的嵌入式系统是有层次上的差别,ARM适用于系统复杂度较大的高级产品,如PDA、手机等应用。而8位单片机因架构简单,硬件资源相对较少,适用于一般的工业控制、消费性家电等等。对于一个...
  • costas_loop代码

    2012-10-08 14:40:33
    掌握一个跟踪环路的本质是重要的,光Costas环就有好多种,关键看你要应用在什么场合,实现复杂度有什么要求。 % 如果楼主想对costas环有点更深入的认识,建议考虑一下低SNR环境下或者高动态环境的载波跟踪这种例子...
  • 答:“软件危机”(Software Crisis)的出现是由于软件的规模越来越大,复杂度不断增 加,软件需求量增大。而软件开发过程是一种高密集度的脑力劳动,软件开发的模式及技术 不能适应软件发展的需要。致使大量质量低劣...
  • 如果你之前没有任何算法基础,这边书很适合你,可以补充数据结构和算法的基础知识,像什么是时间复杂度空间复杂度、查找、排序等。 如果你有了一定基础了,建议你直接跳到最后面的算法实战部分。 《剑指 offer》 ...
  • 后进来的元素第一个弹出栈空间。类似于自动餐托盘,最后放上去的托盘,往往先被拿出来使用。</li><li>仅允许在表的一端进行插入和移除元素。这一端被称为栈顶</strong>,相对地,把另一端...

空空如也

空空如也

1 2
收藏数 29
精华内容 11
关键字:

怎样计算空间复杂度