C++ 提高棋盘图案的时间复杂度

C++ 提高棋盘图案的时间复杂度,c++,algorithm,optimization,time-complexity,C++,Algorithm,Optimization,Time Complexity,我编写了一个程序来打印棋盘图案。 事情是这样的: (注释解释了逻辑和变量) #包括 #包括 #包括 #包括 #包括 使用名称空间std; int block_size=8//块大小*块大小是板上每个块的大小 int-dim=8//每行或每列上有8个块,每个块包含块大小*块大小像素 int res=尺寸*块大小//像素总数为res*res(分辨率) int main(){ int size=8; 向量向量向量机(res); 对于(inti=0;i

我编写了一个程序来打印棋盘图案。 事情是这样的: (注释解释了逻辑和变量)

#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int block_size=8//块大小*块大小是板上每个块的大小
int-dim=8//每行或每列上有8个块,每个块包含块大小*块大小像素
int res=尺寸*块大小//像素总数为res*res(分辨率)
int main(){
int size=8;
向量向量向量机(res);
对于(inti=0;i其中0您可以使用类似的内容(这是控制台中板归档的完整代码)

每个像素访问一次,就像在您的实现中一样,复杂性也是
O(res^2)
,但看起来更简单

对于
block_size
-s等于2的幂,
rx
ry
可以通过逐位运算来计算


您的时间复杂度已经是最佳的。当然,您对输入进行了几次传递,但该常数被忽略,复杂度归结为图像中的像素数(或O(边长2*块大小2)或O(res2),或者如果n是图像大小,则仅为O(n))

话虽如此,有很多重复的代码,你可以完全消除向量,这使得你的空间复杂度保持不变

这里有一个重写,只保留了基本内容:

#include <cstdlib>
#include <fstream>

int main() {
    int block_size = 8;
    int dim = 8;
    int res = dim * block_size;
    std::ofstream pgm("chessboard.pgm");
    pgm << "P2\n" << res << " " << res << "\n255\n";

    for (int i = 0; i < res; i++) {
        for (int j = 0; j < res; j++) {
            pgm << ((j / block_size + i / block_size) % 2 ? 255 : 0) << " ";
        }

        pgm << "\n";
    }

    pgm.close();
    return 0;
}
#包括
#包括
int main(){
int block_size=8;
int-dim=8;
int res=尺寸*块大小;
std::of Stream pgm(“chessboard.pgm”);

pgm棋盘有一个很好的模式。它交替使用偶数行(从黑色方块开始)和奇数行(从白色方块开始)。这表明了一种自然的程序结构:

    for (row_pair = 0; row_pair < dim / 2; row_pair++) {
        emit_row(something_even);
        emit_row(something_odd);
    }
和中一样使用

    void emit_row(line_t& line) {
        for (int i = 0; i < block_size; i++) {
            emit_line(line);
        }
    }
void emit\u行(行和行){
对于(int i=0;i
现在你可以

    for (row_pair = 0; row_pair < dim / 2; row_pair++) {
        emit_row(even_line);
        emit_row(odd_line);
    }
for(行对=0;行对

唯一剩下的事情就是弄清楚什么是
line\t
,以及如何准备一条细线。
emit
应该是不言而喻的。

欢迎这样做!我不太明白这是O(n^4).这里的n是什么?如果你访问每个像素一次或两次,那么我不知道你怎么能期望在这方面有任何复杂度的提高。嗨,我所说的n是指输入的大小。是的,这是真的,每个像素只访问了一次或两次,但我想可能有一个比我使用的算法更有效的算法。不,它不是O(n^4)。由于您必须访问每个像素一个固定的次数,并且您已经访问了每个像素一个固定的次数,因此您无法提高复杂性。不过,您可以提高效率。效率与复杂性不同。或者类似于
vec[y][x]=((y/block_size)+(x/block_size))%2==0?0:255;
(块x+块y的奇偶校验)
。@Jarod42是的,这更简单
    for (row_pair = 0; row_pair < dim / 2; row_pair++) {
        emit_row(something_even);
        emit_row(something_odd);
    }
    line_t even_line = prepare_even_line(block_size);
    line_t odd_line = prepare_odd_line(block_size);
    void emit_row(line_t& line) {
        for (int i = 0; i < block_size; i++) {
            emit_line(line);
        }
    }
    for (row_pair = 0; row_pair < dim / 2; row_pair++) {
        emit_row(even_line);
        emit_row(odd_line);
    }