如何解决n阶乘函数的正确时间复杂度是多少?
我对这个话题非常陌生,我正在尝试掌握与渐近符号有关的所有内容。我想请您对以下问题发表意见:
如果对于一个算法,我们有 T(n)= n!,那么我们可以说其时间复杂度为:
1 x 1 x 1 ... x1 <= n! <= n x n x n ... x n
此关系表示n! = O(n ^ n)和n! =Ω(1)。但是,我们不能做得更好吗?我们希望big-oh尽可能接近函数T(n)。如果我们执行以下操作:
n! <= 1 x 2 x 3 x 4 ... x n x n
也就是说,对于倒数第二个元素,我们将(n-1)替换为n。现在这种关系不是真的吗? n是不是真的! = O(1 x 2 ... x n x n)?对于下限Ω可以说类似的话。
我不确定我的流程中是否有错误,因此,非常感谢您的输入。预先感谢。
解决方法
数学陈述n! = O(1 x 2 ... x n x n)
是正确的。但是也没有很大的帮助或启发。您想在什么情况下写n! = O(...)
?
您对n! = n!
很满意,也不需要写n! = O(1 x 2 ... x n x n)
。否则您对n! = n!
不满意;您想要更好地解释n!
有多大的东西;那么您也不应该对n! = O(1 x 2 ... x n x n)
感到满意,因为它并不容易理解。
我个人对多项式感到满意,例如n^2
。我对指数很满意,例如2^n
。我对n^n
也有些满意,因为我知道n^n = 2^(n log n)
,而且我也知道我不希望为n^n
找到更好的表达方式。
但是我对n!
不满意。我希望能够将其与指数进行比较。
这里有两个比较:
n! < n^n
2^n < n!
第一个是通过乘积中的每个因子n
的上限获得的;第二个是通过将乘积中的每个因子下限2
来获得的。
那已经很不错了;它告诉我们n!
在指数2^n
和超指数n^n
之间。
但是您可以很容易地看出上限n^n
太高;例如,您可以轻松找到以下更严格的界限:
n! < n^(n-1)
n! < 2 * n^(n-2)
n! < 6 * n^(n-3)
请注意,n^(n-3)
大时,n^n
比n
小很多!这样会好一些,但仍然不能令人满意。
您甚至可以走得更远,注意一半的因素小于n/2
,因此:
n! < (n/2)^(n/2) * n^(n/2) = (1/2)^(n/2) * n^n = (n / sqrt(2))^n =~ (0.7 n)^n
这是一个更严格的上限!但是我们可以做得更好吗?我仍然不满意。
如果您都不满意,我建议您阅读:https://en.wikipedia.org/wiki/Stirling%27s_approximation
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。