Python 如何找到该函数的时间复杂度? def f1(n): cnt=0 对于范围(n)中的i: 对于范围(n)内的j: k=1 当k=n^2,这会给我k>=log(n),但我必须错过这之前的所有迭代,我很高兴知道如何计算它们非常感谢您的帮助,提前谢谢 编辑: 在Prune的帮助下,我做到了这一点:我们试图计算内部循环的迭代次数,即log(I*j) 取i=2我们得到log(2)+log(j)(n次),即n+log(1)+log(2)+…+log(n) 所以我们有n+log(n!)对于每个i=0,1,…,n基本上n(n+log(n!))。这是O(n^2)或O(nlog(n!))。由于这是我的第一次会议log(n!)我不确定哪个是时间复杂性。

Python 如何找到该函数的时间复杂度? def f1(n): cnt=0 对于范围(n)中的i: 对于范围(n)内的j: k=1 当k=n^2,这会给我k>=log(n),但我必须错过这之前的所有迭代,我很高兴知道如何计算它们非常感谢您的帮助,提前谢谢 编辑: 在Prune的帮助下,我做到了这一点:我们试图计算内部循环的迭代次数,即log(I*j) 取i=2我们得到log(2)+log(j)(n次),即n+log(1)+log(2)+…+log(n) 所以我们有n+log(n!)对于每个i=0,1,…,n基本上n(n+log(n!))。这是O(n^2)或O(nlog(n!))。由于这是我的第一次会议log(n!)我不确定哪个是时间复杂性。,python,time-complexity,Python,Time Complexity,我试图分析此函数的时间复杂度f1,在处理循环中的k=I*j时,但是我在处理如何每次计算I*j并找到总体时间复杂度方面遇到了困难。我知道最后我会有2^k>=n^2,这会给我k>=log(n),但我必须错过这之前的所有迭代,我很高兴知道如何计算它们非常感谢您的帮助,提前谢谢 编辑: 在Prune的帮助下,我做到了这一点:我们试图计算内部循环的迭代次数,即log(I*j) 取i=2我们得到log(2)+log(j)(n次),即n+log(1)+log(2)+…+log(n) 所以我们有n+log(n!

我试图分析此函数的时间复杂度
f1
,在处理循环中的
k
时遇到了一些问题
我的观点:
我试图找到内部循环的迭代次数,所以我基本上试图找到的是当
2^k>=I*j
时,但是我在处理如何每次计算
I*j
并找到总体时间复杂度方面遇到了困难。我知道最后我会有
2^k>=n^2
,这会给我
k>=log(n)
,但我必须错过这之前的所有迭代,我很高兴知道如何计算它们

非常感谢您的帮助,提前谢谢

编辑:
在Prune的帮助下,我做到了这一点:我们试图计算内部循环的迭代次数,即
log(I*j)

i=2
我们得到
log(2)+log(j)
(n次),即
n+log(1)+log(2)+…+log(n)


所以我们有
n+log(n!)
对于每个
i=0,1,…,n
基本上
n(n+log(n!))
。这是
O(n^2)
O(nlog(n!))
。由于这是我的第一次会议
log(n!)
我不确定哪个是时间复杂性。

为了方便起见,让
m=I*j
。 正如您所注意到的,您在执行
的同时
循环
log(m)

您缺少的复杂性数字是总和:

def f1(n):
   cnt = 0
   for i in range(n):
      for j in range(n):
         k = 1
         while k < i*j:
            k *= 2
            cnt += 1
  return cnt
用实际数字来解决这个问题会有帮助吗?例如,尝试外部循环的一次迭代,i=2。此外,我们将简化
log
表达式:

sum([log(i*j)
        for j in range(n)
        for i in range(n)])
为了方便起见,使用base 2日志,并将其分离,我们有

sum([log(2) + log(j) for j in range(n)])
这是你的开始。现在,需要找到sum(log(j))的封闭形式,然后求i=0,n的和

你能从那里拿走吗


OP更新后

sum(log(j))
所需的封闭形式实际上是
log(n!)


这不是简单的“go
n
times`:这是整个范围内log(i)*n+log(n!)的总和。

我想我明白了,我会尝试向你展示我的计算,因为我不太确定。首先,我们试图找到“log(i*j)”所有迭代的总和,为此我们拆分log(i)+log(j)以i为例,我想第一次迭代是当i=2时,会是(n+log(1)+log(2)+log(3)+…+log(n))=(n+log(n!)。但这只是一个数字例子,所以它应该运行n次,所以整个总和是:n*(n+log(n!)。所以时间复杂度是O(n^2)或O(nlog(n!))?是的,在某种程度上,您的操作是正确的。请将此添加到您的问题中;在评论中很难阅读。非常感谢您的帮助,很抱歉在这样的评论中写入此内容,我不知道在这里单击以编写代码,我编辑了我的问题,解释了我所做的,我非常感谢您的帮助。
n*1 + sum([log(j) for j in range(n)])