[algorithm] DFS와 BFS O (V + E)의 시간이 복잡한 이유

BFS의 기본 알고리즘 :

set start vertex to visited

load it into queue

while queue not empty

   for each edge incident to vertex

        if its not visited

            load into queue

            mark vertex

따라서 시간 복잡성은 다음과 같습니다.

v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges)

어디 v정점은 1n

먼저, 내가 말한 것이 맞습니까? 두 번째로, O(N + E)이것이 정말 좋은 이유에 대한이 직관은 어떻습니까? 감사



답변

당신의 합계

v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges)

로 다시 쓸 수 있습니다

(v1 + v2 + ... + vn) + [(incident_edges v1) + (incident_edges v2) + ... + (incident_edges vn)]

첫 번째 그룹은 O(N)다른 그룹은 입니다 O(E).


답변

DFS (분석) :

  • 정점 / 가장자리 레이블 설정 / 가져 오기에는 O(1)시간 이 걸립니다
  • 각 정점은 두 번 표시됩니다
    • 미완성으로 한 번
    • 한 번 방문
  • 각 모서리는 두 번 표시됩니다
    • 미완성으로 한 번
    • DISCOVERY 또는 BACK으로 한 번
  • 각 꼭지점에 대해 methodEdges가 한 번 호출됩니다.
  • O(n + m)그래프가 인접리스트 구조로 표시되는 경우 DFS는 제 시간에 실행됩니다.
  • 기억해 Σv deg(v) = 2m

BFS (분석) :

  • 정점 / 가장자리 레이블 설정 / 가져 오기에는 O (1) 시간이 걸림
  • 각 정점은 두 번 표시됩니다
    • 미완성으로 한 번
    • 한 번 방문
  • 각 모서리는 두 번 표시됩니다
    • 미완성으로 한 번
    • DISCOVERY 또는 CROSS로 한 번
  • 각 정점은 시퀀스에 한 번 삽입됩니다 Li
  • 각 꼭지점에 대해 methodEdges가 한 번 호출됩니다.
  • O(n + m)그래프가 인접리스트 구조로 표시되는 경우 BFS는 제 시간에 실행됩니다.
  • 기억해 Σv deg(v) = 2m

답변

형식이 많지 않고 매우 단순화되었습니다. 모든 모서리는 정확히 두 번 간주되고 모든 노드는 정확히 한 번 처리되므로 복잡도는 정점 수뿐만 아니라 모서리 수의 일정한 배수 여야합니다.


답변

시간 복잡도가 시간 복잡도가 n ^ 2 + 2n + 7 인 경우 O (n ^ 2)로 작성되기 때문에 O(E+V)대신 시간 복잡성이 O(2E+V)발생합니다.

따라서 O (2E + V)는 O (E + V)로 작성됩니다

n ^ 2와 n의 차이는 중요하지만 n과 2n 사이는 중요하지 않기 때문입니다.


답변

나는 모든 에지가 두 번 고려되고 모든 노드가 한 번 방문했다고 생각하므로 총 시간 복잡도는 O (2E + V) 여야합니다.


답변

이에 대한 직관적 인 설명은 단순히 단일 루프를 분석하는 것입니다.

  1. 꼭짓점 방문-> O (1)
  2. 모든 입사 에지에서 for 루프-> O (e) 여기서 e는 주어진 정점 v에서 입사하는 수많은 에지입니다.

따라서 단일 루프의 총 시간은 O (1) + O (e)입니다. 각 정점을 한 번 방문하면 각 정점에 대해 합산하십시오. 이것은 준다

For every V
=>

    O(1)
    +

    O(e)

=> O(V) + O(E)


답변

짧지 만 간단한 설명 :

나는 최악의 경우 모든 정점과 가장자리를 방문해야하므로 최악의 경우 시간 복잡도는 O (V + E)입니다