algorithm - 查找嵌套循环的复杂性
问题描述
所以我有这个非常复杂的嵌套循环,我需要找到它的复杂性。代码如下:
1. int c = 0;
2. for (int i = 1; i <= n; i++)
3. for (int j = 1; j <= n; j++)
4. for (int k = 1; k <= i + j; k += 3)
5. c++;
6. return c;
所以我知道复杂性在O(n^3)中,但我需要知道如何在数学上证明。下面显示了每行的执行频率。
1. 1
2. n
3. n(n-1)
4. No idea how to do this
5. No idea
6. 1
有人可以帮我完成第四步和第五步吗?当 k 从 1 变为 (i+j) 时,这真的很令人困惑。
解决方案
我们可以用数学方法证明复杂性。迭代总数可以表示为(不幸的是不支持乳胶)
sum_j=1^n sum_i=1^n (i + j) / 3
如果您绘制i
和j
值及其总和的网格i + j
,您也可以看到这一点。
这相当于
sum_j=1^n {[n(n + 1)/2 + nj] / 3}
可以进一步简化为
{n[n(n + 1)/2] + n[n(n + 1)/2] / 3}
评估后给出
(n^3 + n^2) / 3
这是顺序O(n^3)
。
可以以编程方式证明步长为 1 而不是 3 的迭代次数(Python 中的代码)
c = 0
n = 4 # change n for testing, slow
for i in range(1, n + 1):
for j in range(1, n + 1):
for k in range(1, i + j + 1):
c += 1
assert(c == (n ** 3 + n ** 2))
推荐阅读
- keras - 训练后如何计算 BiGAN 鉴别器损失
- flutter - Flutter 无法更新动态 TextEditingController 文本
- python - ValueError:Series.replace 不能使用 dict-value 和 non-None to_replace
- laravel - Laravel:更新数据时在 null 上调用成员函数 getClientOriginalName()
- javascript - 在 Next.js 中连接到 Google 电子表格时出错
- css - 如何修改 CSS 文本动画
- linux - 如何查看我在 linux 共享虚拟主机中可用和使用的配额大小?如果我无权访问“配额”命令
- python - 我的 python Minecraft 副本有问题
- mysql - 如何使用 where 条件计算值,我们可以根据其他表日期放置开始日期和结束日期
- python - 如何让docker容器连续运行?