Por que a complexidade de tempo do DFS e do BFS O (V + E)

132

O algoritmo básico para 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

Então, eu acho que a complexidade do tempo seria:

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

onde vé vértice 1den

Em primeiro lugar, o que eu disse correto? Em segundo lugar, como é isso O(N + E)e a intuição sobre o porquê seria realmente agradável. obrigado

comum
fonte

Respostas:

268

Sua soma

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

pode ser reescrito como

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

e o primeiro grupo é O(N)enquanto o outro é O(E).

Mihai Maruseac
fonte
1
Mas todo vértice deve ser extraído da fila, e isso é log (| Q |). E essa parte?
Yola
3
log (| Q |) <log (N) <N, portanto, você pode ignorar com segurança o termo no assintótica
Mihai Maruseac
2
Se em uma lista de adjacência, cada vértice estiver conectado a todos os outros vértices, a complexidade seria equivalente a O (V + E) = O (V + V ^ 2) = O (V ^ 2). E = V ^ 2 porque o maior número de arestas = V ^ 2.
Max
De acordo com sua resposta, a complexidade não se tornará O (V + 2E)? Já que toda aresta pode ter uma aresta comum com outra aresta?
karansky
2
Os termos constantes podem ser descartados.
Mihai Maruseac
41

DFS (análise):

  • Definir / obter um rótulo de vértice / borda leva O(1)tempo
  • Cada vértice é rotulado duas vezes
    • uma vez que NÃO EXPLORADO
    • uma vez como VISITADO
  • Cada aresta é rotulada duas vezes
    • uma vez que NÃO EXPLORADO
    • uma vez como DISCOVERY ou BACK
  • O método incidentEdges é chamado uma vez para cada vértice
  • O DFS é executado no O(n + m)tempo, desde que o gráfico seja representado pela estrutura da lista de adjacências
  • Lembre-se que Σv deg(v) = 2m

BFS (análise):

  • Definir / obter um rótulo de vértice / borda leva tempo O (1)
  • Cada vértice é rotulado duas vezes
    • uma vez que NÃO EXPLORADO
    • uma vez como VISITADO
  • Cada aresta é rotulada duas vezes
    • uma vez que NÃO EXPLORADO
    • uma vez como DESCOBERTA ou CRUZ
  • Cada vértice é inserido uma vez em uma sequência Li
  • O método incidentEdges é chamado uma vez para cada vértice
  • O BFS é executado no O(n + m)tempo, desde que o gráfico seja representado pela estrutura da lista de adjacências
  • Lembre-se que Σv deg(v) = 2m
O novo
fonte
tnx para a edição eu sou novo aqui, então eu ainda tentar gerir com tela de edição :)
TheNewOne
1
obrigado por ser específico, mencionando que os gráficos devem ser representados pela estrutura da lista de adjacências, estava me incomodando por que DFS é O (n + m), eu acho que era O (n + 2m) porque cada borda é atravessada duas vezes retrocedendo.
precisa saber é o seguinte
22

Muito simplificado, sem muita formalidade: toda aresta é considerada exatamente duas vezes e todo nó é processado exatamente uma vez, portanto, a complexidade deve ser um múltiplo constante do número de arestas e do número de vértices.

Neetesh Dadwariya
fonte
Muito mais fácil de entender do que a notação matemática, sem maiores explicações, embora seja para isso que o Google serve.
mLstudent33
11

A complexidade do tempo é O(E+V)substituída O(2E+V)porque, se a complexidade do tempo for n ^ 2 + 2n + 7, será escrita como O (n ^ 2).

Portanto, O (2E + V) é escrito como O (E + V)

porque a diferença entre n ^ 2 e n é importante, mas não entre n e 2n.

Dhruvam Gupta
fonte
@Am_I_Helpful alguém está pedindo acima 2E em notação grande-oh .... é por isso que 2 não é considerado em complexidade de tempo.
Dhruvam Gupta 10/09/2015
@Am_I_Helpful, basta ver o post acima da minha resposta .... lá o usuário chamado Kehe CAI escreveu "Acho que todas as arestas foram consideradas duas vezes e todos os nós foram visitados uma vez, então a complexidade total do tempo deve ser O (2E + V ). " Então eu respondi de acordo ... Entendi !!!
Dhruvam Gupta 12/09
Tirei meu downvote única porque você editou sua resposta,
Am_I_Helpful
3

Eu acho que todas as arestas foram consideradas duas vezes e todos os nós foram visitados uma vez; portanto, a complexidade total do tempo deve ser O (2E + V).

Kehe CAI
fonte
Até eu sinto o mesmo. Alguém pode dar mais explicações sobre isso?
Chaitanya
12
A análise Big O ignora a constante. O (2E + V) é O (E + V).
quer
3

Uma explicação intuitiva para isso é simplesmente analisando um único loop:

  1. visite um vértice -> O (1)
  2. um loop for em todas as arestas do incidente -> O (e) onde e é um número de arestas incidentes em um determinado vértice v.

Portanto, o tempo total para um loop único é O (1) + O (e). Agora some-o para cada vértice, pois cada vértice é visitado uma vez. Isto dá

For every V
=> 

    O(1)
    +

    O(e)

=> O(V) + O(E)
Ultrablendz
fonte
2

Explicação curta, mas simples:

No pior caso, você precisaria visitar todo o vértice e a margem, portanto, a complexidade do tempo no pior caso é O (V + E)

CodeYogi
fonte