定义了两个变量 int i,j;空间复杂度是O(1)吗

来源:互联网 发布:淘宝漏洞最新 编辑:程序博客网 时间:2024/05/17 02:35

你没理解时间复杂度和空间复杂度这两种概念的内涵复杂度指的往往是跟数据量有关的,是指在未知数据量的时候,或者说动态数据量的时候先说空间复杂度,顾名思义,就是你的程序要用多少个内存空间。但这并不是一个具体的数字,因为谁也不知道你的程序真正会具体用到多少字节,所以这只是一个大概的评价算法的一个概念。无论你的程序是用1字节内存还是1亿字节内存,只要这个数字是确定的,你都可以说你的程序的空间复杂度是O(1),这代表你要使用的空间一个常数,而不是特指1,常数代表所需的空间在程序运行中不会改变。但是如果你的程序是输入n个数据并且分配n个空间,那么空间复杂度就是O(n),因为这个n我们不知道程序在真正运行中到底输入多少数据,你输入10个也行,输入100亿个也行,因为我们不知道所以动态的说是要用到n个空间,就算输入n个数据,每个数据要用到1000个字节内存,我们也只说空间复杂度是O(n),因为1000是一个固定的数字,或者说常数,这个常数不会随输入数据量n的变化而变化,我们只关注动态的会变的那个n而已。(我们有时候也在这种情况下说复杂度是O(n*c),就是大O,n乘以c,c代表的是一个常数,在这个例子中就是1000,不过一般情况下不这么说,因为和不会变的常数c相比n往往大得多的多,所以我们一般简写O(n)而已)如果需要输入n个数据,每个数据因为需要和其他n个数据联系,所以要分配n*n个空间,或者说n的平方的空间,我们就说O(n*n),或者说O(n^2)(指n的2次幂)个空间复杂度,这也是因为n是未知的void deleteall(List &L, int x, int y) {int i,j;for(i=L.length;i>=1;i--){if(L.elem[i]>=x && L.elem[i]<=y){for(j=i+1;j<L.length;j++)L.elem[j-1]=L.elem[j];L.length--;}}printList(L);}你的这个函数,看上去是个删除的算法(或者说是一个整个算法的一部分,我这里是单从这一部分来看的),因为没有用到任何的额外空间(或者说但从这个函数来看,它没分配任何空间),我们可以认为它的空间复杂度是常数级别的,就是O(1)如果说时间复杂度是O(n^2),为什么呢,因为看算法,外面的for循环次数最坏是L.length次,内侧的for循环第一次是L.length-1次,第二次是L.length-2次,以此类堆,直到1次。显然这个执行次数不到L.length的平方次。但是这个执行次数又不能说它是log(L.length) x L.length次,log是代表取以2为底的对数,不能这么说是因为比这个次数多,在L.length较大时应该更接近L.length x L.length次,所以我们说它的时间复杂度是O(L.length x L.length),因为L.length我们可以看成是输入数据的量n,所以说是O(n^2)

原文地址:http://zhidao.baidu.com/link?url=ztvb0q0WRM-1FxwKkIFFYahiZQKgxNhkwBwpLjr2lu68hKzbQfk8QS-2OQe8C0a_1gGCuUCI-g-wpzu87cqtxK

                                             
0 0
原创粉丝点击