java - 如何计算算法的复杂度?
问题描述
int sum = 0;
for (int n = N; n > 0; n /= 2)
for(int i = 0; i < n; i++)
sum++;
int sum = 0;
for (int i = 1 i < N; i *= 2)
for (int j = 0; j < i; j++)
sum++;
int sum = 0;
for (int i = 1 i < N; i *= 2)
for (int j = 0; j < N; j++)
sum++;
我已经为此痛苦了很长时间。我仍然是一名二年级学生,但我仍然无法计算算法的复杂性。我该如何计算呢?我觉得自己很无能,因为我似乎从来没有得到它!
例如,for 循环的复杂度总是 N 吗?怎么知道?你能推荐任何我可以阅读的资源吗?有视频吗?
解决方案
那么您的第一个和第二个示例是相同的(就时间复杂度而言)。对于他们来说,时间复杂度是 O(N)。为什么。让我们计算一下。对于第一个示例,您的内部循环运行 N 次,然后是 N/2 次,然后是 N/4 并上升到 1。因此,时间复杂度为 O(N+N/2+N/4+..+1 ) 并且这个 GP 的总和是 (2n-1)。因此,第一种情况的时间复杂度为O(N)。
对于第二个示例,您的内部循环运行 1 次,然后运行 2 次、4 次,然后上升到 N。因此,时间复杂度为 O(1+2+4+...+N) 和此 GP 的总和是 2 log(N+1) -1 等于 N。因此,第二种情况的时间复杂度也是O(N)。
对于第三个示例,第一个循环运行 log(N) 时间,内部循环运行 N 时间,并且由于它们中的每一个都是独立的,因此所需的时间复杂度为O(NlogN)。(所有计算均为近似值,所有对数基数均为 2)
好吧,要了解 for 循环的时间复杂度,您必须查看为“i”分配了多少次值(可以相同或不同)。
要了解时间复杂度,请查看hackerearth 资料,每次编写算法时,尝试计算其时间复杂度。它是学习它并检查 Masters theorem 的递归关系的最佳方法,但也知道它的基本原理。
推荐阅读
- powershell - 如何通过 Azure DevOps Release Pipeline 中的 Azure Powershell 更新暂存槽的 IP 白名单?
- c# - 当我只想要一个时引用了两个版本的控件
- java - 安卓应用、Android 8(.1)、90% 华为设备中的 ANR 和崩溃
- jquery - 1 个抽屉打开时的切换逻辑
- mysql - MySQL 触发器错误:根据另一个表更新或插入更新一个表的字段值
- performance - 涡轮增压 Ansible 剧本
- javascript - 如何在特定数字处停止 javascript 计数器
- javascript - 如何在 React 中使用来自 aws 的 GraphQL Get 查询
- angular - 角度父母到孩子
- python - 如何使用python遍历angularjs下拉菜单的元素