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
は頂点1
からn
です
まず、私が言ったことは正しいですか?第二に、この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)
時間かかりますO(n + m)
時間で実行されますΣv deg(v) = 2m
を思い出してくださいBFS(分析):
Li
に1回挿入されますO(n + m)
時間で実行されますΣv deg(v) = 2m
を思い出してくださいあまり形式的ではない非常に単純化されています。すべてのEdgeは正確に2回考慮され、すべてのノードは正確に1回処理されるため、複雑さはEdgeの数と頂点の数の定数倍でなければなりません。
時間の複雑さは、O(E+V)
ではなくO(2E+V)
です。これは、時間の複雑さがn ^ 2 + 2n + 7の場合、O(n ^ 2)と書き込まれるためです。
したがって、O(2E + V)はO(E + V)と記述されます
これは、n ^ 2とnの差が重要であり、nと2nの差ではないためです。
すべてのEdgeが2回考慮され、すべてのノードが1回アクセスされたため、合計時間の複雑さはO(2E + V)になるはずです。
短いが簡単な説明:
最悪の場合、すべての頂点とエッジを訪問する必要があります。したがって、最悪の場合の時間の複雑さはO(V + E)です。
これに対する直感的な説明は、単純に単一のループを分析することです。
したがって、単一ループの合計時間はO(1)+ O(e)です。各頂点を1回訪れたときに、各頂点について合計します。これは与える
Sigma_i
p {
height: 50px;
line-height: 50px;
}
span {
position: relative;
font-size: 2.5em;
display: inline-block;
line-height: .7em;
vertical-align: middle;
}
span:before {
font-size: 12px;
display: block;
position absolute;
left: 0;
top: 0;
content: "V";
width: 22px;
text-align: center;
}
span:after {
font-size: 12px;
display: block;
position absolute;
left: 0;
bottom: 0;
content: "k = 1";
width: 27px;
text-align: center;
}
<p>
<span>Σ</span>
O(1) + O(e)
=>
<span>Σ</span>
O(1)
+
<span>Σ</span>
O(e)
=> O(V) + O(E)
</p>
[O(1) + O(e)]