2012-08-30 16 views
0

은 내가에 응답을 이해 Knight's Shortest Path Chess Question기사의 최단 경로 그래프 데이터 구조 및 알고리즘

@ 이전 stackflow 포스트 중 하나에 질문이 '좋아,이 그래프 질문, 그 희소 행렬은 같다'

(a1,b3)=1, 
(a1,c2)=1, 
    ..... 

기존 가장자리를 설명합니다. 그러나 나는 아직도이 그래프의 데이터 구조가 어떻게 보일 것인지는 알지 못합니다 (인접 매트릭스입니까? 위에 '희소 매트릭스'로 언급 했나요?), Dijkstra의 알고리즘에 의해 쉽게 사용될 수 있습니다.

http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm.

알고리즘 설명에서 그래프 데이터 구조가 가능한 인접한 정점 정보와 함께 정점 집합 인 경우 편리합니다. 그러나 어떻게 이것을 성취합니까?

누구나이 그래프의 샘플 데이터 구조를 작성하고 Dijkstra의 알고리즘에 편리하게 연결할 수있는 방법에 대해 설명 할 수 있습니다.

답변

1

그래프 매우 희박한

감사 (64 개 꼭지점 각 정점 최대 8 개 에지를 가짐), 따라서 인접 행렬은 낭비 IMO이다.

이것에 대한 더 나은 구조는 adjacency list 될 것입니다 :

v1->v2,v3,v4,v5 
v2->v1,... 
... 

을 아이디어는 Set<Vertex>를 개최 참, 그리고 Vertex 유형에 대한 필드 가지고 : 모든 정점의 이웃이 포함됩니다 List<Vertex> neighbors을, 정점.

이 경우 그래프에 가중치가 적용되지 않으므로 추가 웨이트 정보가 필요하지 않습니다.

또한 - Dijkstra의 알고리즘은 여기에서 중복입니다. 다시 그래프는 가중치가 적용되지 않습니다. 따라서 최단 경로를 찾는 더 간단한 (프로그램 및 이해하기위한) 알고리즘과 빠른 (런타임) 알고리즘은 비가 중 그래프의 경우 BFS입니다.

+0

감사합니다. amit. 데이터 구조는 많은 의미가 있습니다. 그리고 당신이 말했듯이, BFS가 올바른 선택입니다. (실제로 BFS를 사용하고 있는데, 데이터 구조 질문을 제기하기 위해 Dijkstra를 빌 렸습니다. :)). 한 가지 더 질문, 내 문제는 내가 경로를 최단 경로의 길이 이외에 찾을 필요가있다. 그러나 Dijkstra에 명시된 '이전 [v]'아이디어는 BFS에서이를 구현하는 방법을 잘 모르겠습니다.왜냐하면 나는 BFS를 실행하면서 내 인접 목록을 만들고 집합에 중간 정점을 두지 않기 때문에 중간 정점은 알고리즘이 완료되면 사라진다. 그래서 내가 무엇을 할 수 있니? – user1559625

+0

@ user1559625 : [이 스레드] (http://stackoverflow.com/q/9590299/572670)에서 한 번이 문제를 해결했습니다. 당신이 그것을 이해하는데 어려움이 있다면 말해주십시오. – amit

+0

차가움. Amit에게 감사드립니다. 큰 도움이됩니다. 좋은 초급/중급 도서 알고리즘에 대한 모든 추천 :)? 나는 알고리즘에 약하다. 좋은 하루 되시 며 모든 도움을 주셔서 감사합니다. – user1559625

0

타일이 64 개뿐이므로 인접 행렬을 각각 64 비트 64 개 배열로 편리하게 배치 할 수 있습니다. 확실히 희소하지만 너무 작기 때문에 낭비가 전혀 존재하지 않는다면 (포인터는 단일 비트에 비해 꽤 큽니다) 작을 수도 있습니다. 설정 전면 대신 bitvectors의 큐하자 수 있고, "이미 방문한"-

bitvector에서 인덱스의 목록을 추출하면 당신도가 필요하지 않습니다 이 스파 스의 경우에도 특히 쉽지만, 단일 비트 벡터 일 수 있습니다.

편집 : ok 트릭을 사용하면 실제로 그래도 필요할 수도 있지만 비트 캔 및 x &= x -1과 같은 빠른 작업이 필요합니다.

+0

의견을 보내 주셔서 감사합니다. – user1559625

+0

@ user1559625 아마도 비트 알고리즘에 익숙하지 않은 사용자는이 코드를 사용하지 말아야합니다. 디버깅하기가 매우 어려울 것입니다. – harold