【发布时间】:2021-03-10 00:37:25
【问题描述】:
最近,我看到有人要求解决方案,在 Facebook 群组中仅使用单个 while 循环在 N 行中打印 '*' 金字塔图案。
我发现该帖子中的大多数答案都是使用语言的语法糖(例如'*'*N;)或使用诸如.charAt() 之类的内置方法,例如,从技术上讲,这在该语法或方法中是循环的我猜?
当代码中只有 1 个循环时,我们如何计算时间复杂度?会算O(N)时间复杂度吗?
如果我们只使用会怎样
- 循环时
- 整型变量
- 标准 IO
- 否则条件
打印图案(如果可能的话?)
标准输出(如printf())总是需要N x N 时间来打印包含'*' 星号和' ' 空格字符的模式如果我理解正确,每一行将是 theta(N^2) 时间复杂度?
或者是否有其他方法可以仅使用 O(N) 或 theta(N) 打印模式?
还是我完全错过了循环和时间复杂度的概念?
【问题讨论】:
-
天真地它会是
O(N^2)...但是取决于N是什么,也可能被认为是O(N),例如通过使用快速内存传输或DMA 较小的N 可能是考虑O(1)就像在 VGA 文本模式下使用直接 VRAM 访问 +memset... 或rep stosw... 例如在模式 3 中屏幕是80x25所以金字塔可能有最大 80x2 字节的行长,那就是不多,所以 n=1 和 n=80 之间的传输时间可能太小或无法测量...取决于使用的传输方法 -
"对于较小的 N 可能被认为是 O(1)" - 这是没有意义的。小 n 发生的事情与大 O 表示法无关。
-
@Ava 简单;你的
size变量被定义为n的二次函数,然后你循环了很多次。然后你在一个二次长度的字符串上调用printf,这也需要二次时间。根本不可能在线性时间内打印出二次字符数。 -
@Ava 我认为代码的“大小”变量显然是 O(n^2),因为它是 (n^2 + 3n)/2 (我知道它明显低于 n ^2) 但在大 O 中它被认为是 O(n^2)。并且它的迭代与通用的嵌套循环解决方案没有什么不同。
-
是的,实际上不可能像 kaya3 提到的那样在
O(n)时间打印此模式。但是如果你从另一个角度来看,我认为在不使用嵌套循环或仅使用单个循环的情况下打印星形图案可能是一个很好的挑战。 :)
标签: algorithm data-structures big-o