编程中经常出现的数学公式 —— Log

1,014 阅读3分钟

作为已经毕业多年的老同志来说,工资上缴了媳妇,而数学则还给了老师。

如果我没记错的话, 在大家计算时间复杂度和空间复杂度的时候,经常出现一个数学公式 Log。

Log 对数

在数学中,「对数」是对求幂的逆运算,正如除法是乘法的倒数,反之亦然。 这意味着一个数字的对数是必须产生另一个固定数字(基数)的指数。

如果 a 的 x 次方等于 N(a>0,且a≠1),那么数 x 叫做以 a 为底 N 的对数(logarithm 老哥瑞咋么),记作x = logaN\log_a N 。其中,a 叫做对数的底数,N 叫做真数。 

标准的公式:x = logaN\log_a N

如果 a = 3, x = 2, 则 N = 9 ,即 323^2 = 9 同时 2 = log39\log_3 9

而为什么二分查找的时间复杂度是 O(log2N\log_2 N) 呢?

首先我们要知道,时间复杂度的定义其实就是算法中循环的次数。并且代表着当前操作「最坏情况下」的次数。

在遍历查找中:

遍历只能一个一个去查,如果查找的数字是 9,在最坏的情况下,需要遍历所有数字才能找到。所以如果查找的数字是 9,那么他需要查找 9 次才可以找到,所以它的时间复杂度是 9。假设我们查找的数字数量是 N ,那么时间复杂度也是 N。

在二分查找中

二分查找则每次循环时,取数据量的一半,第一步找到了 [5, 6, 7, 8, 9],第二步找到了 [7, 8, 9],第三步找到了[8, 9],第四步仅剩一个 9 ,就是我们要找的数字,在最坏的情况下仅仅需要 4 次循环就可以找到目标值。

所以最终剩下 1 个数字的时候,它就是我们要找的数字(如果不是,则是不存在)。

计算过程

初始剩下 N 个,

第一次 N / 2 个

第二次 ,第一次的一半 N / 2 / 2 个

第三次 ,第二次的一半 N / 2 / 2 / 2 个

依次类推,假设到 x 次的时候,终于只剩下一个值了,那么换成公式为 N(1/2)XN * (1 / 2)^X = 1

由于 N(1/2)XN * (1 / 2)^X = 1 ,所以 N = 1 / (1/2)X(1/2)^X = 2X2^X

根据对数公式, x 是以 2 为底, N 的对数,得出 x = log2N\log_2 N ,由于 2 在 log 函数的写法中可以被忽略,所以公式也等于 logN\log N。不过,不管底数是 2 还是 3 等,由于底数相对于要计算的数据量来说是相对不变的,所以在时间复杂度的计算中,直接忽略不计。

至此,二分查找的时间复杂度 logN\log N 的由来就讲完了。

二分查找是一个非常典型的时间复杂度为 logN\log N 的算法。再让我们复习一下数学公式:

x = log2N\log_2 N 的含义是,x 是以 2 为底 N 的对数,同时 N = 2X2^X

代入具体数字: 3 = log28\log_2 8 , 8 = 232^3

你学废了吗?