这将是一个很长的问题,请在阅读之前深呼吸。
我想了解将一维数组的索引转换为多维数组的向量索引的最快算法是什么。
让我们通过一个例子来理解我为什么需要它:
我有一个二维数组: Array[i1][i2]
i1 从 i1_b=0 运行到 i1_e=2
i2 从 i2_b=0 运行到 i2_e=1
所以这个数组被逐行输出到文件中:
数组[0][0]
数组[0][1]
数组[0][2]
数组[1][0]
数组[1][1]
数组[1][2]
现在我逐行读取文件,索引 k 是最后读取的行号。
我读了第一行是 Array[0][0] 和 k=0
我读了第二行,即 Array[0][1] 和 k=1
...
可以注意到 k 将从 k_b=0 运行到 k_e=5 并且
k=0 将对应于 i1=0, i2=0
k=1 将对应于 i1=0, i2=1
...
问题:所以我的问题是如何以最快的方式将 k 转换为 i1 和 i2?(我在读取文件时不需要它,但稍后在我的程序中)
在此示例中,解决方案之一是
i1=k/(i1_e - i1_b + 1);
i2=k%(i1_e - i1_b + 1);
问题 1:就周期和计算机时间而言,这是最快的解决方案吗?
好的。问题 2:我们如何将这个算法推广到多维数组?
数组[i1][i2][i3][i4]
i1=k/(i1_e - i1_b + 1);
i2=k%(i1_e - i1_b + 1);
i3=i2/(i1_e - i1_b + 1);
i4=i2%(i1_e - i1_b + 1);
问题3:这是最快的方法吗?
问题 4:相关问题是模除法、整数除法、整数相加和整数相乘的延迟是多少?如果这些数字取决于架构,请告诉我。
提前致谢!
PS 有人可能更容易将此问题视为将秒转换为天-小时-分钟-秒的最快算法。