具有邻接列表的恒定时间操作

时间:2017-11-11 00:09:23

标签: java matrix arraylist graph adjacency-list

我正在使用邻接列表在Java中实现图形,这些列表必须使用与Edges + Vertices成比例的空间。我的初始程序包含一个长度为V的数组(顶点数),每个索引包含一个Edges的ArrayList,显示连接到每个顶点的所有边。

现在,我被告知操作existsEdge(x,y)必须在O(1)时间运行。 我想到的方法是访问数组中的索引x(花费O(1)时间)并检查该索引处的列表是否有边(x,y)。

但是,我不确定这个时间的复杂性。我知道任何特定索引处的ArrayList的长度永远不会超过图中顶点的数量,但我不确定这是否被认为是恒定时间。无论数据量如何,每个列表将具有长度< = V,因此遍历具有明确的上限。

这是否与O(1)相同,或者这是一个不同的时间复杂度?如果它不同,我不确定如何使用ArrayList来创建这个结构。

1 个答案:

答案 0 :(得分:1)

你所描述的不被认为是O(1),它的O(V),导致在最坏的情况下顶点可以连接到所有其他顶点,并且ArrayList将具有长度V-1。如果你想要O(1),你应该使用HashSet而不是ArrayList。此外,您不需要Edge类,您只需存储连接的顶点。

让我们说顶点1连接到2,4和5,然后在数组中的位置1,你会得到一个HashSet(2,4,5)。现在,如果你必须检查是否存在edge(1,4),你将转到数组的索引1(如你所描述的),然后你将调用array[1].contains(4),这是一个O(1)操作。