繁体   English   中英

高效的数据结构代表矩阵

[英]Efficient Data Structure to represent matrix

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

现在,我从一个简单的示例开始,以便我了解所有发生的事情,因为我不熟悉这一切。 在此示例中,我有10项考试,6名学生和6个可用时隙。 我代表一条染色体,这样我在位串中有10个位置,其值从1-6到代表时隙的范围不等,例如: [3 1 4 1 3 5 5 6 4 2]表示检查1在第三个时隙,第一个时隙的考试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]等于参加考试i和考试j的学生数量?

我是否可以使用数据结构,还是必须将每个检查与另一个检查进行比较并具有递增计数器? 因为考虑了这一点,所以我认为这对于我实际拥有的学生和考试数量而言并不有效。

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

谢谢

这是您可能要避免的蛮力方法:

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)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM