哎呀!我知道我最终会得到这个,但此时我已经差不多2个小时了,仍然卡住了。
我需要为特定位置的锯齿状数组的每个“级别”解析各个索引。这很难解释,但如果你想象一个长度为[2,3,4]的3级锯齿状阵列。如果你然后把它变成一个单独的数组,它的大小就是24.现在,假设你需要找到等于单个数组索引的索引(每个级别的锯齿状数组一个) 22.这将是1,2,1。找出单个场景并不难,但我想弄清楚算法是为了解决变深度锯齿状阵列的这些值。
以下是我当前尝试的简单代码示例:
using System;
class Program
{
static void Main(string[] args)
{
// Build up the data and info about level depth
int[] levelDepth = new[] { 2, 3, 4 };
int[][][] data = new int[][][]
{
new int[][] { new int[4], new int[4], new int[4] },
new int[][] { new int[4], new int[4], new int[4] }
};
int requestedValue = 22;
float temp = requestedValue;
// Store the index of each level array to get to the index
// for the requested value
int[] levelIndexes = new int[3] { 0, 0, 0 };
// The following does not work!
int i = levelDepth.Length;
while (i > 0)
{
temp = temp / levelDepth[i - 1];
levelIndexes[i - 1] = (int)Math.Round(temp);
i--;
}
}
}
它不能正常工作,虽然它几乎可以得到我所需要的东西,但我认为这可能是运气。我怀疑这是一个以前已经解决的常见问题,我只是没有经验来弄明白。 :(
此外,在任何人告诉我使用这样的阵列很糟糕或“为什么不存储这样的数据”之前 - 上面的描述和代码模拟了我们硬件上的一些解码器芯片的布局,我需要找出一种方法来解决级联芯片特定图形的路径;上面的例子与芯片的布局完全匹配。我坚持了下来。
答案 0 :(得分:3)
你不应该在这里使用float
。
int[] levelDepth = new[] { 2, 3, 4 };
int requestedValue = 22;
int[] levelIndexes = new int[levelDepth.Length];
for (int i = 0; i < levelDepth.Length; i++)
{
// need to go from { 2, 3, 4 } -> { 3*4, 4, 1 }
int f = 1;
for (int j = i+1; j < levelDepth.Length; j++)
f *= levelDepth[j];
levelIndexes[i] = requestedValue / f; // integer divide
requestedValue = requestedValue % f;
}
答案 1 :(得分:1)
假设您需要该点的元素值(而不是特定索引),您只需执行类似ruby的flatten,然后直接访问索引。
编辑:对不起有误,或许这会有所帮助。来自Microsoft Visual C#.NET 2003开发人员手册(Mark Schmidt):
static int[] GetDimensionIndices(int flatIndex, Array array)
{
int[] indices = new int[array.Rank];
int p = 1;
for(int i = array.Rank - 1; i >= 0; i--)
{
indices[i] = (((flatIndex/p)) % (array.GetUpperBound(i)+1));
if(i > 0)
p *= array.GetUpperBound(i) + 1;
}
return indices;
}
答案 2 :(得分:1)
长度为2的数组包含长度为3的数组,其中包含长度为4的数组。
因此,第一个数组上的索引将使总索引增加3 * 4 = 12。
第二个数组的索引将使总数增加4。
第三个数组的索引将使总数增加1。
所以,22 = 12 * 1 + 4 * 2 + 1 * 1.
在计算出这些数字(将levelDepth
中的值相乘)之后,您可以简单地使用从最外层数组开始的贪婪算法。
int temp = requestedValue;
int levelWeight[] = {levelDepth[2]*levelDepth[1], levelDepth[2], 1};
for(int i=0;i<3;i++){
while(requestedValue >= levelWeight[i]){
levelIndexes[i]++;
requestedValue-=levelWeight[i];
}
}