algorithm - 印了多少颗星?
问题描述
for(int i = 0; i < N; i = i+1)
for(int j = i; j > 0; j = j/2)
StdOut.print("*");
以下是可能的答案:
A) O(log N),
B) O(N),
C) O(N log N),
D) O(N^2)
我知道答案是 C),但我们对为什么会这样感到困惑。
解决方案
A
, B
,也C
不能D
回答“打印了多少颗星?”这个问题。因为它们实际上都不是数字。但是,如果您的实际问题是“此代码的星印复杂性是多少?”,您只需检查两个循环 :-)
外循环运行N
时间,所以这更容易一点。是N
。
内循环从j
(i
所有外循环的平均值约为N / 2
)开始,每次迭代将其减半。所以,如果i
是1024
,那将是大约十次迭代。如果512
,大约九,256
大约八,等等。
这显然是一种对数情况,内部循环运行多次与.log2N
而且,由于您在另一个循环中运行一个循环,因此您将各个复杂性相乘以O(N log N)
获得(我们在复杂性分析中并没有真正使用对数底)。
推荐阅读
- javascript - 如何在浏览器控制台中禁用 Javascript 错误消息?
- c# - 在LabVIEW中从.NET事件中获取EventArgs
- java - Springboot如何在服务器重启时轮换日志文件
- sql - 关于 groupby 原因的 Sql Query 问题和错误
- angular - 将任何输入中按下的键转换为大写
- c# - c# WPF App.Current 在自定义对话框窗口关闭后变为空
- javascript - 有没有同时涵盖 Null 和 Undefined 的词?
- ruby-on-rails - 如何解决 Google Cloud Rails 部署问题
- r - 尝试使用 dplyr 在 R 中查找行总和,然后过滤掉列
- javascript - node.js - 将使用 'space.repeat' 缓冲在浏览器中的工作方式相同