메모리에서 그래프를 나타내는 데 일반적으로 사용되는 두 가지 방법은 인접성 목록 또는 인접성 매트릭스를 사용하는 것입니다. 인접 목록은 링크 된 목록에 대한 포인터의 배열을 사용하여 구현됩니다. 벡터 벡터를 사용하는 것보다 빠르다는 이유가 있습니까? 역 추적이 훨씬 더 간단하기 때문에 검색 및 순회를 더 빠르게 만들어야하는 것처럼 느껴집니다.그래프 메모리 구현
답변
링크 된 인접성의 벡터는 실제로 많은 변형이있는 선호하는 교과서 밈입니다. 확실히 벡터 벡터를 사용할 수 있습니다. 차이점은 무엇입니까?
하나는 링크 (두 번 어쨌든 두 번)는 가장자리를 쉽게 추가하고 일정 시간 내에 삭제할 수 있도록합니다. 이것은 분명히 가장자리 집합이 줄어들뿐만 아니라 성장할 때만 중요합니다. 모서리에 대한 벡터를 사용하면 모든 개별 연산에 O (k)가 필요할 수 있습니다. 여기서 k는 입사 에지 수입니다.
주의 : 인접 목록의 가장자리 인 이 응용 프로그램에서 중요하지 않은 경우 벡터로 O (1) 삭제를 쉽게 얻을 수 있습니다. 마지막 요소를 삭제할 위치로 복사 한 다음 마지막 요소를 삭제하십시오! 아아, 인접성의 순서가 중요 할 때 많은 경우 (예 : 비행기에 임베딩하는 것이 걱정되는 경우)가 있습니다.
오더를 유지해야하는 경우에도 많은 작업에 대해 작업 당 평균 O (1)로 비용을 상각하도록 복사 비용을 조정할 수 있습니다. 여전히 일부 응용 프로그램에서는 이것이 충분하지 않으며 표시된 삭제 수가 코드의 고정 된 부분 일 때만 압축이 수행되는 "삭제됨"표시 (예약 된 정점 번호로 충분)가 필요합니다. 코드가 지루하고 모든 작업에서 삭제 된 노드를 확인하면 오버 헤드가 추가됩니다.
또 다른 차이점은 오버 헤드 공간입니다. 인접 목록 노드는 매우 작습니다. 단지 노드 번호입니다. 이중 링크는 숫자 자체의 공간의 4 배가 필요할 수 있습니다 (숫자가 32 비트이고 두 포인터가 모두 64 인 경우). 매우 큰 그래프의 경우 400 %의 공간 오버 헤드가 그리 좋지 않습니다.
마지막으로 긴 기간 동안 자주 편집되는 링크 된 데이터 구조는 쉽게 매우 인접하지 않은 메모리 액세스로 이어질 수 있습니다. 이렇게하면 벡터를 통한 선형 액세스에 비해 캐시 성능이 저하됩니다. 그래서 여기 벡터가 이깁니다.
대부분의 응용 프로그램에서 차이점은 걱정할 가치가 없습니다. 그리고 거대한 그래프가 현대 세계의 길입니다.
다른 사람들도 말했듯이, 연결된 노드 나 노드의 벡터로 신속하게 구현 될 수있는 인접성을 위해 일반화 된 List 컨테이너를 사용하는 것이 좋습니다. 예 : 자바에서는 List
을 사용하고/profile을 LinkedList
과 ArrayList
으로 구현하면 애플리케이션에 가장 적합한 것을 볼 수 있습니다. NB ArrayList
은 remove
에 배열을 압축합니다. 위에 설명 된 바와 같이 할부 상환은 없지만 add
s 은 상각됩니다.
다른 변형이 있습니다. 매우 밀도가 높은 그래프가 있는데, 특정 레이블이있는 노드에 대해 모든 노드를 검색해야하는 경우가 자주 발생한다고 가정합니다. 그런 다음 인접성에 대해 맵을 원 하십니 다. 여기서 키는 가장자리 레이블입니다. 물론지도는 해시 또는 나무 또는 skiplists 또는 당신이 좋아하는 것이어야합니다.
목록이 계속됩니다. 효율적으로 구현하는 방법 정점 삭제? 예상 할 수 있듯이 여기에도 각각 장점과 단점이있는 대안이 있습니다.
- 1. 그래프 데이터베이스 구현
- 2. 그래프 알고리즘의 PHP 구현
- 3. 해시 테이블이있는 그래프 구현
- 4. 자바에서 그래프 구현
- 5. iPhone에 그래프 구현
- 6. 그래프 알고리즘의 C++ 구현
- 7. 인접 목록 구현 그래프
- 8. 지식 그래프 구현 방법
- 9. 부스트 그래프 라이브러리 메모리 소비 큰 그래프
- 10. 나무 (감독 비순환 그래프) 구현
- 11. C에서 그래프 데이터 구조 구현
- 12. 메모리 효율적인 SHA1 구현
- 13. 메모리 액세스 그래프 생성 도구
- 14. 메모리 매핑 된 파일로 가상 메모리 구현
- 15. 인공 지능에서 AND 및 그래프 구현
- 16. 그래프 구현 및 인접 행렬의 초기화
- 17. 인접 목록 그래프 구현 c (모든 라이브러리)
- 18. opengles 2.0 2D 장면 그래프 구현
- 19. OpenGL ES 2.0에서 씬 그래프 구현
- 20. 그래프 데이터 소스 내의 메모리 누수
- 21. 메모리 내 B 트리 삽입 구현
- 22. 고전적인 ASP 메모리 누출에서 개체 캐싱 구현
- 23. Java 객체의 메모리 내 압축 구현
- 24. C++ 메모리 매핑 된 파일 구현
- 25. Facebook 그래프 API에 대한 로그 아웃 기능 구현 방법
- 26. C#에 구현 된 그래프 데이터 구조가 있습니까?
- 27. 기존 관리 패널의 목록보기에 자바 스크립트 그래프 응용 프로그램 구현
- 28. 그래프 구현, 함수 및 매개 변수. 더 이해가되는 것은 무엇입니까?
- 29. Dijkstra 구현 후 2 노드 사이의 모든 경로 그래프
- 30. 관계형 데이터베이스의 다른 객체 그래프 (유사한 인터페이스 구현)
한 번에 1 개만 되짚어보고 싶습니까?그래서 이중 연결리스트는 좋을까요? –
하지만 여전히 여분의 포인터가 필요합니다. 그래서 메모리와 속도 측면에서 보면 벡터가 여전히 더 좋을까요? – user1874166
일반적으로 그래프가 희박하거나 밀도가 있는지 여부에 따라 다릅니다. –