我正在重新设计在其中创建6D数组的代码。这是Cplex线性计算所必需的。

现在,有一些API可以在cplex中支持1D或int变量,因此拥有6维数组并不重要。
只有映射对于变量很重要,从其他方法检索该变量时将需要该变量。

有什么办法可以代替6D阵列。这也将有助于简化代码的复杂性。

->我可以以某种方式替换6D数组并将变量存储在1D数组或int变量中。
->我尝试使用键作为列表,值作为Integer的HashMap,但最终会花费更多时间,因为HashMap在内部使用Array。

示例代码为:

int [][][][][][] testVariable = new int [2][2][3][5][2][2];
        HashMap<List<Integer>, Integer> mapping = new HashMap<List<Integer>, Integer>();
        int[] arrayAdd = new int[11111];

    for (int a =0; a <= 2; a++) {
        for (int l = 0; l < 2; l++) {
                for (int y = 0; y < 3; y++) {
                    for (int r = 0; r < 5; r++) {
                        for(int oc=0; oc< 2; oc++){
                            for(int c=0; c< 2; c++){

                                // usual array of 6D

                                testVariable[a][l][y][r][oc][c]=count;

                                // FIRST METHOD ( Takes more time then Array)

                                LinkedList<Integer> listAdd = new LinkedList<Integer>();
                                listAdd.add(a);
                                listAdd.add(l);
                                listAdd.add(y);
                                listAdd.add(r);
                                listAdd.add(oc);
                                listAdd.add(c);
                                mapping.put(listAdd, count);

                                // second method .. this i am still testing but it doesnt make much sense)

                                arrayAdd[a + l + y + r + oc + c] = count;


                            //  Arrays.fill(arrayAdd, count);
                                //System.out.println("Value of list is  " + listAdd);
                                count ++;

                        }
                    }
                }
            }
       }
  }

最佳答案

如果您知道每个尺寸的长度都不会改变,则可以使用1D数组模拟6D数组。诀窍是将除最后一个索引c以外的所有索引都乘以足够高的数字,以使映射到同一1D索引的不同6D索引集之间不会发生任何冲突。

int[] oneDArray = new int[2*2*3*5*2*2];


对于1D索引的计算,使用6个6D索引。在每个特定的6D索引之后乘以所有尺寸长度的乘积将避免碰撞。

int oneDIndex = 2*3*5*2*2 * a  // last 5 dimensions' lengths
              +   3*5*2*2 * l  // last 4 dimensions' lengths; variable letter l
              +     5*2*2 * y  // last 3 dimensions' lengths
              +       2*2 * r  // last 2 dimensions' lengths
              +         2 * oc // last dimension's length only
              +             c; // no multiplier necessary for last index


最好在此处为每个尺寸的长度使用常量,以减少硬编码。

10-07 15:48