C# に 2D 文字列配列があり、その配列を 1 次元で左にシフトする必要があります。効率的な方法でそれを行うにはどうすればよいですか?
ネストされた for を使用したくないので、O(n 2 )ではなく O(n) のアルゴリズムが必要です
for (int i = 50; i < 300; i++)
{
for (int j = 0; j < 300; j++)
{
numbers[i-50, j] = numbers[i, j];
}
}
C# に 2D 文字列配列があり、その配列を 1 次元で左にシフトする必要があります。効率的な方法でそれを行うにはどうすればよいですか?
ネストされた for を使用したくないので、O(n 2 )ではなく O(n) のアルゴリズムが必要です
for (int i = 50; i < 300; i++)
{
for (int j = 0; j < 300; j++)
{
numbers[i-50, j] = numbers[i, j];
}
}
最も効率的な方法は、シフトしないで、代わりに配列へのアクセス方法を変更することです。たとえば、ディメンションの最初の列がどこにあるかを示すオフセットを保持します。
大量のデータをすばやく移動する場合は、Array.Copy
個々の文字をコピーするループではなく使用してください。
バイト配列に交換してArray.Copy
orBuffer.BlockCopy
を使用すると、おそらくパフォーマンスがもう少し向上します (ただし、文字配列との間で変換する必要がある場合は、得たものすべてを失う可能性があります)。
(編集:サンプルコードを投稿したので):配列行への参照を使用すると、データ自体を移動するのではなく、参照をシフトできる場合があります。Array.Copy を使用して参照をシフトすることもできます)
しかし、データをシフトする必要がないようにアプローチを変更すると、パフォーマンスが大幅に向上します。回避できる場合は、作業をまったく行わない方が常に高速です。データがどれだけシフトされたかを追跡し、インデックスを変更して目的のデータを返すアクセサーレイヤーでデータをラップできる可能性があります。(これにより、データへのアクセスがわずかに遅くなりますが、データをシフトする手間が省けるため、シフト量に対するアクセス量に応じて、最終的に利益が得られる可能性があります)