您的位置:首页 > 其它

算法的时间复杂度和空间复杂度

2018-03-16 16:12 337 查看

简介

算法复杂度分为时间复杂度空间复杂度

时间复杂度

算法执行所需的时间长短

空间复杂度

算法执行所需的内存空间大小

时间复杂度

这里不说那些难懂的计算方式。只会列出部分级别的时间复杂度以及对应的例子。选择算法时可以对号入座

下面是各个级别对应的走势。



画的是真心不规范,只能把代表的大致走势画出来。

O(n^2)
O(n^3)
差不多的走势,只不过后者更陡坡而已。没画!

O(1)

for (int i = 0; i < 10; i++) {
...
}


循环
10
次这样的有限次数,我们已经知道的。

对于
CPU
来说根本没有负担。非常快的!
大O表示法
可以用常量
1
来表示。

O(nlog2^n)

快速排序

归并排序

堆排序

O(n)

for (int i = 0; i < n; i++) {
...
}


n不确定,循环次数不确定。可能很大到几百万,可能很小只有几十次。

这种情况下时间复杂度为
O(n)


O(n^2)

for (int i = 0; i < score.length - 1; i++) {
for (int j = 0; j <  score.length - 1 - i; j++) {
if (score[j] < score[j+1]) {
int temp = score[j];
score[j] = score[j+1];
score[j+1] = temp;
}
}
}


上述算法为冒泡排序

在元素个数不确定的情况下只能当循环次数为n

可以看见两个
for
循环,所以为
n^2


如果是
n^3
相信应该知道是有3个循环了

空间复杂度

空间复杂度(
Space Complexity
)是对一个算法在运行过程中临时占用存储空间大小的量度,记做
S(n)=O(f(n))


所以它强调的是使用的辅助空间的的大小,而不是指所有的数据所占用的空间。

对于空间复杂度,平时考虑的不是太多。注重的是时间复杂度。因为时间复杂度和空间复杂度是相对的

比如冒泡排序、直接排序、算则排序、希尔排序、堆排序等常见的排序的空间复杂度都是
O(1)
,少数为
O(n)
。因为需要辅助空间并不多

像是递归算法需要的临时空间就很多了,刚开始学递归算法时应该就听过递归算法很耗内存。因为递归算法不断调用自己,不断往内存中累加数据

所以,大部分递归算法的空间复杂度
O(n)


此外,人工干预也会造成一些复杂度的偏移。比如你要计算一个值,可以
for
循环对于每次的值比较。但也可以事先建立几千大小的临时数组。

再者,现在硬件升级的越来越好了!一点空间的牺牲换取时间的缩小是非常值得的!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: