当前位置: 首页 > 知识库问答 >
问题:

n阶乘时间函数的正确时间复杂度是多少?

卫俊力
2023-03-14

我对这个话题很陌生,我正试图掌握与渐近符号相关的一切。我想就以下问题征求你的意见:

如果我们有,对于一个算法,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)?对于下限Ω也可以这样说。

我不确定我的过程中是否有错误,所以我非常感谢您的意见。提前谢谢。

共有1个答案

宗政博文
2023-03-14

数学语句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! 

第一个是通过将乘积中的每个因子增加< code>n得到的;第二个是通过将乘积中的每个因子降低< code>2得到的。

这已经很好了。它告诉我们< code>n!介于指数2^n和超指数n^n.之间

但是你可以很容易地看出上限n^n太高了;例如,您可以非常轻松地找到以下更严格的界限:

n! < n^(n-1)
n! < 2 * n^(n-2)
n! < 6 * n^(n-3)

请注意,当n很大时,n^(n-3)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's_approximation

 类似资料:
  • 我遇到了一个问题,需要计算非常大的阶乘的值。我用两种不同的方法在C中解决了这个问题,但只想知道我的复杂性分析是否准确。 在任何一种方法中,我都将非常大的数字表示为向量,其中表示最低有效数字,最后一个索引处的值表示最高有效数字。版本1的代码可以在这个要点中找到。 给定上面的代码,似乎是其中是给定的整数,是向量表示的数字。我的逻辑是,我们将执行一些与结果数字的长度成比例的步骤,以便生成一个表示的向量。

  • 问题内容: 我当时在看这个pycon演讲,时间是34:30,发言人说,可以在中完成获取元素列表中最大的元素的操作。 那怎么可能?我的理解是,创建堆将是,但是其本身的复杂性是还是(以及(实际的算法是什么))? 问题答案: 扬声器在这种情况下是错误的。实际费用为。仅在可迭代的第一个元素上调用堆化。就是那个,但如果小于,则微不足道。然后,将所有剩余的元素一次通过添加到此“小堆”中。每次调用需要花费时间。

  • 好的,第一个for循环显然是。第一个迭代是,第二个迭代是。我想是不是就像那个次数?这意味着。我说对了吗? 编辑:(不是复制品)我知道大O是什么。我在一个具体的案例中询问了正确的评估。

  • 我写了一个函数来寻找目标值在给定数组中应该插入的位置。我们假设数组有不同的值,并按升序排序。我的解必须是O(log N)时间复杂度 此代码的复杂性是否为O(log N)?

  • 比方说MD5或SHA-1?这两者的时间复杂度是多少?我试图在网上找到它,但它非常有限,我得到的只是它们都是O(n)。有人能进一步启发我吗?也许给我一个最坏的情况和最好的情况?

  • 我在考虑如何正确计算这个函数的时间复杂度: 我假设它是 O(n),其中 n 是列表的长度。我们的 while 循环是 O(n),for 循环也是 O(n), 这意味着我们得到了 2*O(n),等于 O(n)。 我说的对吗?