空间复杂度要不要把for循环里的i也算进去?

不上岸不许吃饭睡觉 2020-02-19 01:54:55
对空间复杂度不太了解,今天在做算法题时候突然想到这个问题。
空间复杂度是仅仅算方法块内部的局部变量,还是要把for循环的i以及其他的在其内部定义的局部变量也算进去?(这个i算不算局部变量?如果算,是算for里的局部变量还是方法块内的局部变量)
另外就是求大神解释一下空间复杂度具体是怎么算的,谢谢!!!!!!
举个例子:

void del_1(Sqlist &L,Elemtype x){
int m;
for(int i =0; i <L.length; i++){
if(x == L.data[i])
m = i;
}
for(int j = m; j <L.length; j++){
L.data[j] = L.data[j+1];
}
}

这个算是时间复杂度O(n),空间复杂度O(1)吗?
void del_2(Sqlist &L, Elemtype x){
int k=0,i=0;
while(i<L.length){
if(L.data[i]==x)
k++;
else
L.data[i-k]=L.data[i];
i++;
}
L.length=L.length-k;
}

这个空间复杂度为什么是O(1),他不是有2个局部变量i和k吗?
...全文
423 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 1 楼 寻开心 的回复:
算法复杂度判断的是计算次数, 这个次数和数据的长度之间的关系 如果是固定的次数,和数据的长度没有关系, 无论这个次数是几, 复杂度都是O(1) 如果次数和长度n的一次方相关,那么无论是执行8n还是1000n+10000次,都是O(n) 如果次数和长度的平方相关, 10n^2 + 100000n + 100000, 也叫做O(n^2) 就是找影响最大的地方, 而且忽略固定的系数 空间的复杂度也是类似的关系 第一个图,虽然是for两次,每次都执行了Length次循环, 总计算量就是 2*length, 但是复杂度依然是O(n) 第二图同样的, while也是执行了Length次,复杂度也是O(n) 空间复杂度是同样的算法, 变量不管是1,2,还是10000个,只要是固定的数,他就是O(1) 如果你开个数组,数组大小和Length无关,那么依然是O(1) 数组大小是Length/1000, 那也要算做O(N)
谢谢大佬,豁然开朗!
寻开心 2020-02-19
  • 打赏
  • 举报
回复 1
算法复杂度判断的是计算次数, 这个次数和数据的长度之间的关系
如果是固定的次数,和数据的长度没有关系, 无论这个次数是几, 复杂度都是O(1)
如果次数和长度n的一次方相关,那么无论是执行8n还是1000n+10000次,都是O(n)
如果次数和长度的平方相关, 10n^2 + 100000n + 100000, 也叫做O(n^2)
就是找影响最大的地方, 而且忽略固定的系数

空间的复杂度也是类似的关系

第一个图,虽然是for两次,每次都执行了Length次循环, 总计算量就是 2*length, 但是复杂度依然是O(n)
第二图同样的, while也是执行了Length次,复杂度也是O(n)

空间复杂度是同样的算法, 变量不管是1,2,还是10000个,只要是固定的数,他就是O(1)
如果你开个数组,数组大小和Length无关,那么依然是O(1)
数组大小是Length/1000, 那也要算做O(N)

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧