目录
算法效率
在数据结构这门课程中,首先要学学习的就是如何衡量一个算法是否高效,具有可利用性。算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般 是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。
时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算 机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计 算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。
时间复杂度
可以看出,N越大,后两项对结果的影响越小。
Func2的时间复杂度为:O(N).
一般情况下,Func3的时间复杂度为:O(M+N).
Fun3会出现一些特殊的情况:
1.当M>>N时,Func3的时间复杂度为:O(M).
2.当N>>M时,Func3的时间复杂度为:O(N).
Func2的时间复杂度为:O(1).
这个函数就存在上述出现的情况,时间复杂度时O(N).
对冒泡排序进行优化后,会出现不同的情况。
在数组顺序有序的情况下,即最好情况下 ,时间复杂度为O(N).
无序情况下,即最坏情况下,时间复杂度为O(N^2).
注意:计算时间复杂度时,不能纯粹的数循环,要看算法逻辑。
最好情况:查找一次,时间复杂度为O(1).
最坏情况:查找x次,此时2^x=N,x=logN,时间复杂度为O(logN).
空间复杂度
空间复杂度也是一个数学表达式,是对一个算法在运行过程中 临时占用存储空间大小的量度 。空间复杂度不是程序占用了多少 bytes 的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用 大 O 渐进表示法 。注意: 函数运行时所需要的栈空间 ( 存储参数、局部变量、一些寄存器信息等 ) 在编译期间已经确定好了,因 此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。
注意:空间是可以重复利用的,不累计;时间不能重复利用,是需要累计的。
以上代码在第一层for循环时,创建了一个exchange变量,除了for循环的作用域后,exchange变量会销毁,然后又利用相同的空间重新创建。因此空间复杂度为O(1).
空间复杂度为O(N).