[英]Adjacency Matrix In Java
我對圖表和鄰接矩陣感到困惑。 我正在為一個類做一個任務,我有一個節點的文本文件和一個邊緣的文本文件,我必須閱讀它們中的每一個並使它們成為一個圖形,然后我可以在其上執行操作,例如確定圖形是否是連接,找到最小的生成樹,遍歷和查找路徑。 我之前從未使用過圖表,而且我對整個事情感到困惑,我想知道是否有人可以幫我解釋一下這些問題。
首先,我自己構建一個圖形(可能是節點和邊類?)然后從中構造一個鄰接矩陣? 或者鄰接矩陣本身是圖形?
然后我對如何將相鄰矩陣實現到程序中感到困惑。 節點的名稱是“ND5”和“NR7”,所以我必須設置和讀取[ND5] [NR7]的邊緣,但我不知道如何設置像這樣的2d數組的字符串外面和里面的數字。
我一直在網上搜索並閱讀我教科書中關於圖表的整章,我真的不明白設置這個圖的第一步基本步驟。 我非常感謝你的幫助。 謝謝。
首先,我自己構建一個圖形(可能是節點和邊類?)然后從中構造一個鄰接矩陣? 或者鄰接矩陣本身是圖形?
如果沒有真正閱讀你的作業說明,任何人都無法肯定地回答這個問題。 但是,除非賦值具體提到Node
和Edge
類或其他東西,我的猜測是你應該使用鄰接矩陣來表示你的圖。
然后我對如何將相鄰矩陣實現到程序中感到困惑。 節點的名稱是“ND5”和“NR7”,所以我必須設置和讀取
[ND5][NR7]
的邊緣,但我不知道如何設置像這樣的2d數組的字符串外面和里面的數字。
我完全可以理解你的困惑。 你真正想要做的是在你的節點名稱和矩陣的索引之間創建一個雙射 (一對一的關系)。 例如,如果圖中有n個節點,則需要一個n×n矩陣(即new boolean[n][n]
),並且每個節點都對應一個0到n范圍內的整數(不包括n)。
我不確定你到目前為止在你的類中已經覆蓋了什么數據結構,但最簡單的方法可能是使用Map<String, Integer>
,它可以讓你查找像"ND5"
這樣的名字並獲取一個整數(索引)。
另一個不錯的選擇可能是使用數組。 您可以將所有節點名稱放入數組中,使用Arrays.sort
對其進行Arrays.sort
,然后對其進行排序后,可以使用Arrays.binarySearch
查找該數組中特定節點名稱的索引。 我認為這個解決方案實際上比使用Map
更好,因為它允許您以兩種方式進行查找。 您使用Arrays.binarySearch
進行名稱到索引的查找,您只需索引到數組以進行索引到名稱查找。
示例:假設我們有此圖:
鑒於該圖,下面是一些示例代碼,說明如何執行此操作:(警告!未經測試)
import java.util.Arrays;
// Add all your node names to an array
String[] nameLookup = new String[4];
nameLookup[0] = "A";
nameLookup[1] = "B";
nameLookup[2] = "C";
nameLookup[3] = "D";
// Our array is already properly sorted,
// but yours might not be, so you should sort it.
// (if it's not sorted then binarySearch won't work)
Arrays.sort(nameLookup);
// I'm assuming your edges are unweighted, so I use boolean.
// If you have weighted edges you should use int or double.
// true => connected, false => not connected
// (entries in boolean arrays default to false)
boolean[][] matrix = new boolean[4];
for (int i=0; i<matrix.length; i++) matrix[i] = new boolean[4];
// I don't want to call Arrays.binarySearch every time I want an index,
// so I'm going to cache the indices here in some named variables.
int nodeA = Arrays.binarySearch(nameLookup, "A");
int nodeB = Arrays.binarySearch(nameLookup, "B");
int nodeC = Arrays.binarySearch(nameLookup, "C");
int nodeD = Arrays.binarySearch(nameLookup, "D");
// I'm assuming your edges are undirected.
// If the edges are directed then the entries needn't be semmetric.
// A is connected to B
matrix[nodeA][nodeB] = true;
matrix[nodeB][nodeA] = true;
// A is connected to D
matrix[nodeA][nodeD] = true;
matrix[nodeD][nodeA] = true;
// B is connected to D
matrix[nodeB][nodeD] = true;
matrix[nodeD][nodeB] = true;
// C is connected to D
matrix[nodeC][nodeD] = true;
matrix[nodeD][nodeC] = true;
// Check if node X is connected to node Y
int nodeX = Arrays.binarySearch(nameLookup, stringNameOfX);
int nodeY = Arrays.binarySearch(nameLookup, stringNameOfY);
if (matrix[nodeX][nodeY]) { /* They're connected */ }
// Print all of node Z's neighbors' names
int nodeZ = Arrays.binarySearch(nameLookup, stringNameOfZ);
for (int i=0; i<matrix.length; i++) {
if (matrix[nodeZ][i]) {
System.out.println(nameLookup[nodeZ] + " is connected to " + nameLookup[i]);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.