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


132

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)이것이 정말 좋은 이유에 대한이 직관은 어떻습니까? 감사

답변:


268

당신의 합계

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).


1
그러나 모든 정점은 대기열에서 추출되어야하며 이것은 log (| Q |)입니다.이 부분은 어떻습니까?
Yola

3
log (| Q |) <log (N) <따라서 점근 법의 용어를 무시해도됩니다.
Mihai Maruseac

2
인접 목록에있는 경우 각 정점이 다른 모든 정점에 연결되어 있으면 복잡도가 O (V + E) = O (V + V ^ 2) = O (V ^ 2)와 같습니다. 가장 많은 수의 모서리가 V ^ 2이므로 E = V ^ 2입니다.
Max

당신의 대답에 따르면, 복잡성이 O (V + 2E)가되지 않습니까? 모든 모서리가 다른 모서리와 공통 모서리를 가질 수 있습니까?
karansky

2
상수 항을 삭제할 수 있습니다.
Mihai Maruseac

41

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

편집을위한 tnx 나는 여기에 새로
왔으므로

1
그래프가 인접 목록 구조로 표현된다는 점을 언급함으로써 구체적으로 감사드립니다 .DFS가 O (n + m) 인 이유를 알려주었습니다. 각 모서리가 두 번 순회되므로 O (n + 2m)라고 생각합니다. 역 추적.
mib1413456

22

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


비록 구글에 대한 것이지만 추가 설명없이 수학 표기법보다 이해하기가 훨씬 쉽습니다.
mLstudent33

11

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

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

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


@Am_I_Helpful 누군가가 2E를 큰 표기법으로 요구하고 있습니다.
Dhruvam Gupta

@Am_I_Helpful 그냥 내 답변 위의 게시물을 참조하십시오 .... Kehe CAI라는 사용자가 작성했습니다. ). " 그래서 나는 acordingly 대답했다.…
Dhruvam Gupta

내 downvote을 제거 단지 당신이 당신의 대답은 편집 때문에
Am_I_Helpful

3

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


심지어 같은 느낌. 누구든지 이것에 대해 더 설명 할 수 있습니까?
Chaitanya

12
큰 O 분석은 상수를 무시합니다. O (2E + V)는 O (E + V)입니다.
Hemm

3

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

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

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

For every V
=> 

    O(1)
    +

    O(e)

=> O(V) + O(E)

2

짧지 만 간단한 설명 :

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.