time-complexity - 这两个while循环的时间复杂度
问题描述
x = 1;
while(x<n)
{
x = x + n / 10;
m = n*n
y = n;
while(m>y)
{
m=m-100;
y=y+20;
}
}
我解决的方法:我们每次都加到n的x 1/10,所以不管n有多大,我们做的重复次数总是10。内循环是从n到n^2,并且其中的每个变量都是线性增加的,所以内循环应该是 O(n)
因为外循环是 O(1),所以我们得到所有函数的 O(n)。但该问题的可选答案是:O(n^2), O(n^3), O(n^4), O(nlogn)
我错过了什么?谢谢。
解决方案
外循环运行恒定次数(10 次)是正确的,但您对内循环的推理并不完全正确。您说内部循环的每次迭代都有一个“线性增加”,如果是这种情况,那么整个函数在 O(n) 中运行是正确的,但事实并非如此。尝试从这里弄清楚,但如果你仍然卡住:
内部循环必须根据 m 和 y 之间的差异来弥补 n^2 和 n 之间的差异。每次迭代时,m 和 y 之间的差异会减少一个常数:120,而不是线性量。因此内循环运行 (n^2 - n)/120 次。将外循环运行的次数乘以内循环运行的次数,我们得到:
O(10) * O((n^2 - n)/120)
= O(1) * O(n^2)
= O(n^2)
推荐阅读
- r - 如何在 ggpairs 函数中定义刻面轴限制
- java - 在 main 或方法中尝试 Catch
- android - 无法在 attachBaseContext() 中使用 dagger-injected 对象来更新语言环境
- java - @WebMvcTest 测试类中的 NoSuchBeanDefinitionException
- sql-server - 如何创建一个始终返回传递给其 WHERE 子句的值的表(或其他对象),如镜像
- python - 在单个模型的多个模型中使用外键时出现 django 错误
- php - PHP Array 如何使所有数组具有相同的长度
- angular - 如何以角度打印HttpRequest标头
- amazon-cloudformation - 无服务器框架 - 获取 API 网关 URL 以用于测试
- qt - 组合框qml的动态翻译