先从O(1) 来讲,理论上哈希表就是O(1)。由于哈希表是经过哈希函数来映射的,因此拿到一个关键 字,用哈希函数转换一下,就能够直接从表中取出对应的值。和现存数据有多少毫无关系,故而每次执行 该操做只须要恒定的时间(固然,实际操做中存在冲突和冲突解决的机制,不能保证每次取值的时间是完 全同样的)。举个现实的例子,好比个人身后有一排柜子,里面有香蕉(代号B),苹果(代号A),葡萄 (G),如今你说A,我迅速的就把苹果递过来了;你说B,我迅速就把香蕉递过来了。就算你再增长菠萝 (P)、火龙果(H),可是你说一个代号,我递给你相应的水果这个速度是几乎不会变的。算法
至于O(n) ,这个就是说随着样本数量的增长,复杂度也随之线性增长。典型的好比数数。若是一我的 从1数到100,须要100秒,那么从1到200,基本上不会小于200秒,因此数数就是一个O(n) 复杂度的 事情。通常来讲,须要序贯处理的算法的复杂度,都不会低于O(n) 。好比说,若是咱们要设计一个算 法从一堆杂乱的考试的卷子里面找出最高的分数,这就须要咱们从头至尾看完每一份试卷,显然试卷越 多,须要的时间也越多,这就是一个O(n) 复杂度的算法。网络
O(n2) 是说,计算的复杂度随着样本个数的平方数增加。这个例子在算法里面,就是那一群比较挫的 排序,好比冒泡、选择等等。沿着咱们刚才的说的那个试卷的例子,等咱们找出最高的分数以后,放在一 边另起一堆,而后用一样的方法找第二高的分数,再放到新堆上…… 这样咱们作n次,试卷就按照分数从低 到高都排好了。由于有n份试卷,第一次翻卷找最高分,要找n份试卷,第二次翻卷要找n-1份试卷,第三次翻卷要找n-2份试卷.... ,总共要找n+(n-1)+(n-2)...+1次,也就是 (n+1)n/2次, 舍去常数,就是n2次. 算法时间复杂度就是O(n2). 再好比说构建一个网络,每一个点都和其余的点相连。显然,每当咱们增长一个点,其实就须要构建这个点 和全部现存的点的连线,而现存的点的个数是n,因此每增长1,就须要增长n个链接,那么若是咱们增长n 个点呢,那这个链接的个数天然也就是 O(n2) 量级了。函数
不管是翻试卷,仍是建立网络,每增长一份试卷,每增长一个点,都须要给算法执行人带来n量级的工做 量,这种算法的复杂度就是 O(n2)。设计
而后是O(nlogn) ,这是常见算法复杂度里面相对难理解的,就是这个log怎么来的。前面那个 n,表明执行了n次 的操做,因此理解了log(n),就理解了nlog(n)。排序
O(logn)的算法复杂度,典型的好比二分查找。设想一堆试卷,已经从高到底按照分数排列了,咱们现 在想找到有没有59分的试卷。怎么办呢?先翻到中间,把试卷堆由中间分红上下两堆,看中间这份是大于 仍是小于59,若是大于,就留下上面那堆,别的丢掉,若是小于,就留下下面那堆,丢掉上面。而后按照 一样的方法,每次丢一半的试卷,直到丢无可丢为止。方法
具体举一个例子, 假若有32份试卷,你丢一次,还剩16份 ,丢两次,还剩下8 份,丢三次,就只剩下4份了,能够这么一直 丢下去,丢到第五次,就只剩下一份了。也就是咱们一次丢一半,总要丢到只有一份的时候才能出那个要找的59分的卷子,一共执行了5次,2的5次方=32, 若是有n份,也就是大约须要log2n 次,才能得出“找到”或者“没找到”的结果。固然你说你三分查找,每次丢三 分之二可不能够?固然也能够,可是算法复杂度在这里是忽略常数的,因此无论以2为底,仍是以什么数为 底,都统一的写成 的形式。数据
理解了这一点,就能够理解快速排序为何是 O(nlog(n))了。好比对一堆带有序号的n本书进行排序,怎么快速排序呢?就是随便先选一本,而后把号码大于这本书的扔右边,小于这本书的扔左边。由于每本书都要比较 一次,因此这么搞一次的复杂度是O( n),那么快速排序须要咱们重复多少次呢?这又回到了二分查找的逻 辑了,通过第一次后,这堆书一分为二堆, 每堆是n/2本 , 在这两堆上再重复上面的步骤, 每堆排序一次的步骤n/2次 两堆共n/2+n/2=n次 , 再两堆分四堆,每堆的步骤是n/4次, 四堆共n/4+n/4+n/4+n/4=n次.... 因此每次分堆后,总的步骤次数都是n次, 请问分多少次手里每堆里只有一本书呢?答案仍是log2n 。因此分堆次数是log2n ,而每分一次堆后排序总步骤是n次,所以总的次数是nlogn.也就是时间复杂度为O(nlogn).算法复杂度