問題タブ [lowest-common-ancestor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
algorithm - Lowest Common Ancestor (LCA) アルゴリズムに関する不明確な理解
LCA アルゴリズムの O(nlog n) 前処理と O(log n) クエリを学習しようとしていました。Google翻訳の助けを借りてロシアのサイトから読んでいます。しかし、翻訳がうまくいかず、理解するのに苦労しています。 .誰でもこれで私を助けることができますか?
これは、そのWebサイトから取得した疑似コードです
私が理解したこと
グラフをトラバースし、すべての頂点のインタイムとアウトタイムを保存していることはわかっています。
頂点
up[i][j]
の2^j
祖先です。i
理由はわかりました
up[v][0]=p
(2^0
つまり、頂点の最初の祖先v
はその父のみであるため)A
上の関数が何をするのか理解できました.またはの前にどの頂点が発生したかを決定しB
ます.私はアッパー
(a,b)
がLCAよりも真であることを理解してA
おり、同様に2番目のステップです。
理解できないことは、疑似コードで私が言及しています。助けてください。すべてが正しいかどうかを理解したかどうかを確認してください。
PS->私の英語で申し訳ありません。これにはあまり慣れていません。
clojure - 親/子 isa の最小共通祖先? Clojure の階層
この親子階層があるとしましょう:
そのような階層で最も低い共通の祖先を見つける方法を実装するClojureのイディオムは何ですか? すなわち:
私の最初の考えには、各引数の組み合わせをトラバースする再帰関数の使用が含まれますparents
が、おそらくもっと良いアプローチがあると思います。
私の動機は、2 つの引数を取り、引数の型に基づいて最適な実装にディスパッチする multimethod のディスパッチ関数としてこれを使用することです。
algorithm - 与えられたツリーで、ノード 'a' からノード 'b' へのパスの k 番目のノードを Log(n) で見つけますか?
ツリーが与えられた場合、「a」から「b」へのパスで「k」番目のノードを見つける必要があります。つまり、ノード「a」からノード「b」へのパスの「k 番目」の位置にあるノードを見つける必要があります。私は最低共通祖先および/または重軽分解の行で考えていましたが、それがそれを行う方法であるかどうかはわかりません。正しい方向へのガイダンスをいただければ幸いです。
詳細:
- ツリーは二分木ではありません。これは、n-1 個のエッジ、n 個の頂点を持ち、サイクルを持たない無向グラフです。ちょうどあなたの通常の木
- ツリーには、1 から n までの番号が付けられた頂点があります。これらの頂点の n-1 ペアを接続する n-1 個の無向辺があります
- 「a」と「b」は、ツリー内で 1 から n までの番号が付けられた任意の 2 つの頂点です。「a」から「b」へのパスで「k」番目のノードを見つけます。'k' の値が <= 'a' から 'b' へのパス内のノード数であることが保証されています
クエリの数が多いため、すべてのクエリ (「a」から「b」までの k 番目のノード) に適用される BFS はオプションではありません。
tree - SPOJ DISQUERY を解決する方法?
この問題は、最下位共通祖先の概念に基づいています。
ツリー内のノードのペア間のパスの最短エッジと最長エッジの長さを見つける必要があります。
問題へのリンクは次のとおりです: SPOJ DISQUERY