我想大家初次接触算法的时候,看到书里描述一个算法的时间复杂度为O(log(N))的时候,都或多或少的有一点疑惑——O(log(N))意味着什么呢?其实这个问题并不复杂,弄明白它只需要对时间复杂度和log计算建立直观的理解即可。
Note : 和数学上的符号不一样,这里的log指的是以2为底的对数计算。
1. 时间复杂度
以下是时间复杂度在百度百科中的定义,稍微有一点难懂,希望大家看完本文的解释以后可以完全理解这段话的全部内容。
在 计算机科学中, 算法的 时间复杂度(Time complexity)是一个 函数,它定性描述该算法的运行时间。这是一个代表算法输入值的 字符串的长度的函数。时间复杂度常用 大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是 渐近的,亦即考察输入值大小趋近无穷时的情况。
时间复杂度的根本目标是描述一个算法的运行时间。但是算法的运行时间不只和算法本身有关,有时还和算法的输入大小有关。通常,同一个算法运行在长度为10和长度为10万的数组上的时间肯定是差距巨大的。因此在描述算法运行时间的时候,我们希望“剥离”输入大小对运行时间的影响,进而关注随着输入大小的增长,运行时间会以怎样的速度扩张。因此,时间复杂度是一个函数,自变量为输入的大小,因变量为运行时间。
同时,在生产中我们总是关心最差的状况,也就是input_size非常大接近无穷的时候,算法的运行时间会变成什么样。在这种情况下函数里的低阶项和首项系数带来的影响相对其最高次幂就非常小了,因此可以忽略掉。