【问题标题】:Pyramid pattern problem with O(n) Time Complexity? [closed]O(n) 时间复杂度的金字塔模式问题? [关闭]
【发布时间】:2021-03-10 00:37:25
【问题描述】:

最近,我看到有人要求解决方案,在 Facebook 群组中仅使用单个 while 循环在 N 行中打印 '*' 金字塔图案。

我发现该帖子中的大多数答案都是使用语言的语法糖(例如'*'*N;)或使用诸如.charAt() 之类的内置方法,例如,从技术上讲,这在该语法或方法中是循环的我猜?

当代码中只有 1 个循环时,我们如何计算时间复杂度?会算O(N)时间复杂度吗?

如果我们只使用会怎样

  1. 循环时
  2. 整型变量
  3. 标准 IO
  4. 否则条件

打印图案(如果可能的话?)

标准输出(如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


【解决方案1】:

如果n 是金字塔的高度或宽度,则briks/*s 的数量将为O(n^2)。三角形的面积是(height*width) / 2(因此O(n^2),其中n 是高度或宽度),而花哨的编程无法改变这一点。

但是,如果 n 没有定义,那么您可以将其定义为字符数 -- 然后您可以使用单个循环执行以下操作

/**
 * builds an asterisk pyramid with a single loop
 * n = number of characters in the pyramid, including spaces & line-breaks
 * (use n = 2*o*o, such as 32 (o=4 layers), if you want pretty pyramids)
 */
function pyramid(n) {
   let output = [];
   let ri = 0;                            // current position in row
   let nr = 1;                            // asterisks in next row; always odd
   let lr = Math.floor(Math.sqrt(2*n+1))-1; // longest row
   for (let i=0; i<n; i++) {
     if (ri >= lr) {                
        output.push("\n");         // output end-of-row
        nr += 2;                   // each row has one extra `*` on each side
        ri = 0;
     } else if (ri >= ((lr - nr)/2) && ri < (lr - (lr - nr)/2)) {
        output.push("*");          // output actual brick
        ri ++;
     } else {
        output.push(".");          // output space
        ri ++;
     }
   } 
   return output.join("");
}

// test with 1 to 4 layers
for (let i=1; i<5; i++) {
  let n = (2*i)*i;
  console.log(n + "\n" + pyramid(n));
}

【讨论】:

  • OP 将 N 定义为模式中的行数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
相关资源
最近更新 更多