首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

可能解释为什么lg(n!)= O(nlg(n))

在计算机科学中,O表示算法的渐进时间复杂度。lg(n)表示以2为底的对数函数,n!表示n的阶乘。

对于给定的函数f(n),如果存在正常数c和n0,使得对于所有的n≥n0,都有f(n)≤c*g(n),则可以说f(n)是O(g(n))。

现在我们来解释为什么lg(n!)= O(nlg(n)):

lg(n!)表示n的阶乘的对数。根据对数的性质,lg(n!) = lg(1) + lg(2) + ... + lg(n)。

我们可以将lg(n!)拆分为lg(1) + lg(2) + ... + lg(n)。

对于任意的i,1≤i≤n,有lg(i)≤lg(n)。因此,lg(1) + lg(2) + ... + lg(n) ≤ n*lg(n)。

所以,lg(n!) = lg(1) + lg(2) + ... + lg(n) = O(nlg(n))。

这意味着lg(n!)的增长速度不会超过n*lg(n)的增长速度。在大O表示法中,我们通常关注的是算法的增长速度,而不是具体的常数因子。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

究竟为什么,快速排序的时间复杂度是n*lg(n)? | 经典面试题

最烦面试官问,“为什么XX算法的时间复杂度是OO”,今后,不再惧怕这类问题。...规则三:“树的高度”的时间复杂度往往是O(lg(n))。 分析:树的总节点个数是n,则树的高度是lg(n)。 在一棵包含n个元素二分查找树上进行二分查找,其时间复杂度是O(lg(n))。...对一个包含n个元素的堆顶元素弹出后,调整成一个新的堆,其时间复杂度也是O(lg(n))。 第二大类:组合规则 通过简单规则的时间复杂度,来求解组合规则的时间复杂度。 例如:n个数冒泡排序。...调整堆 故,用堆求解TopK,时间复杂度为: O(k) + O(n) * O(lg(k)) = O(n*lg(k)) 画外音:注意哪些地方用加,哪些地方用乘;哪些地方是n,哪些地方是k。...总结 for循环的时间复杂度往往是O(n) 树的高度的时间复杂度往往是O(lg(n)) 二分查找的时间复杂度是O(lg(n)),快速排序的时间复杂度n*(lg(n)) 递归求解,未来再问时间复杂度,通杀

1.5K30
  • 文心一言 VS 讯飞星火 VS chatgpt (80)-- 算法导论7.4 5题

    对于长度为 n/2 的部分,我们可以使用快速排序,其期望时间复杂度是 O((n/2)lg(n/2))。因此,对整个数组进行排序的期望时间复杂度是 O(nk + (n/2)lg(n/2))。...因此,对整个数组进行排序的期望时间复杂度是 O(nk + (n - k)lg(n/k))。 在理论和实践上,我们应该如何选择 k 呢?...当 k 取较小的值时,快速排序的时间复杂度可能会超过 O(n^2),而在 k 取较大的值时,插入排序的时间复杂度可能会超过 O(n^2)。...因此,整个排序算法的期望时间复杂度可以表示为 O(n*k) + O(nlogn) = O(nk+nlg(n/k))。...nlg(n/k)),假设优化后的快排产生的小数组大小O(k),在每个大小O(k)的小数组里使用插入排序,时间复杂度为O(k^2),总共有O(n/k)个小数组,则插入排序时间为O(nk)。

    19230

    重新认识数据结构:从空间占用开始

    ):占用 O(Z) bits,如 2Z bits,1.1Z bits 这里可能会造成疑惑,Succinct 和 Compact 有啥区别,个人认为附加的空间只要和 Z 不是线性关系就是 Succinct...这些数据结构基本都是一些非常简单的数据结构,虽然空间占用很高效,但是如果不做特殊处理,在其上的操作复杂度都不低,查找都是O(n)的。...为什么叫 implicit 呢,我觉得应该是原始数据中隐藏着结构,因为并没有用指针之类的明显表示数据之间的关系。...链表就不是 Succinct 数据结构,在链表中每个数据都带一个指针,假如数据有 n 个,为了区分这n个数据,指针的长度最少为 lg(n)个 bit。比如要区分 4 个数据至少需要 2 个bits。...这样假如每个数据占 x 个bit,Z=xn,指针占用 nlg(n)个,总占用 ( 1+x/lg(n) ) Z 个bits。Z 的一次项系数大于1。

    57710

    python实现高级算法与数据结构:如何实现搜索引擎的竞价排名2

    下面我们看看元素的更新操作,当一个元素的优先级发生变化后,堆的性质可能会被破坏,元素的值如果变大了,那么我们需要调用bubble_up来进行调整,如果是变小了,我们可能需要调用push_down进行调整...于是高度为h的节点,对应个数最多为 n/(2^h)个,由于每个这样的元素在执行push_down时对应时间为o(h),因此高度为h的元素全都执行完push_down,对应时间就是 o( n/(2^h)*...由于h的值最大不会超过lg(n),因此总共的时间复杂度为: 上面公式中,右边式子还可以简化一下: 因此heapify运行时间最多不过O(2n),所以它对应线性复杂度的时间。...通常做法就是先排序,然后选出最后十个元素,快速排序的复杂度是O(n*lg(n)),当n为一百万时,lg(n)约等于20,于是总共需要两千万次运算。...这种做法时间复杂度为O(n*lg(k) + k*lg(k)),因为k是一个常值,因此nlg(k)等价于O(n),于是这么做的时间复杂度就是o(n + k\lg(k)),于是一百万个网页,其运算效率也就一百万次左右

    46220

    布隆过滤器Bloom Filter简介

    背景: 如果在平时我们要判断一个元素是否在一个集合中,通常会采用查找比较的方法,下面分析不同的数据结构查找效率: 采用线性表存储,查找时间复杂度为O(N) 采用平衡二叉排序树(AVL、红黑树)存储,...查找时间复杂度为O(logN) 采用哈希表存储,考虑到哈希碰撞,整体时间复杂度也要O[log(n/m)] 当需要判断一个元素是否存在于海量数据集合中,不仅查找时间慢,还会占用大量存储空间,接下来看一下布隆过滤器如何解决这个问题...由于可能出现哈希碰撞,不同元素计算的哈希值有可能一样,导致一个不存在的元素有可能对应的比特位为1,这就是所谓“假阳性”(false positive)。...(1)当hash函数个数 k = (ln2) * (m/n)时,错误率E最小(此时bit数组中有一半的值为0) (2)在错误率不大于E的情况下,bit数组的长度m需要满足的条件为:m ≥ n * lg(...(3)结合上面两个公式,在hash函数个数k取到最优时,要求错误率不大于E,这时我们对bit数组长度m的要求是:m>=nlg(1/E) * lg(e) ,也就是 m ≥ 1.44n*lg(1/E)(lg

    45320

    为什么Java8中HashMap链表使用红黑树而不是AVL树

    作为参考,这是一个HashMap的Java 8 impl(它实际上有一个很好的解释,整个事情如何工作,以及为什么他们选择8和6,作为“TREEIFY”和“UNTREEIFY”阈值) 第二个问题为什么hash...AVL树中从根到最深叶的路径最多为~1.44 lgn + 2),而在红黑树中最多为~2 lgn + 1)。 因此,在AVL树中查找通常更快,但这是以更多旋转操作导致更慢的插入和删除为代价的。...两种实现都缩放为a O(lg N),其中N是叶子的数量,但实际上AVL树在查找密集型任务上更快:利用更好的平衡,树遍历平均更短。...删除:RB树具有恒定的最大旋转次数,但AVL树可以将O(log N)次旋转视为最差。并且平均而言,RB树也具有较少的旋转次数,因此RB树更快。 对于大数据: insert:AVL树更快。...这两个都给O(log n)查找,但平衡AVL树可能需要O(log n)旋转,而红黑树将需要最多两次旋转使其达到平衡(尽管可能需要检查O(log n)节点以确定旋转的位置)。

    1.3K20

    斯坦福NLP课程 | 第15讲 - NLP文本生成任务

    采样 在每个步骤 t,从 P_t 的前 n 个最可能的单词中,进行随机采样 与纯采样类似,但截断概率分布 此时,n = 1 是贪婪搜索,n = V 是纯采样 增加 n 以获得更多样化 / 风险的输出 减少...z_t 学会代表 x_t 对对话的影响,而不是 x_t 的 words 因此 z_t 将任务的策略方面从 NLG方面分离出来 这对可控制性、可解释性和更容易学习策略等是有用的 2.16 会话问答:CoQA...进行人类有效评估非常困难: 是不一致的 可能是不合逻辑的 失去注意力 误解了问题 不能总是解释为什么他们会这样做 3.7 可控聊天机器人的详细人工评估 [可控聊天机器人的详细人工评估] 在聊天机器人项目上工作的个人经验...人类是次优的会话主义者:他们在有趣,流利,倾听上得分很低,并且问的问题太少 3.8 NLG评估的可能新途径? [NLG评估的可能新途径?]...系统是否能愚弄经过训练能够区分人类文本和 AI 生成的文本的识别器 4.NLG研究的一些想法,目前的趋势,未来的可能方向 [NLG研究的一些想法,目前的趋势,未来的可能方向] 4.1 NLG中令人兴奋的当前趋势

    1K51

    PHP快速排序算法实现的原理及代码详解

    1, 2, 3, 4, 5, 6, 7, 8, 9, 10 use time: 0.0009009838104248s 时间复杂度 快速排序的时间复杂度在最坏情况下是O(N2),平均的时间复杂度是O(...N*lgN)。...这句话很好理解:假设被排序的数列中有N个数。遍历一次的时间复杂度是O(N),需要遍历多少次呢?至少lg(N+1)次,最多N次。 1) 为什么最少是lg(N+1)次?...快速排序是采用的分治法进行遍历的,我们将它看作一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的定义,它的深度至少是lg(N+1)。因此,快速排序的遍历次数最少是lg(N+1)次。...2) 为什么最多是N次?这个应该非常简单,还是将快速排序看作一棵二叉树,它的深度最大是N。因此,快读排序的遍历次数最多是N次。

    70240

    文心一言 VS 讯飞星火 VS chatgpt (279)-- 算法导论20.3 6题

    为了计算最小的操作数n,我们需要知道在vEB树中达到O(lg(u))摊还时间复杂度的操作数。...例如,如果每个操作都是O(lg(u)),那么最小的操作数nlg(u)的平方,因为摊还时间是对数级别操作次数的函数 // 请注意,这里的代码仅作为框架示例,不包含具体实现细节。...我们需要找到满足以下条件的最小 n: c * u <= n * d * log log u 由于我们无法直接解这个不等式来找到 n,因为 u 和 c、d 都是未知的,我们只能给出一个一般性的解释。...O(1),插入和删除的平摊复杂度为 O(lg u)。...根据这些复杂度,我们可以得到以下不等式: 2^lg n = n <= O(lg u) n <= 2^(lg lg u) 解这个不等式可以得到 n = O(lg u / lg lg u)。

    5920

    快速排序 QuickSort

    简单讲每次一个小排序都会选出等于区,然后排小于区和大于区 快排分两种 经典快排 比较基准为数组最后一个数 随机快排 比较基准为数组内随机一个数 快排时间复杂度O(N*logN) 额外空间复杂度O(logN...N2),平均的时间复杂度是O(N*lgN)。...这句话很好理解:假设被排序的数列中有N个数。遍历一次的时间复杂度是O(N),需要遍历多少次呢?至少lg(N+1)次,最多N次。 为什么最少是lg(N+1)次?...快速排序是采用的分治法进行遍历的,我们将它看作一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的定义,它的深度至少是lg(N+1)。因此,快速排序的遍历次数最少是lg(N+1)次。...为什么最多是N次?这个应该非常简单,还是将快速排序看作一棵二叉树,它的深度最大是N。因此,快读排序的遍历次数最多是N次。

    21330

    拜托,面试别再问我时间复杂度了!!!

    最烦面试官问,“为什么XX算法的时间复杂度是OO”,今后,不再惧怕这类问题。...规则三:“树的高度”的时间复杂度往往是O(lg(n))。 分析:树的总节点个数是n,则树的高度是lg(n)。 在一棵包含n个元素二分查找树上进行二分查找,其时间复杂度是O(lg(n))。...对一个包含n个元素的堆顶元素弹出后,调整成一个新的堆,其时间复杂度也是O(lg(n))。 第二大类:组合规则 通过简单规则的时间复杂度,来求解组合规则的时间复杂度。 例如:n个数冒泡排序。...调整堆 故,用堆求解TopK,时间复杂度为: O(k) + O(n) * O(lg(k)) = O(n*lg(k)) 画外音:注意哪些地方用加,哪些地方用乘;哪些地方是n,哪些地方是k。...将m=lg(n)带入,得到: f(n)=lg(n)*n+2^(lg(n))*f(1)=n*lg(n)+n 故,快速排序的时间复杂度是n*lg(n)。 wacalei,有点意思哈!

    21230

    重读算法导论之算法基础

    归并排序中对小数组使用插入排序优化 ​ 虽然归并排序的最坏情况运行时间为Θ(nlgn),而插入排序的最坏情况运行时间为Θ(n2),但是插入排序中的常量因子可能使得它在n较小时,在许多机器上实际运行得更快...证明:插入排序最坏情况可以在\(\Theta\)(nk)时间内排序每个长度为k的n/k个子表。 表明在最坏情况下如何在\(\Theta\)(nlg(n/k))时间内合并这些子表。...那么这个分组实际上一共经过了: lg(n/k) + 1次。又每一层合并所需时间为:cn。...所以最坏时间复杂度为: \(\Theta\)(nlg(n/k)) 如果修改后的归并排序时间与原来时间一致,则有: \(\Theta\)(nlg(n)) = \(\Theta\)(nk + nlg(n/k...)) \(\Rightarrow\) Θ(k+lg(n/k)) = Θ(lgn) \(\Rightarrow\) k的最大值应该为lgn 实践中,k的值应该选为使得插入排序比合并排序快的最大的数组长度。

    922100

    海量数据处理

    这种函数的时间复杂度是O(1),但是空间复杂度是O(n),其中n指的是关键字的个数。   ...(3)数字分析法   设关键字是d位的以r为基的数,且共有n个关键字,则关键字的每个位可能有r个不同字符出现,但这r个字符出现的频率不固定,可能在某些位上是俊宇的,即每个字符出现的次数接近于r/n,而在另外的一些位上分布不均匀...位图法排序的时间复杂度是O(n),比一般的排序快,但它是以时间换空间(需要一个N位的串)的,而且有一些限制,即数据状态不是很多,例如排序前集合大小最好已知,而且集合中元素的最大重复次数必须已知,最好数据比较集中...在错误率不大于E的情况 下,m至少要等于n*lg(1/E) 才能表示任意n个元素的集合。...但m还应该更大些,因为还要保证bit数组里至少一半为0,则m应 该>=nlg(1/E)*lge ,大概就是nlg(1/E)1.44倍(lg表示以2为底的对数)。

    2.1K140

    算法设计关于递归方程T(n)=aT(nb)+f(n)之通用解法

    同样,在f(n)不是多项式的时候也可以通过的这种方式得到方程的解。 二、f(n)是一般函数 当f(n)不是n的多项式的时候,计算就会变得比较复杂,有时可能会也找不到最终的解。...T(n/b)= 2T(n/22)+(n/2)lg(n/2)。 T((n/b2)= 2T(n/23)+ (n/22)lg(n/22)。...…… 于是得到:T(n)= nlgn+(nlgn-lg2)+ (nlgn-2lg2)+ (nlgn-22lg2)+···+(nlgn-2hlg2),h=lgn。...根据等差、等比数列求和公式化简有: T(n)=n(lgn)2 –(n-1)lg2,所以T(n)= O( n(lgn)2),而不是O( nlgn)。...通过这个例子可以看出,当f(n)不是多项式的时候计算就有可能变得比较复杂,甚至无法计算。但是通过Master定理以及具体的数学变换技巧在某些情况下还是可行的。

    1.6K70
    领券