作为已经毕业多年的老同志来说,工资上缴了媳妇,而数学则还给了老师。
如果我没记错的话, 在大家计算时间复杂度和空间复杂度的时候,经常出现一个数学公式 Log。
Log 对数
在数学中,「对数」是对求幂的逆运算,正如除法是乘法的倒数,反之亦然。 这意味着一个数字的对数是必须产生另一个固定数字(基数)的指数。
如果 a 的 x 次方等于 N(a>0,且a≠1),那么数 x 叫做以 a 为底 N 的对数(logarithm 老哥瑞咋么),记作x = 。其中,a 叫做对数的底数,N 叫做真数。
标准的公式:x =
如果 a = 3, x = 2, 则 N = 9 ,即 = 9 同时 2 =
而为什么二分查找的时间复杂度是 O() 呢?
首先我们要知道,时间复杂度的定义其实就是算法中循环的次数。并且代表着当前操作「最坏情况下」的次数。
在遍历查找中:
遍历只能一个一个去查,如果查找的数字是 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 次的时候,终于只剩下一个值了,那么换成公式为 = 1
由于 = 1 ,所以 N = 1 / = 。
根据对数公式, x 是以 2 为底, N 的对数,得出 x = ,由于 2 在 log 函数的写法中可以被忽略,所以公式也等于 。不过,不管底数是 2 还是 3 等,由于底数相对于要计算的数据量来说是相对不变的,所以在时间复杂度的计算中,直接忽略不计。
至此,二分查找的时间复杂度 的由来就讲完了。
二分查找是一个非常典型的时间复杂度为 的算法。再让我们复习一下数学公式:
x = 的含义是,x 是以 2 为底 N 的对数,同时 N = 。
代入具体数字: 3 = , 8 =
你学废了吗?