奇葩面试题,O(logn)的底数是多少?
大家好,我是老三,最近裸辞了,在面试。
前两天一个面试,只面了十分钟就结束了——
事情是这样的:
面试官:你能说说HashMap的数据结构吗?
老三:数组+链表+红黑树,阿巴阿巴……
面试官:那你说说红黑树的查找复杂度是多少?
老三:O(logn)。
面试官:那这个复杂度的底数是多少?
老三:时间复杂度O(logn)有底数?
面试官:没有吗?
尬住……
面试官:那你再说一下快速排序的时间复杂度?底数是多少?
老三露出智(尴)慧(尬)的微笑……
面试官:好了,我没什么要问的了,这次面试到这结束吧。
结束面试之后,老三意难平,赶紧查一下。
O(logn)是有底数的!
看一下时间复杂度的定义:
在进行算法分析时, 语句总的执行次数 T ( n ) 是关于问题规模 n 的 函 数 。 进 而 分 析 T ( n ) 随 n 的变化情况并确定 T ( n ) 的 数 量级。 算法的时间复杂度,也就是算法的时间量度, 记作: T ( n )= O(f(n))。它表示随问题规模 n 的增大, 算法执行时间的增长率和f ( n ) 的增长率相同, 称作算法的渐近时间复杂度, 简称为时间复杂度。 其中 f ( n ) 是问题规模 n 的某个函数。
有点抽象对不对,直接上例子,我们来意会一下。
int n=10; int count=1; while (count<n){ count=count*2; //时间复杂度为O(1)的运算 System.out.println(count); }
看一下,这个运算,每次 count 乘以 2 之后, 就距离n更近了一分。 也就是说:
破案了,O(logn)确实是有底数的。
这个底数是由什么决定的呢?
算法中log级别的时间复杂度都是由于使用了分治思想,这个底数直接由分治的复杂度决定。如果采用二分法,那么就会以2为底,,三分法就会以3为底数,其他类似。
O(logn)底数意义不大!
那问题来了,为什么我们平时不写底数呢?
总不能因为这个底数太难打吧……
我们注意到,时间复杂度的定义: T ( n )= O(f(n))。它表示随问题规模 n 的增大, 算法执行时间的增长率和f ( n ) 的增长率相同, 称作算法的渐近时间复杂度,简称时间复杂度。
假如说我们要比较两个函数f(n)和g(n)的增长快慢,用什么办法呢?
可以使用微积分里的极限:
老三高数忘完了哈哈,不会推导,总之最后的结果是一个常数。
也就是,假如n非常大的时候,任意底数的一个对数函数都只是相差一个常数倍而已。
所以无论底数是什么,log级别的渐进意义是一样的。也就是说该算法的时间复杂度的增长与处理数据多少的增长的关系是一样的。
总之:O(logn)已经可以表达所有底数的对数了。
花了一个小时,无用的知识又增加了。
简单总结,就是O(logn)有底数,但是没有纠结的必要。
参考:
[1]. 重学数据结构(序:概览)
- 算法复杂度中的O(logN)底数是多少
- 算法复杂度中的O(logN)底数是多少
- 算法时间复杂度中O(logN)的底数是多少
- 剑指Offer——算法复杂度中的O(logN)底数是多少
- 算法复杂度中的O(logN)底数是多少
- 剑指Offer——算法复杂度中的O(logN)底数是多少
- 算法复杂度中的O(logN)底数是多少
- 阿里的Spring框架面试题到底有多难?这五大问题你又掌握了多少!
- 面试题:一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现(C#)
- 剑指offer--面试题10-整数的二进制中有多少个1
- 谷歌面试题:1024! 末尾有多少个0?
- 腾讯这套SpringMvc面试题你懂多少(面试必备)
- 谷歌面试题1024!的末尾有多少个0
- 面试题之输入一个数代表多少字节,输出其对应的GBytes/Mbytes/Kbytes/Bytes
- 百度面试题--度度熊想去商场买一顶帽子,商场里有N顶帽子,有些帽子的价格可能相同,度度熊想买一顶价格第三便宜的帽子,问第三便宜的帽子价格是多少?
- 奇葩的面试题
- 中企动力面试题--逻辑题,(3顶黑帽子,2顶白帽子),有多少人戴黑帽子?
- IBM公司的面试题,看看你能做出多少。
- 网易面试题之 牛牛想尝试一些新的料理,每个料理需要一些不同的材料,问完成所有的料理需要准备多少种不同的材料。
- 腾讯面试题:50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法