gpt4 book ai didi

java - 图的 HashMap 表示

转载 作者:搜寻专家 更新时间:2023-10-31 08:27:28 25 4
gpt4 key购买 nike

例如,我有一个带有图形边缘的文本文件

1 2

1 3

2 5

等,并想以某种方式表示我的图表。我尝试使用 HashMap ,它是表示边缘的最佳方式吗?第二个问题,我如何访问 HashMap 中的第一个和第二个条目?我的代码在这里

    DataInputStream dStream = new DataInputStream(new FileInputStream("C:/Programming/Java/test.txt"));
BufferedReader bReader = new BufferedReader(new InputStreamReader(dStream));

HashMap<Integer, Integer> graphEdges = new HashMap<Integer, Integer>();
String line;
while( (line = bReader.readLine()) != null) {
String[] firstSecond = line.split(" ");
int firstDigit = Integer.parseInt(firstSecond[0]);
int secondDigit = Integer.parseInt(firstSecond[1]);

graphEdges.put(firstDigit, secondDigit);
}

System.out.println(graphEdges);

bReader.close();
}

最佳答案

在图的许多可能表示中,2 种基本表示如下:

  • 邻接表

enter image description here

在 Java 中:

Map<Integer, List<Integer>> graph = new HashMap<>();
...
while( (line = bReader.readLine()) != null) {
String[] tokens = line.split(" ");
int firstNode = Integer.parseInt(tokens[0]);
int secondNode = Integer.parseInt(tokens[1]);

if(!graph.containsKey(firstNode)) graph.put(firstNode, new LinkedList());
graphEdges.get(firstNode).add(secondNode);
}
  • 邻接矩阵

enter image description here

在 Java 中:

int[][] graph = new int[numberOfNodes][numberOfNodes];
while( (line = bReader.readLine()) != null) {
String[] tokens = line.split(" ");
int firstNode = Integer.parseInt(tokens[0]);
int secondNode = Integer.parseInt(tokens[1]);

graph[firstNode-1][secondNode-1] = 1;
graph[secondNode-1][firstNode-1] = 1;
}

下面是这两种表示的运算和存储效率的比较:

                   |     Adjacency List    |   Adjacency Matrix   |
Storage | O(nodes+edges) | O(nodes^2) |
Add node | O(1) | O(nodes^2)* |
Add edge | O(1) | O(1) |
Remove node | O(edges) | O(nodes^2)* |
Remove edge | O(edges) | O(1) |
isAdjacent(x1,x2) | O(nodes) | O(1) |
*Requires copying of the whole array

你也可以对邻接表稍作修改,使用HashSets代替LinkedList来存储相邻节点。在那种情况下,一切都一样,除了 isAdjacent(x1,x2) 操作现在具有 O(1) 复杂度(摊销)。

关于java - 图的 HashMap 表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15050073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com