범위에서 가져온 간선 가중치에 대한 Dijkstra의 알고리즘 수정


10

가 일정한 범위 에서 그려진 가장자리 가중치가있는 유 방향 그래프가 있다고 가정 합니다. Dijkstra의 알고리즘을 사용하여 최단 경로를 찾으려면 알고리즘 / 데이터 구조를 수정하고 시간 복잡성을 무엇입니까?[1,,K]KO(|V|+|E|)


데이터 구조는 무엇입니까? 그리고 당신은 더 적은 얻을 수 없습니다 . 강의를 검토하십시오. O(V+E)
jonaprieto

뚜렷한 모서리 무게의 가능성이 작다고해서 거리가 작다는 의미는 아닙니다.
Joe

3
먼저 그래프의 파란색 정점을 파란색으로 한 다음 크기 의 각 모서리 를 모서리 로 세분화하고 ( 무색 정점 을 추가하여 )이 새로운 그래프에서 BFS를 실행하여 시작 노드에서 파란색 노드까지의 최단 경로를 찾으십시오. 상수 가 있으면 입니다. t t 1 O ( | V | + | E | ) kttt1O(|V|+|E|)k

@SaeedAmiri 왜 이것을 답으로 쓰지 않습니까?
Joe

@Joe는 dijkstra를 수정하지 않기 때문에 (적어도 직접 dijkstra와 관련이 없습니다).

답변:


16

간선 가중치가 의 정수인 경우 @rrenaud의 제안에 따라 Dijkstra가 O ( K | V | + | E | ) 시간 에 실행되도록 구현할 수 있습니다 . 보다 명확한 설명은 다음과 같습니다.{0,1,,K}O(K|V|+|E|)

언제든지 우선 순위 큐의 (유한) 키는 에 있으며, 여기서 D 는 우선 순위 큐에서 제거 된 마지막 키의 값입니다. (각 키는 적어도 인 D 익스트라 알고리즘에 의해 제거 키 시퀀스가 비 감소하므로, 모든 키는 기껏 인 D + K 마다 키 값을 갖기 때문에, D를 [ U ] + w t ( U , w ) 에 대한 약간의 가장자리 ( u ,{D,D+1,,D+K}DDD+Kd[u]+wt(u,w) 여기서, d는 [ ] 어떤 정점 광원으로부터의 거리 U 그래서, 이미 제거 된 D [ U ] D ).(u,w)d[u]ud[u]D

이 때문에 각 셀에 버킷이 포함 된 K + 1 크기 의 원형 배열 를 사용 하여 우선 순위 대기열을 구현할 수 있습니다 . 셀 A [ h ( k ) ] 의 버킷에 키 k 가있는 각 정점을 저장하십시오 . 여기서 h ( k ) = k mod ( K + 1 ) . 추적하십시오 . 다음과 같이 작업을 수행하십시오.A[0..K]케이+1케이[h(케이)]h(케이)=케이모드(케이+1)

  • delete-min : 가 비어있는 동안 증가시킵니다 . 그런 다음 에서 꼭짓점을 삭제하고 반환하십시오 .D A [ h ( D ) ][h()][h()]

  • 삽입 : 꼭지점을 A [ h ( k ) ] 의 버킷에 추가합니다 .케이[h(케이)]

  • 감소 키 k '로 : 정점을 A [ h ( k ) ] 에서 A [ h ( k ' ) ]로 이동 합니다.케이케이'[h(케이)][h(케이')]

삽입 및 감소 키는 상수 시간 작업이므로 해당 작업에 소요 된 총 시간은 입니다. delete-min에 소요 된 총 시간은 O ( | V | )D 의 최종 값을 더한 것 입니다. D 의 최종 값은 소스에서 모든 정점까지의 최대 (유한) 거리입니다 ( i 반복 을 수행하는 delete-min이 Di 만큼 증가시키기 때문에 ). 최대 거리는 최대 K ( | V |1)입니다.영형(|V|+|이자형|)영형(|V|)나는나는 는 각 경로에 최대 | V | 1 모서리. 따라서 알고리즘이 소비 한 총 시간은 O ( K | V | + | E | ) 입니다.케이(|V|1)|V|1영형(케이|V|+|이자형|)


나는 원형 대기열을 좋아합니다. 기본적으로 av 크기의 슬라이스 만 주어진 시간에 K * v 크기 배열을 사용한다는 생각보다 낫습니다.
rrenaud

이중 링크 목록을 사용하여 구현했지만 여전히 min 키를 찾는 데 O (1)임을 의미합니까?
user1675999

@ user1675999, 확실하지 않습니다. 목록이 키별로 정렬되어 있으면 키를 효율적으로 삽입 및 축소하는 방법은 무엇입니까? 목록을 키별로 정렬하지 않은 경우 delete-min을 효율적으로 수행하는 방법은 무엇입니까?
닐 영

5

여기서 는 정수이고 모서리 가중치는 정수 라고 가정합니다 . 그렇지 않으면 실제로 아무것도 사지 않습니다. 최소 가장자리에 비용이 1 이고 최대에 비용이 K 가 되도록 가중치를 항상 다시 조정할 수 있으므로 문제는 표준 최단 경로 문제와 동일합니다.케이1케이

알고리즘 / 증거 스케치 : 이런 종류의 미친 방식으로 우선 순위 대기열을 비용을 기준으로 목록을 작성하고 표준 Dijkstra 알고리즘을 사용합니다. 힙의 최소 품목 비용을 추적하는 카운터를 유지하십시오. 선형 스캔으로 항목을 삭제 한 후 큐 제거 호출을 해결하십시오 . 예, 이런 종류의 소리는 미쳤지 만 일정한 K케이×|V|케이선형 스캔에 대해 알고리즘 직관을 속이고 속일 수 있습니다. Disjkstra의 알고리즘이 큐 구현에 적합하기 때문에 마지막 최소 마커에서만 스캔하면됩니다. 큐에 넣을 때까지 큐에 삽입 된 항목은 항상 이전 최소값보다 크거나 같습니다. 가능한 최단 경로 길이는 따라서 상각 스캔 비용은 K × | V | K가 일정하면 = O ( | V | ) 입니다.케이×|V|K×|V|=O(|V|)


-2

토폴로지 정렬을 사용하여 솔루션을 찾고, 소스가 0도를 갖도록하고, 소스에서 각 가장자리에서 벗어나 다른 정점이 0 도인 경우 큐에 넣고 계속 수행하십시오. 이 경우 (그래프 내부에 사이클이 없으면) 모든 정점과 가장자리를 한 번만 통과하므로 V + E를 얻을 수 있습니다.


질문과 관련이없는 것 같습니까? 문제는 그래프가 비 주기적이라고 가정하지 않으며 솔루션은 가중치가 일정한 범위에서 도출된다는 사실을 사용하지 않습니다.
xskxzr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.