2

次のように、内向きのスパイラルでグリッドを反復処理するこの c# コードがあります。

1 2 3
8 9 4
7 6 5

これがコードですが、何か問題があります。何らかの理由で、計算に予想よりもはるかに時間がかかっています。なぜこれが起こっているのか誰にも分かりますか?

    static void create_spiral_img(int width, int height)
    {
        Bitmap img = new Bitmap(width, height);
        Graphics graph = Graphics.FromImage(img);

        int x = 0;
        int y = 0;
        int size = width * height;
        int max = size;
        int count = 1;
        int i, j;
        while (size > 0)
        {
            for (i = y; i <= y + size - 1; i++)
            {
                draw_pixel(count++, x, i, graph);
            }

            for (j = x + 1; j <= x + size - 1; j++)
            {
                draw_pixel(count++, j, y + size - 1, graph);
            }

            for (i = y + size - 2; i >= y; i--)
            {
                draw_pixel(count++, x + size - 1, i, graph);
            }

            for (i = x + size - 2; i >= x + 1; i--)
            {
                draw_pixel(count++, i, y, graph);
            }

            x = x + 1;
            y = y + 1;
            size = size - 2;
            Console.Write(100 * ((float)(count) / (float)max) + "% ");
        }

        graph.Dispose();
        img.Save("./" + width + "x" + height + "_spiril.png", System.Drawing.Imaging.ImageFormat.Png);
        img.Dispose();
    }
4

2 に答える 2

2

正方形 (幅 = 高さ) を想定すると、O(x^4) の実装があるように見えます。これは非常に遅くなります。

O(x ^ 2)にドロップダウンすることをお勧めします。らせん状に描画する代わりに、アルゴリズムを書き直して長方形に描画します。つまり、行と列をたどって、各ピクセルがどうあるべきかを計算します。

于 2013-03-05T22:48:49.673 に答える
0

仮定して

draw_pixel(c,x,y,g)

グラフgの(x、y)座標に色cの点を描画しますが、行き過ぎです。あなたはやっている

for (i = y; i <= y + size - 1; i++)

長さ幅が必要な行を印刷しますが、長さサイズの行を印刷します。

私はあなたのアルゴリズムを理解していなかったと思います。これが意味をなさない場合は、draw_pixelのセマンティクスを説明していただけますか?

于 2013-03-06T01:15:48.977 に答える