C # сдвиг двумерного массива быстрый метод - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть двумерный строковый массив в C #, и мне нужно сместить этот массив влево в одном измерении, как я могу сделать это эффективным способом

Я не хочу использовать nested для и хочу алгоритм в O(n) не O (n 2 )

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

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Если вы хотите быстро перемещать большие объемы данных, используйте Array.Copy, а не цикл, который копирует отдельные символы.

Если вы переключаетесь в байтовый массив и используете Array.Copy или Buffer.BlockCopyВы, вероятно, улучшите производительность немного больше (но если вам придется конвертировать в / из символьных массивов, вы можете потерять все, что получили).

(правка: Теперь, когда вы опубликовали пример кода):Если вы используете ссылки на строки массива, вы можете сместить ссылки, а не перемещать сами данные.Любое, что вы все еще можете сместить ссылки, используя Array.Copy)

Но если вы измените свой подход, чтобы вам не нужно было сдвигать данные, вы получите значительно лучшую производительность - вообще не выполняете работу, еслиВы можете избежать этого всегда быстрее!Скорее всего, вы можете обернуть данные в слой доступа, который отслеживает, сколько данных было смещено, и изменяет ваши индексы, чтобы вернуть данные, которые вы ищете.(Это немного замедлит доступ к данным, но спасет вас от смещения данных, поэтому может привести к чистому выигрышу - в зависимости от того, сколько у вас доступа по отношению к тому, сколько вы смещаете)

2 голосов
/ 27 сентября 2011

Самый эффективный способ - вообще не сдвигать его, а вместо этого изменять способ доступа к массиву.Например, сохраните смещение, указывающее, где в измерении находится первый столбец.

...