이 더 간단하고 빠른 알고리즘이 작동한다면 왜 Dijkstra의 알고리즘이 필요합니까?

렉스 에이스

BFS를 통해 전체 그래프를 반복하는 알고리즘이 있으며 모든 노드의 최소값을 찾기 위해 점수를 업데이트합니다. 그리고 이것의 런타임 복잡성은 O (V + E)라고 믿습니다. 이것은 Dijkstra보다 낫다고 생각합니다. 이 알고리즘이 옳다고 생각할만큼 순진하지는 않습니다. 그러나 어떤 경우에 최적의 최소 경로를 찾지 못할 지 궁금합니다. 여기에 내가 가지고있는 코드

from queue import Queue

ad_list = {
    'A': {'B': 1, 'D': 3},
    'B': {'A': 1, 'D': 1, 'C': 5},
    'D': {'A': 3, 'B': 1, 'C': 3},
    'C': {'B': 5, 'D': 3}
}

min_weights = {
    'A': 0,
    'B': float('inf'),
    'C': float('inf'),
    'D': float('inf'),

}


def fake_dijkstra(ad_list):
    queue = Queue()
    queue.put('A')

    visited = {}

    global min_weights

    while not queue.empty():
        key = queue.get()

        # update score
        children = ad_list[key]

        for child_key, value in children.items():
            if min_weights[child_key] > min_weights[key] + value:
                min_weights[child_key] = min_weights[key] + value

        if key in visited:
            continue

        visited[key] = True

        children = ad_list[key]

        for child_key, value in children.items():
            queue.put(child_key)


fake_dijkstra(ad_list)
print(min_weights)

# for this case, it correctly finds the min weight to all nodes
{'A': 0, 'B': 1, 'C': 5, 'D': 2}

어떤 피드백이라도 대단히 감사하겠습니다. 나는 알고리즘을 좋아한다 :).

스토커

귀하의 알고리즘은 O (| V | + | E |) 가 아닙니다 .

각 노드가 다른 모든 노드와 연결된 완전 연결 그래프 G (V, E)를 고려하십시오 .

알고리즘에서 이러한 그래프의 각 노드를 대기열 | V-1 |에 추가합니다. 시간, 시작 노드가 대기열 | V |에 추가됩니다. 타임스. 따라서 큐에 있던 총 요소 수는 | V | x | V-1 | + 1

큐의 각 요소에 대해 모든 | V-1 |을 반복합니다. 최소 체중을 확인하는 어린이.

따라서 총 단계 수는 | V | x | V-1 | x | V-1 | 물론 O (| V | ³)

큐에 사용되는 데이터 구조에 따라 Dijkstra의 알고리즘 범위는 O (| V | ² + | E |) 에서 O (| V | x log | V | + | E |)까지 입니다. 완전히 연결된 그래프 | E | = | V | ² , 따라서 Dijkstras 알고리즘은 O (| V | ²)입니다.

따라서 알고리즘이 주어진 그래프에 대한 최단 경로를 찾을 수있는 것 같습니다 (100 % 확실하지는 않지만 카운터 예제를 찾을 수 없음). 그러나 노드의 자식을 여러 번 재평가하기 때문에 일반적인 BFS가 아닙니다. 그것은 또한 Dijkstra의 알고리즘과의 차이점입니다. 그 당시 노드 X의 자식이 평가되기 때문에 (즉, X-> Y에서 단계를 밟음) A에서 X까지 더 짧은 경로가 없음이 보장됩니다. 따라서 O- 복잡도 가 낮습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Dijkstra 알고리즘이 DFS보다 빠릅니까?

분류에서Dev

한 알고리즘의 시간 복잡성이 다른 알고리즘으로 이어 지나요?

분류에서Dev

성능 : 동일한 알고리즘의 첫 번째 구현이 훨씬 더 빠른 이유

분류에서Dev

이 알고리즘이 실제로 작동합니까? 하위 집합 역 추적 알고리즘의 합계

분류에서Dev

한 알고리즘이 동일한 시간 복잡도로 다른 알고리즘보다 빠른 이유는 무엇입니까?

분류에서Dev

목록이 맵보다 알고리즘 적으로 더 빠른 때는 언제입니까?

분류에서Dev

Dijkstra의 알고리즘 구현이 계속 엉망이됩니다.

분류에서Dev

힙 공간이 부족한 Java의 Dijkstra 알고리즘?

분류에서Dev

무한 (끝없는) 알고리즘을 올바른 알고리즘이라고 부를 수 있습니까?

분류에서Dev

한 알고리즘이 다른 알고리즘보다 빠른 이유 (연결 목록으로 숫자 추가)

분류에서Dev

prim의 알고리즘과 유사한이 알고리즘은 9-10 행에서 무엇을합니까?

분류에서Dev

C의 이상한 알고리즘

분류에서Dev

이 '순위'알고리즘을 구현하는 더 빠른 방법이 있습니까?

분류에서Dev

순차적 알고리즘의 Dask 반복이 이전 알고리즘보다 깁니다.

분류에서Dev

이미지 왜곡 보정 알고리즘의 잘못된 동작

분류에서Dev

알고리즘에 대한 도움이 필요합니다

분류에서Dev

내 뉴턴 알고리즘을 해결하는 더 빠른 방법이 있습니까?

분류에서Dev

이 숫자 쌍을 정렬하는 데 더 빠른 알고리즘은 무엇입니까?

분류에서Dev

KMP 알고리즘을 사용하는 것보다 'in'연산자를 사용하여 하위 문자열 검색이 더 빠른 이유는 무엇입니까?

분류에서Dev

NetworkX의 Girvan-Newman 알고리즘이 왜 그렇게 느린가요?

분류에서Dev

JS의 단순한 계승 알고리즘이 Python 또는 R보다 훨씬 빠른 이유는 무엇입니까?

분류에서Dev

Yen의 Bellman-Ford 알고리즘 수정이 DAG에서 작동합니까?

분류에서Dev

이 알고리즘이 작동합니까?

분류에서Dev

최악의 시간에 2 ^ (n / 2)보다 조금 더 빠른 부분 집합 합계 알고리즘?

분류에서Dev

나무 블록 퍼즐 게임을 풀려면 어떤 종류의 알고리즘이 필요합니까?

분류에서Dev

빠른 정렬 알고리즘이 제대로 작동하지 않음

분류에서Dev

C ++에서 병합 정렬 알고리즘의 이상한 동작

분류에서Dev

Big-O 의미에서 어떤 알고리즘이 더 낫습니까?

분류에서Dev

왜 2 ^ n이고 n이 아닙니다! : 알고리즘 설계 매뉴얼 : 1.2 올바른 작업 선택 (10 페이지)

Related 관련 기사

  1. 1

    Dijkstra 알고리즘이 DFS보다 빠릅니까?

  2. 2

    한 알고리즘의 시간 복잡성이 다른 알고리즘으로 이어 지나요?

  3. 3

    성능 : 동일한 알고리즘의 첫 번째 구현이 훨씬 더 빠른 이유

  4. 4

    이 알고리즘이 실제로 작동합니까? 하위 집합 역 추적 알고리즘의 합계

  5. 5

    한 알고리즘이 동일한 시간 복잡도로 다른 알고리즘보다 빠른 이유는 무엇입니까?

  6. 6

    목록이 맵보다 알고리즘 적으로 더 빠른 때는 언제입니까?

  7. 7

    Dijkstra의 알고리즘 구현이 계속 엉망이됩니다.

  8. 8

    힙 공간이 부족한 Java의 Dijkstra 알고리즘?

  9. 9

    무한 (끝없는) 알고리즘을 올바른 알고리즘이라고 부를 수 있습니까?

  10. 10

    한 알고리즘이 다른 알고리즘보다 빠른 이유 (연결 목록으로 숫자 추가)

  11. 11

    prim의 알고리즘과 유사한이 알고리즘은 9-10 행에서 무엇을합니까?

  12. 12

    C의 이상한 알고리즘

  13. 13

    이 '순위'알고리즘을 구현하는 더 빠른 방법이 있습니까?

  14. 14

    순차적 알고리즘의 Dask 반복이 이전 알고리즘보다 깁니다.

  15. 15

    이미지 왜곡 보정 알고리즘의 잘못된 동작

  16. 16

    알고리즘에 대한 도움이 필요합니다

  17. 17

    내 뉴턴 알고리즘을 해결하는 더 빠른 방법이 있습니까?

  18. 18

    이 숫자 쌍을 정렬하는 데 더 빠른 알고리즘은 무엇입니까?

  19. 19

    KMP 알고리즘을 사용하는 것보다 'in'연산자를 사용하여 하위 문자열 검색이 더 빠른 이유는 무엇입니까?

  20. 20

    NetworkX의 Girvan-Newman 알고리즘이 왜 그렇게 느린가요?

  21. 21

    JS의 단순한 계승 알고리즘이 Python 또는 R보다 훨씬 빠른 이유는 무엇입니까?

  22. 22

    Yen의 Bellman-Ford 알고리즘 수정이 DAG에서 작동합니까?

  23. 23

    이 알고리즘이 작동합니까?

  24. 24

    최악의 시간에 2 ^ (n / 2)보다 조금 더 빠른 부분 집합 합계 알고리즘?

  25. 25

    나무 블록 퍼즐 게임을 풀려면 어떤 종류의 알고리즘이 필요합니까?

  26. 26

    빠른 정렬 알고리즘이 제대로 작동하지 않음

  27. 27

    C ++에서 병합 정렬 알고리즘의 이상한 동작

  28. 28

    Big-O 의미에서 어떤 알고리즘이 더 낫습니까?

  29. 29

    왜 2 ^ n이고 n이 아닙니다! : 알고리즘 설계 매뉴얼 : 1.2 올바른 작업 선택 (10 페이지)

뜨겁다태그

보관