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()来解释.
| 归档时间: |
|
| 查看次数: |
8151 次 |
| 最近记录: |