时间复杂度与空间复杂度的log(n)底数应该是多少

时间复杂度与空间复杂度的log(n)底数应该是多少

介绍

今天看到一个关于时间复杂度log(n)的底数是多少的博客,他运用高中的数学知识论证了log(n)的底数是多少为N的无关变量

  • 其实这里的底数对于研究程序运行效率不重要,写代码时要考虑的是数据规模n对程序运行效率的影响,常数部分则忽略,同样的,如果不同时间复杂度的倍数关系为常数,那也可以近似认为两者为同一量级的时间复杂度。

为什么底数具体为多少不重要

现在来看看为什么底数具体为多少不重要?

如下图的log 2 ^ x 和 log 3 ^ x为例子证明
在这里插入图片描述
换底公式如下:
在这里插入图片描述

假设有底数为2和3的两个对数函数,如上图。当X取N(数据规模)时,求所对应的时间复杂度得比值,即对数函数对应的y值,用来衡量对数底数对时间复杂度的影响。

比值为log2 ^ N / log3 ^ N 带入换底公式可得
=(lnN/ln2) / (lnN/ln3)
=(lnN/ln2)*(ln3/lnN)
=ln3/ln2

结论

由此证明这个常数与N无关

用文字表述:算法时间复杂度为log(n)时,不同底数对应的时间复杂度的倍数关系为常数,不会随着底数的不同而不同,因此可以将不同底数的对数函数所代表的时间复杂度,当作是同一类复杂度处理,即抽象成一类问题。

当然这里的底数2和3可以用a和b替代,a,b大于等于2,属于整数。a,b取值是如何确定的呢?

有点编程经验的都知道,分而治之的概念。排序算法中有一个叫做“归并排序”或者“合并排序”的算法,它用到的就是分而治之的思想,而它的时间复杂度就是N*logN,此算法采用的是二分法,所以可以认为对应的对数函数底数为2,也有可能是三分法,底数为3,以此类推。

但是不可能是分数或者负数。

猜你喜欢

转载自blog.csdn.net/qq_42194657/article/details/135438367