제도법

그래프여러 꼭지점~에 가장자리복잡한 상호 관계를 표현하는 데이터 구조입니다.


직접적인 관계있는 경우 두 정점 사이직접 연결하는 부족있다 간접적인 관계라면 여러 구석 구석에 걸쳐 계속

목록, 트리 및 차트

목록, 트리 및 그래프는 모두 비슷한 구조를 가지고 있습니다.

  • 목록 : 노드가 다른 노드에 연결체인과 같은 다른 매듭 직렬로 연결된모양
  • 나무 : 목록으로 방향가지다 하나의 노드를 형성하기 위해 병렬로 연결된 여러 노드모양
  • 그래프 : 각 노드 임의의 순서와 번호로 무작위로 연결됨모양

위와 같은 특징을 가지고 있으며 점차 목록에서 차트로 진화하고 있습니다.

따라서 그래프다른 데이터 구조와 비슷하지만 보다 유연하고 자율적 많은 곳에서 사용됩니다. ex) 소셜 네트워크, 내비게이션 등

그래프 데이터 구조 용어집

  • 꼭지점: 데이터를 저장하는 차트의 기본 요소인 노드라고도 합니다.
  • 가장자리: 꼭짓점 간의 관계를 나타내는 선입니다. (정점을 연결하는 선)
  • 이웃 볏: 단일 노드에서 에지로 직접 연결된 노드.
  • 가중 그래프: 연결 강도를 보여주는 그래프(내비게이션 거리 등의 추가 정보). (외부 회선의 정보)
  • 비가중 그래픽: 연결 강도가 표기되지 않은 차트입니다.
  • 유향 그래프: 두 정점을 연결하는 모서리가 한 방향으로만 향하는 경우. 가장자리는 일반적으로 화살표로 표시됩니다. ex) 단방향 내비게이션, Instagram 팔로잉 또는 팔로워
  • 무방향 그래프: 연결된 두 정점이 서로의 방향을 가질 수 있는 경우 단방향과 대조됩니다. 예) 페이스북 친구추가
  • 인도/아웃도: 꼭지점에 진입(in)하고 정점을 빠져나가는(exit) 모서리의 수를 지정합니다.
  • 이웃: 에지가 두 정점을 직접 연결하면 두 정점이 인접합니다.
  • 셀프 루프: 한 꼭지점에서 나온 edge가 다른 꼭지점을 거치지 않고 직접 진입하는 것이 특징이다.
  • 주기: 꼭지점에서 시작하여 해당 꼭지점으로 돌아올 수 있을 때. 내비게이션 그래프는 서울 -> 대전 -> 부산 -> 서울로 이동할 수 있으므로 주기가 있는 그래프입니다.

인접 행렬 및 인접 목록(이웃 목록)


왼쪽부터 인접행렬, 인접리스트, 에지리스트

리스트 데이터 구조에는 각 노드에 연결된 다른 노드에 대한 정보, 즉 다음, 이전 등의 정보가 포함되며, 트리 데이터 구조의 경우에는 왼쪽, 오른쪽 등의 자식 노드에 대한 정보가 포함된다. 하지만 그래프의 경우 무한 개수의 정점에 연결이 때문에 모든 정점이 모든 인접 정점에 대한 정보를 갖는 것은 어렵습니다. 그만큼 그래프 연결 다이어그램가장 일반적인 두 가지 표현 유형 이웃 행렬수업 이웃 목록오전.

이웃 행렬

이름으로 2차원 행렬로 표시하다. 행과 열 사용따라서 edge의 정보를 표현하는데 보통 row는 자신의 vertex를 의미하고 column은 자신 이외의 vertex를 의미한다. 부족듣는다는 뜻 0 또는 1부울 형식으로 표현됩니다.

새 정점이 생성되면 한 번에 하나의 행과 하나의 열을 추가합니다.

이웃 목록(이웃 목록)

모든 꼭대기들었다 나만의 독립 목록(직렬 형식의 모든 데이터 구조, 예: 목록 또는 배열) 및 목록 자신에 인접한 노드그래서 자신과 에지로 연결된 다른 노드위의 예시와 달리 각 정점의 이름이 잘 정돈된 숫자형이 아닌 경우, 해시 테이블예) {A:(“B”,”C”), B:(“A”), C:(“A”)} 사용 가능

간단한 인접 목록 구현

수업 그래프 {
건설자() {
// 이웃 목록
그만큼.이웃 목록 = {};
}

// 정점 추가
addVertex(꼭지점) {
만약에 (!그만큼.인접 목록(정점)) 그만큼.인접 목록(정점) = ();
}

// 가장자리 추가
addEdge(정점1, 정점2) {
만약에 (그만큼.인접 목록(정점1) && 그만큼.인접 리스트(Vertex2)) {
그만큼.인접 목록(정점1).누르다(정점2);
그만큼.인접 리스트(Vertex2).누르다(정점1);
// 무방향 그래프이므로 Edge를 연결할 다른 노드에 대한 정보도 추가됩니다.
// 정점의 이름이 아닌 여기에 해당 객체를 저장하면 vertex1->vertex2->vertex1->vertex2…
// 무한 루프 종료.
}
}
// 가장자리 제거
가장자리 제거(정점1, 정점2) {
만약에 (그만큼.인접 목록(정점1) && 그만큼.인접 리스트(Vertex2)) {
그만큼.인접 목록(정점1) = 그만큼.인접 목록(정점1).필터(
(꼭지점) => 꼭지점 !== 정점2
);
그만큼.인접 리스트(Vertex2) = 그만큼.인접 리스트(Vertex2).필터(
(꼭지점) => 꼭지점 !== 정점1
); // 무방향 그래프이므로 상대 노드의 Edge도 삭제
}
}
정점 제거(정점1) {
만약에 (그만큼.인접 리스트(정점1)) {
~을 위한 (허용하다 정점2 ~에서 그만큼.인접 리스트(정점1)) {
그만큼.인접 리스트(Vertex2) = 그만큼.인접 리스트(Vertex2).필터(
(버전) => 버전 !== 정점1
); // removeEdge() 메서드를 호출할 수 있지만 removeEdge() 메서드의 경우
// vertex1의 모서리를 삭제하는 연산도 포함되며 vertex1은
// 객체인 adjacencyList에서 삭제할 예정이기 때문에 removeEdge() 메소드를 사용하면
// 불필요한 연산이 포함되어 있습니다.
}
끄다 그만큼.인접 목록(정점1);
}
}
}
허용하다 그래프 = 새로운 그래프();
// 정점 추가
그래프.addVertex(서울);
그래프.addVertex(도쿄);
그래프.addVertex(밴쿠버);
그래프.addVertex(브리즈번);

// 트렁크 추가

그래프.addEdge(서울, 도쿄);
그래프.addEdge(서울, 밴쿠버);
그래프.addEdge(브리즈번, 밴쿠버);
// 와이어 제거
그래프.가장자리 제거(밴쿠버, 도쿄);

// 정점 제거

그래프.정점 제거(서울);


콘솔.규약(그래프.이웃 목록);
// 누르다
{
도쿄: (),
밴쿠버: ( ‘브리즈번’ ),
브리즈번: (‘밴쿠버’)
}

마른

  • 그래프수업에 이웃 목록라는 객체를 생성합니다.
  • addVertex()메소드 호출 시 받은 파라미터(추가할 노드명)를 사용 이웃 목록물체에 빈 배열로 정점 추가(이 배열에는 이 정점에 연결된 다른 정점을 넣습니다.
  • 제거정점()메서드를 호출할 때 이웃 목록객체의 매개변수(정점 삭제)에서 루프를 통해 배열의 다른 모든 정점에 액세스그래서 삭제하려는 모든 정점을 삭제합니다. ~ 후에 삭제할 정점도 adjacencyList 개체에서 제거됩니다.그렇습니다
  • addEdge()방법은 두 모서리를 연결하려면붓다 중개사로 전해졌다개체에서 두 정점의 배열에 다른 정점을 추가하십시오.이렇게 하면 서로 간에 가장자리가 추가됩니다. 유향 그래프의 경우 시작 정점에만 상대 정점 추가하다.
  • 가장자리 제거()방법도 두 정점이름으로 일련의 정점~에 각 상대의 꼭지점 이름을 제거하십시오.그렇습니다

노드를 추가하거나 제거할 때는 노드의 이름만 파라미터로 보내주었지만, Edge를 추가할 때는 해당 노드에 연결할 상대 노드의 이름을 보내야 했다.

이러한 방법을 구현하는 것이 중요합니다. 가장자리를 연결 또는 분할하거나 정점을 제거하면 해당 정점에 연결된 다른 정점도 수정됩니다.특히해야 방향이 없는 차트의 경우 더 많은 주의를 기울여야 합니다.

인접 행렬 및 인접 목록의 대문자 O

이웃 행렬 이웃 목록
정점 추가 오(V²) 오(1)
가장자리 추가 오(1) 오(1)
정점 삭제 오(V²) 오(V+E)
테두리 지우기 오(1) O(E)
특정 에지에 대한 액세스 오(1) 오(V+E)
공간적 복잡성 오(V²) 오(V+E)

V = 모서리 수, E = 모서리 수

에지를 삭제하고 특정 에지에 접근하는 경우를 제외하고는 인접 목록은 매우 효율적입니다.

그 이유는 이웃 행렬의 경우 각 정점과 모서리의 위치가 고정되어 있으므로 해당 인덱스는 바로 연결이렇게 하면 더 쉽게 에지를 삭제하고 특정 에지에 액세스할 수 있습니다.

하지만 각 정점에 대해 다른 모든 정점(연결되지 않은 정점 포함) 간의 관계를 표시합니다.때문에 다른 기능의 효율성 및 공간 복잡성 효율성이 떨어집니다. 그래프의 모든 꼭지점을 연결했을 때 인접 리스트와 성능 차이는 크지 않지만 실제로 그런 경우를 기대할 수는 없다고 생각합니다.