2011-09-27 6 views
-3

私はC#での2D文字列配列を持っていると私は効率的な方法でC#シフト2次元配列速い方法

は、私は入れ子に使用したくないことを行うことができますどのように一次元 で左にその配列をシフトする必要があると私は、最も効率的な方法がすべてでそれをシフトするが、代わりにあなたは、配列にアクセスする方法を変更しないことであろう(n)はありませんO(nは)

for (int i = 50; i < 300; i++) 
{ 
    for (int j = 0; j < 300; j++) 
    { 
     numbers[i-50, j] = numbers[i, j]; 
    } 
} 
+1

"左に?"これまでに何を試しましたか?うまくいくものはありますか? –

+0

が入れ子になっているので、これはうまくいきます! –

+0

FYIあなたが投稿したコードは 'O(n)'です(nは配列内の要素の数です) – Justin

答えて

2

大量のデータをすばやく移動する場合は、個々の文字をコピーするループではなく、Array.Copyを使用します。

バイト配列にスワップし、Array.CopyまたはBuffer.BlockCopyを使用すると、パフォーマンスがさらに向上します(ただし、文字配列に変換する必要がある場合は、得られたすべてが失われる可能性があります)。

(編集:サンプルコードを投稿したので):配列行への参照を使用すると、データ自体を移動する必要がなく、参照を移動することができます。いずれも、Array.Copyを使用して参照を移動することはできます)

しかし、データをシフトする必要がないようにアプローチを変更すると、パフォーマンスは大幅に向上します。それが常により速くなるのを避けてください!データがシフトされた量を追跡し、後のデータを返すためにインデックスを変更するアクセサーレイヤー内のデータをラップすることができます。 (これにより、データへのアクセスはわずかに遅くなりますが、データをシフトすることはできません。シフト量に応じてどれくらいアクセスするかに応じて、純粋な勝利につながる可能性があります)

2

Oでalgurithmをしたいです。たとえば、最初の列がディメンションのどこにあるかを示すオフセットを保持します。