You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

打印X形图案的C++代码能否从O(n²)优化至O(n)时间复杂度?

X形图案打印复杂度优化问题

待优化原始代码

#include <iostream>
using namespace std;
int main() {
  // 打印X形的尺寸,建议使用奇数
  int size = 5;
  for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) { 
      if (i == j || i + j == size - 1) {
        cout << "*";
      } else {
        cout << " ";
      }
    }
    cout << "\n";
  }
  return 0;
}

原始代码运行输出

*   *
 * *
  *
 * *
*   *

复杂度优化结论

不存在严格符合算法复杂度定义的O(n)时间复杂度实现,原因如下:

  • n阶X形图案总共有n行,每行包含n个字符(含空格、星号),完整输出整个图案的总字符数是n²量级。所有需要逐字符生成、输出完整图案的逻辑,操作次数的理论下界是Ω(n²),不可能突破这个量级做到O(n)。
  • 网上流传的所谓"O(n)优化"本质都是降低常数开销的写法,没有改变复杂度量级:
    • 一类写法是预先构造每行的字符串,把内层逐位置判断的逻辑替换为直接修改两个星号位置、其余位置默认填充空格,比原始双层循环写法减少了条件判断次数,但构造长度为n的行字符串、输出整行的操作总次数依然和n²成正比,复杂度还是O(n²)。参考优化写法如下:
      #include <iostream>
      #include <string>
      using namespace std;
      int main() {
        int size = 5;
        for (int i = 0; i < size; i++) {
          string line(size, ' ');
          line[i] = '*';
          line[size - 1 - i] = '*';
          cout << line << '\n';
        }
        return 0;
      }
      
    • 另一类写法是跳过空格输出,通过控制终端光标位置直接在两个星号的对应位置打印字符,看似省略了空格输出步骤,但终端光标移动的操作开销和逐字符打印没有本质差异,总耗时依然随n²增长,不属于O(n)实现。

内容的提问来源于stack exchange,提问作者Anurag Dutta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:39:13