在python中计算函数的复杂度hw
我需要计算函数的运行时间复杂度,单位为n(对于exmaple O(n)), n是len(lst),lst是列表类型的变量 这就是我的想法,对吗?(我需要找到最紧的约束!!!)在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大于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)
其他人也有同样的作业:我想它应该是更接近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的答案,我会尽力去理解它。