ANDノードとORノードを持つ有向グラフを考えてみましょう。 ANDノードは、その中のすべてのエッジがアクティブになったときにのみアクティブになります。 ORノードは、その中の少なくとも1つのエッジがアクティブ化されている場合にアクティブになります。どのように効率的なアルゴリズムを設計すると、すべてのノードを有効にすることができるかどうかを決定する?私はいくつかの素朴なアルゴリズムを考えましたが、O(n^3)時間がかかります。私はまた、その中にエッジがない頂点が最初に活性化されると仮定しています。私はn^3が効率的なアルゴリズムではないと思っています。問題の解決に役立つドメインにタグを付けるANDノードとORノードの有効化
答えて
グラフを前処理して、各ノードのin-degreeを計算することができます。
度数0のすべてのノードをスタックに追加し、各ノード(最初は0に等しい)のアクティブ化カウントを含む配列Aを準備します。
は、その後、次の擬似コードに
visited = set(stack)
while stack:
node = stack.pop()
for dest in node.neighbours():
A[dest] += 1
if ((Type[dest]==AND and A[dest]==indegree[dest]) or
(Type[dest]==OR and A[dest]>0)):
if node not in visited:
visited.add(node)
stack.append(dest)
を行うこれは、最高1回、各エッジと各ノードを訪問するので、線形複雑度を持つことになります。
このプロセスを終了すると、visitedにはアクティブ化されたノードのセットが含まれます。
これは私のコードと本質的に同じだと思いますが、もっとエレガントです:) –
親切な言葉をありがとう:私はそれが遠近法の問題だと思います。 –
すでにアクティブ化されたノードのセットA
、ノードのキューQ
、および各ノードのインエッジのカウンタC
を維持します。エッジでカウントすることにより、
スタート:
for each n in nodes {
for each n2 adjacent to n {
C[n2] += 1
}
}
が続いていないで、エッジとノードとQを初期化:キューが空になるまで
for each n in nodes {
if C[n] == 0 {
add n to Q
}
}
は今、このプロセスを繰り返します。
take q from Q
for each n adjacent to q {
if n is in A { continue }
if n is OR {
add n to A
add n to Q
} else { // n must be AND
C[n] -= 1
if C[n] is 0 {
add n to A
add n to Q
}
}
}
[ORノードとANDノードの違いに対応するトポロジカルソートの変形です] 。
このプロセスが終了すると、A
にはすべてのアクティブ化されたノードが含まれます。
ランタイムはO(V + E)です(Vはグラフのノード数、Eはエッジ数)。
O(n)でも可能です。可能なアルゴリズムは次のとおりです。
n
ノード
s
ノードnは、着信の数をカウントする
c
アレイが活性化されているかどうかを示すために
a
アレイを活性化されたノードの和の合計数ノードnのエッジ
受信エッジがない場合は、ノードを経由して伝達関数を呼び出します。 propagate(i);
。
s == n
の場合、すべてのノードがアクティブ化されています。
propagate
関数の擬似コード:
function propagate(idx) {
if (a[idx]) // is node activated already
return; // return because node was already propagated
a[idx] = true; // activate
s++; // increase the number of activated nodes
for (var j = 0; j < outEdges[idx].length; j++) { // iterate through the outgoing edges
var idx2 = outEdges[idx][j]; // the node the edge is pointing to
if (isOrNode[idx2]) {
propagate(idx2);
} else { // AND node
c[idx2]++; // increase the count of incoming activated edges
if (inEdges[idx2].length == c[idx2]) // all incoming edges have been activated
propagate(idx2);
}
}
}
- 1. PyBrainネットワーク内のすべてのノードの有効化値
- 2. SSLとはProxyPassとノードJSアプリをデプロイするには、有効
- 3. GridPane固有のノード
- 4. "x"日後にノードを削除する方法 - ノードの有効期限?
- 5. (ノード)のノードとunirest
- 6. VBA - 有効化と無効化の有効化
- 7. ノードJSミニ化
- 8. Corda:ノードとトランザクションを共有できないようにノードを共有する
- 9. ノード/エクスプレス:ブラウザとサーバー間のセッション共有
- 10. スプリング4、共有キャッシュのノード
- 11. WMI USBの有効化と無効化
- 12. bootstrapValidator-フィールドの有効化と無効化
- 13. FieldEditorsの有効化と無効化
- 14. sql:トリガーの有効化と無効化
- 15. タッチイベントの有効化と無効化
- 16. Jenkinsパイプライン「ノード内ノード」と「ノード内部ステージ」
- 17. XSLT変化値ノード
- 18. 暗号化ノードJs
- 19. domノードのクローニングの効率
- 20. 無効にツリービューのノード
- 21. SQL Serverのノードを常に有効にします
- 22. 子ノードの有効範囲はありますか?
- 23. travisでノードjsのキャッシュを有効にするには?
- 24. 複数のノード選択を有効にする方法
- 25. MVVMLightと無効化/有効化ボタン
- 26. CheckBox Gridview有効化と無効化
- 27. 無効化と有効化ボタンvb.net
- 28. ノードごとにストリームXMLノード
- 29. d3.jsの強制有向グラフでノードをグループ化する
- 30. 逆シリアル化のXMLノードは
なしの着信エッジを持つすべてのノードは、最初に起動した後、あなたは、グラフを通じてそれを伝播し、すべてのノードがアクティブになっているかどうかを知りたいしていますか? – maraca
はい、それほど素朴ではないアルゴリズムです。 – CoderAmateur
これはデジタルロジック回路ではありません。それはグラフです。質問が混乱していたら、私はごめんなさい。私はデジタルロジック回路に関連するタグについては言及していません。 – CoderAmateur