我在 C# 中有一个二维字符串数组,我需要将该数组在一维中向左移动我怎样才能有效地做到这一点
我不想使用嵌套的 for 并且我想要 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];
}
}
我在 C# 中有一个二维字符串数组,我需要将该数组在一维中向左移动我怎样才能有效地做到这一点
我不想使用嵌套的 for 并且我想要 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];
}
}
最有效的方法是根本不移动它,而是改变你访问数组的方式。例如,保留一个偏移量,告诉您第一列在维度中的位置。
如果您想快速移动大量数据,请使用Array.Copy
而不是复制单个字符的循环。
如果您切换到字节数组并使用Array.Copy
,或者Buffer.BlockCopy
您可能会进一步提高性能(但如果您必须转换为字符数组/从字符数组转换,您可能会失去所获得的一切)。
(编辑:现在您已经发布了示例代码):如果您使用对数组行的引用,那么您可以移动引用,而不必移动数据本身。任何你仍然可以使用 Array.Copy 移动引用)
但是如果你改变你的方法,这样你就不需要移动数据,你将获得更好的性能——如果你能避免的话,根本不做工作总是更快!您可以将数据包装在访问器层中,该访问器层跟踪数据已移动的量并修改索引以返回您所追求的数据。(这会稍微减慢对数据的访问速度,但可以节省您转移数据的时间,因此可能会导致净赢 - 取决于您访问的数量相对于转移的数量)