簡體   English   中英

Java中的鄰接矩陣

[英]Adjacency Matrix In Java

我對圖表和鄰接矩陣感到困惑。 我正在為一個類做一個任務,我有一個節點的文本文件和一個邊緣的文本文件,我必須閱讀它們中的每一個並使它們成為一個圖形,然后我可以在其上執行操作,例如確定圖形是否是連接,找到最小的生成樹,遍歷和查找路徑。 我之前從未使用過圖表,而且我對整個事情感到困惑,我想知道是否有人可以幫我解釋一下這些問題。

首先,我自己構建一個圖形(可能是節點和邊類?)然后從中構造一個鄰接矩陣? 或者鄰接矩陣本身是圖形?

然后我對如何將相鄰矩陣實現到程序中感到困惑。 節點的名稱是“ND5”和“NR7”,所以我必須設置和讀取[ND5] [NR7]的邊緣,但我不知道如何設置像這樣的2d數組的字符串外面和里面的數字。

我一直在網上搜索並閱讀我教科書中關於圖表的整章,我真的不明白設置這個圖的第一步基本步驟。 我非常感謝你的幫助。 謝謝。

首先,我自己構建一個圖形(可能是節點和邊類?)然后從中構造一個鄰接矩陣? 或者鄰接矩陣本身是圖形?

如果沒有真正閱讀你的作業說明,任何人都無法肯定地回答這個問題。 但是,除非賦值具體提到NodeEdge類或其他東西,我的猜測是你應該使用鄰接矩陣來表示你的圖。

然后我對如何將相鄰矩陣實現到程序中感到困惑。 節點的名稱是“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進行名稱到索引的查找,您只需索引到數組以進行索引到名稱查找。


示例:假設我們有此圖:

A-B,A-D,B-D,C-D

鑒於該圖,下面是一些示例代碼,說明如何執行此操作:(警告!未經測試)

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM