Мне нужно сместить вправо и влево массив на N мест.
Элементы, которые появляются на той стороне, на которую я смещаюсь, должны вернуться на другую сторону.
Сдвиг вправо на 13:
[0,1,2,3,4,5,6,7,8,9] -> [7,8,9,0,1,2,3,4,5,6]
Сдвиг влево на 15:
[0,1,2,3,4,5,6,7,8,9] -> [5,6,7,8,9,0,1,2,3,4]
Эта операция будет происходить миллионы рази должен быть очень быстрым.
Моя текущая реализация следующая.Пожалуйста, посмотрите и предложите, если есть какая-то оптимизация.
if (shift > 0)
{
int offset = array.Length % shift;
if (offset > 0)
{
byte[] temp = new byte[offset];
if (!right)
{
Array.Copy(array, temp, offset);
Array.Copy(array, offset, array, 0, array.Length - offset);
Array.Copy(temp, 0, array, array.Length - offset, temp.Length);
}
else
{
Array.Copy(array, array.Length - offset, temp, 0, offset);
Array.Copy(array, 0, array, offset, array.Length - offset);
Array.Copy(temp, 0, array, 0, temp.Length);
}
}
}
В качестве подсказки о том, насколько она будет сдвинута (но я сомневаюсь, что это может привести к оптимизации):
- depends on the entropy of the array itself
- for aray that are full of same values it will get shifted roughtly 0
- more entropy means higher shift value
- direction of shift will be used generally more to the left
PS.Невозможно получить разрешение безопасности для запуска небезопасного кода: /
PS2: Полученный массив должен быть передан в виде массива в другую библиотеку для дальнейшей обработки, поэтому я не могу просто перенести и переиндексировать.
PS3: Я бы предпочел работать с тем же массивом, так как метод использует ref
, и выполнение этого с новым массивом с последующим копированием обратно заняло бы много времени (я использую массив 'temp' для части, котораявыпадает из-за сдвига).