算法复杂度
算法复杂度分为时间复杂度和空间复杂度。时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。
时间复杂度是学习算法的基石,因此在学习算法之前,必须要知道如何去计算一段代码的时间复杂度,下面就根阿导一起来看看吧。
如何计算一个程序的时间复杂度
如下面一段代码,如何计算它的时间复杂度呢?
int a= 10;
int b= 10;
System.out.println(a+b);
这个应该是很简单的,一眼就能看出来,其时间复杂度是 O(1),那接下来稍微来个复杂一点的
int a = n;
int b = 0;
for(int i = 0 ; i < a ; i++){
b++;
}
有经验的程序员都知道上面的代码时间复杂度为 O(n),那么时间复杂度究竟是如何推导出来的呢?下面请允许阿导娓娓道来。
假定每一句执行的时间都是 k,下面我将上述按照执行时间来划分,如下图所示
红色代码代码部分执行时间为 3k,原谅色代码部分执行时间为 (n+1)k,蓝色代码部分执行时间为 2nk。
那么上述代码执行时间可表示为 f(n) = (3n+4)k,明显这就是一个函数式,下面会涉及到一个量级的概念,就是将 n 趋近无穷大,然后得出最终渐进结果即为该段代码的时间复杂度,怎么理解呢,如下表所示:
n | f(n) = (3n+4)k |
---|---|
1 | 7k |
100 | 304k |
10000 | 30004k |
100000000 | 300000004k |
10000000000000000 | 30000000000000004k |
∞ | ∞ |
你会发现,当 n 变成无穷大的时候,系数的影响微乎其微,我们只关注函数结果影响最大的项,因此上段代码我们会将其复杂度表示为 O(f(n))~O(n)。
既然引出量级的概念,那么在计算复杂度的时候,存在不同的量级就会舍去低的量级,下面给出数学中量级比较关系,如下图所示
小结
笔至此处,已渐尾声,下面我将计算复杂度的流程整理一遍。
-
先假定每一句执行代码时间为 k
-
然后分析代码语句,并得出执行时间的数学表达式
-
接下来就是简化数学表达式,首先将 k 至为 1
-
将所有常数替换成 1
-
只保留高阶项(也就是量级最大的一项)
-
去掉系数,得出最终结果即为时间复杂度
不知各位看官是否已明了,如有疑问,欢迎留言,如有不当之处,请多多包涵和指教!