【问题标题】:Java implementation of adjacency list邻接表的Java实现
【发布时间】:2013-02-09 01:08:56
【问题描述】:

我有一个 n*m 矩阵,每个节点都有一个整数值,它是一个无向图。我想为它建立一个邻接列表。我怎么做?任何帮助深表感谢。

【问题讨论】:

  • 你试过了吗?二维数组?
  • 你的意思是邻接矩阵?
  • 你想要一个每个位置都是一个喜欢列表的数组吗?
  • 是的,如果原始矩阵中的整数表示边指向的节点的索引,那么你就完成了。 int[][],其中第一个索引是节点的索引,存储在那里的值是目标节点。如果拓扑是固定的,这就足够了,如果不是,你可以考虑使用 List 的一些实现。
  • 这表明完全没有研究。 Wikipedia 单独列出了三种可能的实现方法。

标签: java adjacency-list


【解决方案1】:

下面是创建邻接表的简单实现。根据问题:

会有 n 个链表,每个链表的大小都是可变的。

首先初始化一个整数链表的ArrayList:

ArrayList<LinkedList<Integer>> adj_list = new ArrayList<LinkedList<Integer>>();

然后通过重复以下代码简单地添加链表:

adj_list.add(new LinkedList<Integer>());

如果你用它来表示图形,那么链表数=顶点数。所以你必须重复上面的行n(顶点数)次。

现在假设您想将数字 3、4、5 添加到您的第一个链接列表中。执行以下操作:

adj_list.get(0).add(3);
adj_list.get(0).add(4);
adj_list.get(0).add(5);

这只是意味着你的图中从顶点 0 到 3、4、5 有一条边。

【讨论】:

【解决方案2】:

首先你的描述似乎是一个邻接矩阵,除了你说的是m by n。邻接矩阵总是正方形的,所以我们必须假设m==n。矩阵元素是边权重。

图的邻接表表示(通常)是一个数组adj 的对集合。集合adj[i] 包含对&lt;j, w&gt; 且当且仅当存在有向边i--w--&gt;j,即从顶点ij,在表示的图中权重为w

有了这个定义,很明显你必须从n 空邻接集adj[i] 开始,然后遍历矩阵元素m[i][j] = w。对于这些中的每一个,将&lt;j, w&gt; 添加到adj[i]

这方面的java代码很简单,我就不写了。用邻接表表示的图的类型类似于ArrayList&lt;HashMap&lt;Integer, Integer&gt;&gt; adjacencies&lt;j,w&gt; in adj[i] 是存储在哈希表 adjacencies.get(i) 中的映射 j -&gt; w。创建这种邻接的代码是adjacencies.get(i).put(j, w)

此方法允许您通过迭代哈希表adjacencies.get(i) 中的键来迭代与i 相邻的顶点,使用w = adjacencies.get(i).get(j) 查找给定边i--w--&gt;j 的权重,依此类推通常的图形操作。

【讨论】:

  • 嗨 Gene,包含我要为其构建邻接矩阵的数据的数组是 m*n,其中 m!=n。
  • 你的图有多少个顶点? n 还是 m?邻接矩阵应该是方阵。如果你有n x m 矩阵,你肯定会丢失一些边。
  • ShivaKumar 完全正确。如果您@Jw123 使用的是矩形矩阵,那么它是某种非标准的图形表示,您必须先解释矩阵中的每个元素代表什么,然后才能帮助您。获得好答案的秘诀总是提出一个好问题。
猜你喜欢
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多