如何在次线性时间内从行主数组中选择列
How to select a column from a row-major array in sub-linear time?
假设我得到了一个行主数组。
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)(线性),注意,如果它是连续的,它仍然是线性的。
相关文章:
- 讨论 - 创建矩阵时的数组与向量的向量 - 什么是最实用的选择
- 如何从向量或数组中选择最常见的数字?(前五名)C++
- 如何为我的数组选择更大的数据类型?
- 选择一个元素而不是一个对象的数组的原因
- 如何在 c++ 中从数组中选择一个随机数?
- 从C++数组中选择一个随机元素
- 选择随机字符串数组的排序
- 我的选择排序代码是否存在导致它跳过数组中的元素的问题?
- 给定数组范围的选择排序问题
- 使用 C++ 从每个循环的数组中选择 n 个元素
- 使用STD :: String和字符数组之间的选择
- 根据 C++11 中的模板参数选择数组大小
- "我该如何展示cout<<"发烧";因为我不熟悉字符串数组,它也卡在选择部分?
- C 计数器用于从数组中选择事物
- 如何映射数组元素以选择二进制树节点
- C 选择排序字符串数组
- 在对象数组上进行选择排序
- 未选择引用到数组的构造函数进行列表初始化
- C++数组选择平方数并创建新向量
- c++数组选择