在python中计算函数的复杂度hw

在python中计算函数的复杂度hw,python,function,loops,python-3.x,time-complexity,Python,Function,Loops,Python 3.x,Time Complexity,我需要计算函数的运行时间复杂度,单位为n(对于exmaple O(n)), n是len(lst),lst是列表类型的变量 这就是我的想法,对吗?(我需要找到最紧的约束!!!) 好的,这是一个相当复杂的问题,对于家庭作业来说也是一个相当有趣的问题 首先,很明显,如果n大于100000或不大于100000,您必须将问题分成两部分 如果n大于100000: 您将一次最多运行最里面的循环20000次(因为当j大于100000时,您的k循环将导致0次迭代)。 因此,对于每一个模拟,对于n大于50000的

我需要计算函数的运行时间复杂度,单位为n(对于exmaple O(n)), n是len(lst),lst是列表类型的变量

这就是我的想法,对吗?(我需要找到最紧的约束!!!)

好的,这是一个相当复杂的问题,对于家庭作业来说也是一个相当有趣的问题

首先,很明显,如果n大于100000或不大于100000,您必须将问题分成两部分

如果n大于100000:

您将一次最多运行最里面的循环20000次(因为当j大于100000时,您的k循环将导致0次迭代)。 因此,对于每一个模拟,对于n大于50000的部分,您将精确执行

总循环数。它给

。您必须添加i<50000(n<100000)部分的计算时间,其可写为

,

这给了我一个机会

这意味着,在n=100000以上,您的问题具有明显的O(n)复杂性,常数部分的大小小于线性部分的大小:

当n=100000以下时,棘手的部分就会出现。你可以在这里写字

,

可转化为:

此函数显示线性增加和平方减少。猜猜它的根在哪里…(几乎)正好在100000

计算总和并保留O(1)、O(n)和非重要部分:

你可以看到它的立方部分是负数,所以对于大的n-s,时间会低于0。但是你也可以看到,当n=100000时,平方部分仍然比立方部分大三倍,函数的最大值是n=200000。所以别担心,你不会进入消极时期,事实上,你甚至不会达到这个函数的最大值

你怎么解释呢?在最坏的情况下,你有O(n2)复杂度。但是你有一个更高的降阶,对于10万以下的大n-s,你可以比O(n2)预测的好很多(最多33%)

综上所述:

  • 如果n远小于100000:O(n2)
  • 如果n接近,但小于100000:略优于O(n2)
  • 如果n大于100000:O(n)
我运行了一个示例来衡量发生了什么。我使用了不同的数字(因为您最初的问题将永远存在),所以在我的例子中,您的100000阈值是100。您可以看到,在开始时,O(n2)工作正常,然后O(n2-n3)非常适合复杂度,最后,超过100,我们进入线性部分

对于较大的n-s(阈值仍为100):


其他人也有同样的作业:我想它应该是更接近O(n^2)的东西,不知道那些2i*2i来自哪里。我不确定最里面的循环。它实际上是恒定的时间,因为它不会执行超过20000次吗?@Tim:我也这么想。但不是常数时间:如果i<20000且常数大于20000,则为线性。我认为它是常数,因为它最终是以一个常数为界的,我不相信这是正确的。高于阈值时,
k
循环以恒定时间完成,而
i
j
循环的顺序为n。对于较大的n值,整体函数为O(n^2)。低于阈值时,所有循环的阶数均为n,使函数为O(n^3)。我用100的阈值为n的大值计时函数,它显然不是线性的@蒂姆:不仅是k循环,而且j循环在n>10^5的恒定时间内完成!因为只有范围内的j(10^5)部分会给你任何东西(这是一个常数),而范围内的j(10^5,n)不会做任何事情!我无法重现你的结果,我得到的线性相关性高达10000,阈值为100(见编辑后的答案)。另一方面,注意你的n^3部分是下降的,因为在内环中,大j-s跑得快,小j-s跑得慢!所以你有一个O(n3)依赖关系,但它是负的,前导部分只有O(n2)。
对于范围(i)中的j
将线性扩展-它不会在恒定时间内完成。听起来你对提问者使用了不同的代码。@Tim:我仍然不同意,但你完全有可能是对的。你应该把你的解决方案写下来作为OP的答案,我会尽力去理解它。