java中的哪个标准库数据结构为实现邻接列表提供了最短的时间复杂度?

时间:2017-10-01 17:16:02

标签: java algorithm data-structures time-complexity graph-theory

我是图论的新手。我遇到过很多方法,用java表示图形的邻接列表表示的实现,包括:

ArrayList<T>[]
LinkedList<T>[]
ArrayList<ArrayList<T>>
ArrayList<HashSet<T>>
HashMap<Integer, List<T>>
etc.

如果我在图表上需要最少的这些操作,我想知道哪个是用于获得最佳时间复杂度的最佳数据结构:

  1. 查找两个节点是否通过边连接。
  2. 迭代特定顶点的所有邻居。
  3. (可选)按重量排序顶点的所有邻居,或者可能是优先级队列。
  4. 请您指导哪个标准库数据结构最适合java中图形的邻接列表实现,以获得最佳的空间和时间复杂度? (时间复杂度优先于空间复杂度)

2 个答案:

答案 0 :(得分:0)

保持简单,创​​建一个包含TreeMap的Node类,该TreeMap保存对其所连接节点的引用。

  1. 确定是否连接了两个节点只是选择一个节点并查询地图O(log(n))。
  2. 迭代所有邻居正在走地图O(n)。
  3. TreeMap执行自然排序,因此选择您的值并让比较器使用该值进行排序。
  4. 根据您提供的信息。

答案 1 :(得分:0)

我会说LinkedHashSet<LinkedHashSet<T>>。这是因为:

  1. 查找两个节点是否通过边连接:一次调用内部集的contains()方法解决此问题,需要时间O(1)
  2. 迭代特定顶点的所有邻居:后续调用iterator.next(),每个调用O(1)
  3. 按权重排序顶点的所有邻居,或者可能是优先级队列:如果需要,请将内部实现更改为TreeSet<T>并在节点类上实现Comparable接口。 TreeSet授予您所有操作将在O(log n)中执行,但所有项目都将被排序。
  4. 来源:Java Generics and Collections