인접 목록에 대한 클래스를 쉽게 구현할 수 있습니다. 다음은 내가 자주 사용하는 인접 목록으로 사용되는 클래스입니다. 이것은 쉽게 이해할 수 있습니다. integer
을 linked list
으로 매핑합니다.
class Adjacencylist {
private Map<Integer, List<Integer>> adjacencyList;
public Adjacencylist(int v){ //Constructor
adjacencyList = new HashMap<Integer,List<Integer>>();
for(int i=0;i<v;++i){
adjacencyList.put(i, new LinkedList<Integer>());
}
}
public void setEdge(int a,int b){ //method to add an edge
List<Integer> edges=adjacencyList.get(a);
edges.add(b);
}
public List<Integer> getEdge(int a){
return adjacencyList.get(a);
}
public boolean contain(int a,int b){
return adjacencyList.get(a).contains(b);
}
public int numofEdges(int a){
return adjacencyList.get(a).size();
}
public void removeEdge(int a,int b){
adjacencyList.get(a).remove(b);
}
public void removeVertex(int a){
adjacencyList.get(a).clear();
}
public void addVertex(int a){
adjacencyList.put(a, new LinkedList<Integer>());
}
}
당신은 내가, 가중 그래프를 구현 Integer
에 HashMap
매핑에 대해 생각해야한다는 것을 불평하기 전에. 따라서 linked list
을 hash map
으로 바꾸면 기능을 변경할 수 있습니다. 이렇게하면 O (n^2) 시간의 복잡성에서 벗어날 수 있습니다.
답변 해 주셔서 감사합니다. 귀하의 코드로 나는 인접성 목록으로 가능하다는 것을 알고 있지만 인접 배열로 가능한지 알고 있습니까? –
2 차원 행렬을 의미하는 인접 배열로도 좋으며, 현재의 가장자리를 가중치로 설정하고 기본값으로 설정할 수 있습니다. 더 쉽게 가중치를 얻을 수 있습니다. 이것은 N^2 배열을 가질 수 없을 때 스파 스 그래프를 가질 때 큰 도움이 될 것입니다. (N은 꼭지점 수를 의미합니다.) –
그래야 인접 배열을 사용하려는 이유는 목록에서보다 빠르게 가중치에 액세스 할 수 있기 때문입니다. 그러나 내가 가지고있는 문제는 Bellman-Ford와 인접 배열. 인접 배열 (N × N 인 2D 배열)을 사용하면 O (N^2) 시간보다 정확한 에지 목록을 얻는 것이 어쨌든 생각하지 않습니다. Bellman-Ford는 모든 에지를 N 번 반복해야하지만, 처음에 모든 에지를 찾기 위해 O (N^2) 시간이 소요된다면 Bellman-Ford는 더 이상 O (M * N)이 아니며 여기서 M은 숫자입니다 N은 정점의 수입니다. –