高效的数据结构来表示矩阵

时间:2013-10-30 16:56:08

标签: java data-structures genetic-algorithm

我目前正在为大学的考试时间表安排制定解决方案。我正在考虑使用遗传算法。

现在我从一个简单的例子开始,以便我了解发生了什么事情,因为我对这一切都不熟悉。在这个例子中,我有10个考试,6个学生和6个可用的时间段。我代表一个染色体,我在一个位串中有10个位置,其值从1-6开始代表时隙,例如:[3 1 4 1 3 5 5 6 4 2]意味着考试1发生在第3个时段,考试2在第一个时段等...

现在,如果我有以下数组,表示每个学生参加哪些考试:

int[][] students_exams = 
{
    {3, 1, 2, 5, 8},   // student 1
    {10, 4, 5, 7},     // student 2
    {1, 2, 3, 6},      // student 3
    {2, 7, 4, 5},      // student 4
    {1, 6, 2, 10},     // student 5
    {8, 9, 1, 3}       // student 6
};

如何有效地将此信息表示为[nxn]矩阵,其中n是检查数(在本例中为10),其中 M [i] [j] 等于参加考试的学生人数和考试j?

是否有我可以使用的数据结构,或者我是否必须将每个考试与其他考试进行比较,并且有一个递增计数器?考虑到这一点,我认为这对于我在现实中的学生和考试数量来说效率不高。

如果您可以向我推荐任何论文或参考文献,您将对我有所帮助。

由于

1 个答案:

答案 0 :(得分:1)

以下是您可能试图避免的蛮力方法:

class testMatrixSO{
    public static void main(String[] args){

        int[][] students_exams = 
        {
        {3, 1, 2, 5, 8},   // student 1
        {10, 4, 5, 7},     // student 2
        {1, 2, 3, 6},      // student 3
        {2, 7, 4, 5},      // student 4
        {1, 6, 2, 10},     // student 5
        {8, 9, 1, 3}       // student 6
        };

        int[][] finalMatrix = new int[10][10];
        //here is the part that creates your matrix
        for(int i=0; i<students_exams.length; i++)
            for(int j=0; j<students_exams[i].length; j++)
                for(int k=0; k<students_exams[i].length; k++)
                    if(j != k) finalMatrix[students_exams[i][j]-1][students_exams[i][k]-1]++;



        //print results
        for(int i=0; i < finalMatrix.length; i++){
            for(int j=0; j < finalMatrix[i].length; j++)
                System.out.print(finalMatrix[i][j] + " ");
            System.out.println();
        }

    }
}

从积极的方面来说,如果你假设每个学生将有6个或更少的考试,那么我们可以自信地说,更新矩阵的循环将执行少于(学生数)*(6 * 6)次。即算法是线性顺序,O(n)。