그래프 자료구조를 C++ 로 표현하는 여러가지 방법에 대해
글쓴이: hsnks100 / 작성시간: 월, 2011/12/19 - 2:32오후
그래프 자료구조를 C++ 로 표현하는 방법은 여러가지가 있는데, 보통 어떤 방법을 사용하나요?
편하게 구현하기 위해, 인접행렬을 씁니다.
m[a][b] = c; a 에서 b 로 가는 비용은 c 다.
메모리 비용이 많이 들고 연결된 부분을 찾기 위해선 탐색 시간이 소요됩니다.
좀 더 메모리 효율을 가져오기 위해선 인접 리스트 방식을 씁니다.
vector> graph;
메모리 효율이 좋고 속도가 빠르나, dfs, bfs 등등의 탐색을 적용하기엔 왠지 귀찮네요.
그리고 이 방법은 어떤가요? 인접 행렬과 인접리스트 방식의 중간형태인데,
map 을 이용해서 표현 하는 방법입니다.
typedef int vtype;
map > graph;
graph[a][b] = c 형태로, 기본적으로 해시를 쓰기 때문에 메모리 효율은 그렇게 좋진 못하지만,
프로그래밍 하기에 간편하고 연결된 부분을 찾기 위해서 걸리는 시간도 그리 크지 않습니다. 어떤가요?
노드 삭제도 간단합니다.
graph[ a ].erase(b);
graph[ b ].erase(a);
그리고 STL 을 이용해서 일반적으로 어떠한 방법으로 그래프를 표현하는지 궁금합니다.
또, 제시된 방법에 대해서 어떻게 생각하시는지 알려주세요~~
Forums:
boost graph library 구현을 보세요.
단위전략 클래스를 통해 그것들을 상황에 따라 선택할 수 있게 사용자에게 자유를 줍니다. 결국 map으로 된 구현도 일종의 인접행렬이죠. 다만 인접행렬의 저장 방식이 트리 형식일뿐.
BGL 도 한번 봐야겠네요. 고맙습니다~~
BGL 도 한번 봐야겠네요. 고맙습니다~~
----------------------------------------------------
개인 블로그: https://kangssu.com
STL에서도 별반 다르지 않습니다.
다루는 그래프의 형태가 대부분 sparse하기 때문에 2번째 방법, vector를 주로 사용하여 표현합니다.
그리고 dfs, bfs 탐색에 있어서도 아무런 문제가 없습니다. 단점이 있다면야, edge(a, b)의 cost를
O(1)에 찾지 못 한다는 점 정도 입니다.
말씀하신 map으로 그래프를 굳이 표현해 본적이 없어서 잘은 모르겠지만, 필요한 상황이 어딘가 있겠지요.
더불어 STL의 map은 hash가 아닙니다. hash_map은 별도로 있습니다.
네 map 은 해시를 쓰진 않죠. 잘못 썼네요.
네 map 은 해시를 쓰진 않죠. 잘못 썼네요. hash_map 이라면 어떨까요?
전체 노드를 탐색할 때의 행렬방식과 비교하여 속도라든지...
----------------------------------------------------
개인 블로그: https://kangssu.com
댓글 달기