0

次のクレイジーなループ構造をより良い方法で書き直すことができるかどうか、誰か教えてもらえますか? 今、それは私が望むすべてを行います。

    // xi and yi stand for x and y axis input index
    for (int xi = 0; xi < this.inputNumberOfColumnsAlongXAxis; xi++)
    {
        for (int yi = 0; yi < this.inputNumberOfColumnsAlongYAxis; yi++)
        {
            InputCell inputCell = new InputCell(xi, yi);
            Synapse synapse = new Synapse(inputCell);
            // add (inputDataScaleReductionOnXAxis * inputDataScaleReductionOnYAxis)
            // number of synapses to a proximalSegment.
            for (int x = 0; x < this.numberOfColumnsAlongXAxis; x++)
            {
                for (int y = 0; y < this.numberOfColumnsAlongYAxis; y++)
                {
                    int inputX =
                        (int)Math.round(x * inputDataScaleReductionOnXAxis);
                    int inputY =
                        (int)Math.round(y * inputDataScaleReductionOnYAxis);
                    this.columns[(y * this.numberOfColumnsAlongXAxis) + x] =
                        new Column(this, inputX, inputY, x, y);

                    // only add the square of synapses directly under the proximal segment
                    while (xi < this.inputDataScaleReductionOnXAxis * (x + 1))
                    {
                        while (yi < this.inputDataScaleReductionOnYAxis * (y + 1))
                        {
                            this.getColumn(x, y).getProximalSegment().addSynapse(synapse);
                        }
                    }
                 }
             }
         }
     }
4

2 に答える 2

0

セルの 2-D データ構造と、セルの数であるO(N^3)初期化プロセスがあるようNです。それはちょっと高価に見えます...しかし、それは N が非常に大きいか、プロセスが頻繁に行われる場合にのみ重大な問題になります.

とにかく、明らかに単純化できるコードは何も見当たりません...現在のアルゴリズムが要件を反映していると仮定します。6 レベルのループが問題に固有のものであるように思われます。いくつかの計算はそのようなものです。

私が見ることができる唯一の可能性は、接続Nを伴うシナプスO(N^2)です(それがあなたがしていることだと思います)...どういうわけか非現実的です。つまり、このコードで解決しようとしている問題を実際に理解している場合にのみ、重要な改善を提案できます。


「原則として、複雑なものが機能する場合は、それをいじるな」と言っているわけではないことに注意してください。. 私が言っているのは、次のことです。

  • 本質的に改善できないものもあります...そしてこれはそのようなもののように見えます、そして
  • とにかく問題ではないかもしれません。たとえば、このコードが一度だけ実行された場合...

「それが機能する場合は、それを台無しにしないでください」は... IMO ...適切な考えを与えずにカーペットの下で問題をブラッシングするための悪い言い訳です.

そして、「通常、余分な時間と労力は何も生み出さないため、最適化を試みる必要はありません...」は、同じ言い訳の別の形式にすぎません。私にとっては、「私はとても良いので、最初のコードを改善することはできません」または「私はとても悪いので、まともな最適化を見つけることができません」または「残念です...顧客はまともなコードを期待するべきではありません.とにかくパフォーマンス」 .

これは、 「最適化する前にプロファイルを作成する」という標準の (そして有効な) アドバイスとは大きく異なることに注意してください。

于 2012-11-11T04:09:22.753 に答える
0

それはすべて、入力のサイズに依存します。これらのネストされたループの成長率は良くありません。つまり、入力のサイズが大きくなるにつれて、アルゴリズムの実行にかかる時間ははるかに速くなり、指数関数的に速くなります。ただし、入力が常に小さいことがわかっている場合は、そのままで問題ありません。

于 2012-11-11T04:14:28.680 に答える