2013-10-30 66 views
1

我目前正在爲考試時間表調度解決方案的一所大學。我正在考慮使用遺傳算法。有效的數據結構來表示矩陣

現在我開始用一個簡單的例子,讓我捉對正在發生的事情,因爲我是新來的這一切。在這個例子中,我有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 
}; 

我怎樣纔能有效地表示此信息作爲[n×n個]矩陣,其中n是考試的數量(在這種情況下10)其中M [i] [j]等於數量的學生服用考試i和考試J〜

是否有一個數據結構,我可以使用或我必須每場考試的相互比較考試,並有一個遞增的計數器?因爲考慮到這一點,我認爲這對於我在現實生活中的學生和考試的數量並不會有效。

如果你可以參考我的任何文件或引用您將有很大幫助我。

感謝

+0

您是否在尋找空間效率或處理器效率?如果您不關心空間效率,則無法同時處理高效空間處理,從而增加處理器開銷。 – MadConan

回答

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