Python 如何计算这些函数的时间复杂度

Python 如何计算这些函数的时间复杂度,python,time-complexity,Python,Time Complexity,我试图计算函数f1的时间复杂度,但这对我来说并不实际0循环运行log(n-1)次。因此基本上对于第一次运行O(n)f1的时间复杂度(来自对函数aux1的调用) 但是现在对于循环,我们继续调用aux1withn=n-1,n-2,n-3。。。1,我对如何从这里继续计算时间复杂度或是否在正确的轨道上感到有点困惑 提前感谢您的帮助和解释 要找到这些因素,我不建议用替代法来解决这类问题,而是尝试采用一种方法,即根据函数尝试执行的操作数来计算函数的顺序 让我们先检查下一行来分析它 def f1(n):

我试图计算函数
f1
的时间复杂度,但这对我来说并不实际<如果您对我的工作有任何反馈,我将不胜感激
我正在做的是:我首先尝试替换
I=1
并尝试进行迭代,因此函数使用
m=n-1
调用
aux
,并且
aux1
迭代
n-1
次,并返回
m=n-1
,因此现在在
f1
中我们有
k=n-1
,而
whilek>0
循环运行
log(n-1)
次。因此基本上对于第一次运行
O(n)
f1的时间复杂度(来自对函数
aux1
的调用)
但是现在对于循环,我们继续调用
aux1
with
n=n-1,n-2,n-3。。。1
,我对如何从这里继续计算时间复杂度或是否在正确的轨道上感到有点困惑

提前感谢您的帮助和解释

要找到这些因素,我不建议用替代法来解决这类问题,而是尝试采用一种方法,即根据函数尝试执行的操作数来计算函数的顺序

让我们先检查下一行来分析它

def f1(n):
   for i in range(n):
      k = aux1(n - i)
      while k > 0:
         print(i*k)
         k //= 2
def aux1(m):
   jj = 0
   for j in range(m):
      jj += j
   return m
这将毫无疑问地运行O(n)

for i in range(n):
上述行的复杂度为O(n*aux1(n-i)的复杂度)

让我们找出aux1(n-i)->的复杂度,因为只有一个for循环,它也将为O(n)运行,因此上面这行的复杂度将为O(n*n)

现在while循环的复杂度为O(n*while循环的复杂度)

这将运行log(k)次,但k等于(n-i),顺序为O(n)

因此,log(k)将是log(n)。使复杂性为O(log(n))

因此while循环的复杂度为O(n*log(n))

现在增加了整体的复杂性

O(nn)(aux1(n))的复杂度+O(nlog(n))(while循环的复杂度)


以上可以用O(n^2)来描述,因为大oh函数需要上限。

为了找到这些因素,我不建议用替代法来解决这类问题,而是尝试采用一种方法,即根据函数尝试执行的操作数来计算函数的顺序

让我们先检查下一行来分析它

def f1(n):
   for i in range(n):
      k = aux1(n - i)
      while k > 0:
         print(i*k)
         k //= 2
def aux1(m):
   jj = 0
   for j in range(m):
      jj += j
   return m
这将毫无疑问地运行O(n)

for i in range(n):
上述行的复杂度为O(n*aux1(n-i)的复杂度)

让我们找出aux1(n-i)->的复杂度,因为只有一个for循环,它也将为O(n)运行,因此上面这行的复杂度将为O(n*n)

现在while循环的复杂度为O(n*while循环的复杂度)

这将运行log(k)次,但k等于(n-i),顺序为O(n)

因此,log(k)将是log(n)。使复杂性为O(log(n))

因此while循环的复杂度为O(n*log(n))

现在增加了整体的复杂性

O(nn)(aux1(n))的复杂度+O(nlog(n))(while循环的复杂度)


以上可以用O(n^2)来描述,因为大oh函数需要上限。

这很愚蠢,但可以一步一步地解决

内环每次对半
k
,因此其时间复杂度为
O(log(aux1(n-i))

现在什么是aux1(n-i)?它实际上只是
n-i
。但是运行它有时间复杂性
n-i
,因为有多余的奇怪的额外循环

好的,现在对于内部内容,我们有一部分时间复杂性
n-i
和一部分时间复杂性
log(n-i)
,所以使用时间复杂性规则,我们可以忽略较小的部分(日志),而专注于较大的部分,即O(n-i)`


现在外循环的
i
0
运行到
n
,这意味着我们的时间复杂度将是
O(n^2)
,因为1+2+3+…+n=O(n^2)

这一切都很愚蠢,但可以一步一步地解决

内环每次对半
k
,因此其时间复杂度为
O(log(aux1(n-i))

现在什么是aux1(n-i)?它实际上只是
n-i
。但是运行它有时间复杂性
n-i
,因为有多余的奇怪的额外循环

好的,现在对于内部内容,我们有一部分时间复杂性
n-i
和一部分时间复杂性
log(n-i)
,所以使用时间复杂性规则,我们可以忽略较小的部分(日志),而专注于较大的部分,即O(n-i)`


现在外循环的
i
0
运行到
n
,这意味着我们的时间复杂度将是
O(n^2)
,因为1+2+3+…+n=O(n^2)

我认为因为每次迭代都是
O(n)
并且有
n
次迭代,所以总体复杂度是
O(n^2)
。我认为因为每次迭代都是
O(n)
次迭代,所以总体复杂度是
O(n^2)
。请注意,
aux
函数很傻:
aux1(m)
只是返回
m
,循环只是为了增加额外的复杂性……好的。我认为这是一个书写错误。请等待下一次编辑。请注意,
aux
函数很傻:
aux1(m)
只是返回
m
,循环只是为了增加额外的复杂性…好的。我认为这是一个书写错误。请等待下一次编辑。