C#中的快速数组移位实现?

Mar*_*mić 13 c# algorithm optimization

我需要在N个位置向右和向左移动一个数组.

在我转移到的一侧弹出的物品必须回到另一侧.

向右移动13:

[0,1,2,3,4,5,6,7,8,9] -> [7,8,9,0,1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)

向左移15:

[0,1,2,3,4,5,6,7,8,9] -> [5,6,7,8,9,0,1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

此操作将发生数百万次,并且必须非常快.

我目前的实施如下.请查看并建议是否有一些优化要做.

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

作为一个关于它将被转移多少的提示(但我怀疑它可以导致优化):

-  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
Run Code Online (Sandbox Code Playgroud)

PS.无法获得运行不安全代码的安全权限:/

PS2:结果数组必须作为数组向前传递到不同的库以进行进一步处理,所以我不能只是换行和重新索引.

PS3:我更喜欢在方法使用的同一个数组上工作ref,并且在新数组上执行此操作然后复制将非常耗时(我使用'temp'数组用于因为移).

LBu*_*kin 13

你应该使用Buffer.BlockCopy.它绕过数组索引并执行快速内存复制.请记住,BlockCopy以字节为单位复制数据,而不是根据数组元素的大小复制数据,因此请务必使用它sizeof()来解释.