가 일정한 범위 에서 그려진 가장자리 가중치가있는 유 방향 그래프가 있다고 가정 합니다. Dijkstra의 알고리즘을 사용하여 최단 경로를 찾으려면 알고리즘 / 데이터 구조를 수정하고 시간 복잡성을 무엇입니까?
가 일정한 범위 에서 그려진 가장자리 가중치가있는 유 방향 그래프가 있다고 가정 합니다. Dijkstra의 알고리즘을 사용하여 최단 경로를 찾으려면 알고리즘 / 데이터 구조를 수정하고 시간 복잡성을 무엇입니까?
답변:
간선 가중치가 의 정수인 경우 @rrenaud의 제안에 따라 Dijkstra가 O ( K | V | + | E | ) 시간 에 실행되도록 구현할 수 있습니다 . 보다 명확한 설명은 다음과 같습니다.
언제든지 우선 순위 큐의 (유한) 키는 에 있으며, 여기서 D 는 우선 순위 큐에서 제거 된 마지막 키의 값입니다. (각 키는 적어도 인 D 익스트라 알고리즘에 의해 제거 키 시퀀스가 비 감소하므로, 모든 키는 기껏 인 D + K 마다 키 값을 갖기 때문에, D를 [ U ] + w t ( U , w ) 에 대한 약간의 가장자리 ( u , 여기서, d는 [ 유 ] 어떤 정점 광원으로부터의 거리 U 그래서, 이미 제거 된 D [ U ] ≤ D ).
이 때문에 각 셀에 버킷이 포함 된 K + 1 크기 의 원형 배열 를 사용 하여 우선 순위 대기열을 구현할 수 있습니다 . 셀 A [ h ( k ) ] 의 버킷에 키 k 가있는 각 정점을 저장하십시오 . 여기서 h ( k ) = k mod ( K + 1 ) . 추적하십시오 . 다음과 같이 작업을 수행하십시오.
delete-min : 가 비어있는 동안 증가시킵니다 . 그런 다음 에서 꼭짓점을 삭제하고 반환하십시오 .D A [ h ( D ) ]
키 삽입 : 꼭지점을 A [ h ( k ) ] 의 버킷에 추가합니다 .
감소 키 를 k '로 : 정점을 A [ h ( k ) ] 에서 A [ h ( k ' ) ]로 이동 합니다.
삽입 및 감소 키는 상수 시간 작업이므로 해당 작업에 소요 된 총 시간은 입니다. delete-min에 소요 된 총 시간은 O ( | V | ) 에 D 의 최종 값을 더한 것 입니다. D 의 최종 값은 소스에서 모든 정점까지의 최대 (유한) 거리입니다 ( i 반복 을 수행하는 delete-min이 D 를 i 만큼 증가시키기 때문에 ). 최대 거리는 최대 K ( | V | − 1)입니다. 는 각 경로에 최대 | V | − 1 모서리. 따라서 알고리즘이 소비 한 총 시간은 O ( K | V | + | E | ) 입니다.
여기서 는 정수이고 모서리 가중치는 정수 라고 가정합니다 . 그렇지 않으면 실제로 아무것도 사지 않습니다. 최소 가장자리에 비용이 1 이고 최대에 비용이 K 가 되도록 가중치를 항상 다시 조정할 수 있으므로 문제는 표준 최단 경로 문제와 동일합니다.
알고리즘 / 증거 스케치 : 이런 종류의 미친 방식으로 우선 순위 대기열을 비용을 기준으로 목록을 작성하고 표준 Dijkstra 알고리즘을 사용합니다. 힙의 최소 품목 비용을 추적하는 카운터를 유지하십시오. 선형 스캔으로 항목을 삭제 한 후 큐 제거 호출을 해결하십시오 . 예, 이런 종류의 소리는 미쳤지 만 일정한 K선형 스캔에 대해 알고리즘 직관을 속이고 속일 수 있습니다. Disjkstra의 알고리즘이 큐 구현에 적합하기 때문에 마지막 최소 마커에서만 스캔하면됩니다. 큐에 넣을 때까지 큐에 삽입 된 항목은 항상 이전 최소값보다 크거나 같습니다. 가능한 최단 경로 길이는 따라서 상각 스캔 비용은 K × | V | K가 일정하면 = O ( | V | ) 입니다.