如何在次线性时间内从行主数组中选择列

How to select a column from a row-major array in sub-linear time?

本文关键字:数组 选择 线性 时间      更新时间:2023-10-16

假设我得到了一个行主数组。

int* a = (int *)malloc( 9 x 9 x sizeof(int));

将其视为2D 9x9数组,其中(行,列)索引对应于[row*9+column]有没有一种方法可以在亚线性时间内从这个数组中选择一列?由于列不是连续的,我们不能像获取单行那样进行直接memcpy。

我想,线性时间解是显而易见的,但我希望得到一些亚线性解。

谢谢。

不清楚您所说的次线性是什么意思。如果将2D阵列视为NxN大小,则N上的次线性是不可能的。要复制N元素,您需要执行N复制操作,该复制将是对所复制元素数量的线性

关于memcpy的评论似乎表明,您错误地认为memcpy是被复制元素数量的次线性。事实并非如此。memcpy的优点是隐藏在big-O表示法中的常数很小,但运算对被复制的内存大小是线性的。

下一个问题是big-O分析是否真的有意义。如果数组是9x9,那么隐藏在big-O表示法常量中的效果可能比复杂性更重要。

我真的不明白你的意思,但考虑一下:

 const size_t x_sz=9;
 size_t x=3, y=6; //or which ever element you wish to access
 int value=a[Y*x_sz+x];

这将是一个恒定的时间O(1)表达式。它必须计算偏移并加载值。

迭代列中的每个值:

 const size_t x_sz=9, y_sz=9;
 size_t x=3; //or which ever column you wish to access
 for(size_t y=0; y!=y_sz; ++y){
     int value=a[Y*x_sz+x];
     //value is current column value
 }

同样,每次迭代都是恒定的时间,因此整个迭代序列是O(n)(线性),注意,如果它是连续的,它仍然是线性的。