需要帮助算法通过锯齿状数组来解析索引

时间:2011-08-24 07:59:22

标签: c# algorithm

哎呀!我知道我最终会得到这个,但此时我已经差不多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--;
        }
    }
}

它不能正常工作,虽然它几乎可以得到我所需要的东西,但我认为这可能是运气。我怀疑这是一个以前已经解决的常见问题,我只是没有经验来弄明白。 :(

此外,在任何人告诉我使用这样的阵列很糟糕或“为什么不存储这样的数据”之前 - 上面的描述和代码模拟了我们硬件上的一些解码器芯片的布局,我需要找出一种方法来解决级联芯片特定图形的路径;上面的例子与芯片的布局完全匹配。我坚持了下来。

3 个答案:

答案 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];
    }
}