タグ付けされた質問 「trees」

特別な種類のグラフ、つまり、接続されたサイクルフリーのグラフに関する質問。

2
BIT:バイナリインデックスツリーの背後にある直感とは何ですか?
バイナリインデックス付きツリーは、他のデータ構造と比較して、文献が非常に少ないか比較的少ないです。それが教えられる唯一の場所はtopcoderチュートリアルです。チュートリアルはすべての説明で完了していますが、そのようなツリーの背後にある直感を理解できませんか?どうやって発明されたのですか?その正確さの実際の証拠は何ですか?

3
トラバーサルが1つだけの無向ツリーの最長パス
2つの深さ優先検索を使用して、無向木で最長パスを見つけるためのこの標準アルゴリズムがあります。 ランダムな頂点からDFSを開始し、そこから最も遠い頂点を見つけます。それがv ′だと言う。vvvv′v′v' 次に、からDFSを開始して、最も遠い頂点を見つけます。このパスは、グラフ内で最も長いパスです。v′v′v' 問題は、これをより効率的に行えるかどうかです。単一のDFSまたはBFSでそれを行うことはできますか? (これは、無向木の直径を計算する問題と同等に説明できます。)

2
基数ツリーとパトリシアの試行の違いは何ですか?
私は基数ツリー(別名圧縮試行)とパトリシア試行について学習していますが、実際に同じであるかどうかについて矛盾する情報を見つけています。基数ツリーは、ノードが唯一の子ノードである場合にノードをその親とマージすることにより、通常の(圧縮されていない)トライから取得できます。これはパトリシアの試みにも当てはまります。2つのデータ構造はどのように異なっていますか? たとえば、NISTは2つを同じものとしてリストします。 パトリシアツリー (データ構造) 定義:唯一の子であるノードがその親とマージされるトライのコンパクトな表現。 基数ツリーとも呼ばれます。 ウェブ上の多くの情報源は同じことを主張しています。しかし、どうやらパトリシアの試みは基数の木の特殊なケースです。ウィキペディアのエントリは言う: PATRICIAの試行は、基数が2の基数の試行です。つまり、キーの各ビットが個別に比較され、各ノードが双方向(つまり、左対右)ブランチになります。 私はこれを本当に理解していません。違いは、ルックアップを行う際の比較の方法だけですか?各ノードを「双方向ブランチ」にするにはどうすればよいですか?ALPHABET_SIZE与えられたノードに対して可能な限り多くのブランチがあるべきではありませんか? 誰かがこれを明確にすることはできますか?実用的な目的のために、基数の試行は通常、パトリシアの試行として実装されていますか?または、そのような一般化を行うことはできませんか?

2
Cのvoid型がempty / bottom型と類似していないのはなぜですか?
ウィキペディアと私が見つけた他のソースはvoid、空のタイプではなくユニットタイプとしてリストCのタイプを見つけました。void空の/下の型の定義によりよく適合するように思えるので、この混乱を見つけます。 void私が知る限り、値は存在しません。 戻り値の型がvoidの関数は、関数が何も返さないため、何らかの副作用しか実行できないことを指定します。 タイプのポインターvoid*は、他のすべてのポインタータイプのサブタイプです。また、void*C との間の変換は暗黙的です。 最後の点voidに、空の型であることの引数としてのメリットがあるかどうかはわかりvoid*ませんvoid。 一方、voidそれ自体は他のすべてのタイプのサブタイプではありません。これは、タイプがボトムタイプであるための要件であると言えます。
28 type-theory  c  logic  modal-logic  coq  equality  coinduction  artificial-intelligence  computer-architecture  compilers  asymptotics  formal-languages  asymptotics  landau-notation  asymptotics  turing-machines  optimization  decision-problem  rice-theorem  algorithms  arithmetic  floating-point  automata  finite-automata  data-structures  search-trees  balanced-search-trees  complexity-theory  asymptotics  amortized-analysis  complexity-theory  graphs  np-complete  reductions  np-hard  algorithms  string-metrics  computability  artificial-intelligence  halting-problem  turing-machines  computation-models  graph-theory  terminology  complexity-theory  decision-problem  polynomial-time  algorithms  algorithm-analysis  optimization  runtime-analysis  loops  turing-machines  computation-models  recurrence-relation  master-theorem  complexity-theory  asymptotics  parallel-computing  landau-notation  terminology  optimization  decision-problem  complexity-theory  polynomial-time  counting  coding-theory  permutations  encoding-scheme  error-correcting-codes  machine-learning  natural-language-processing  algorithms  graphs  social-networks  network-analysis  relational-algebra  constraint-satisfaction  polymorphisms  algorithms  graphs  trees 

7
BFS / DFSを使用して木の直径を見つけるアルゴリズム。なぜ機能するのですか?
このリンクは、BFS / DFSを使用して無向木の直径を見つけるためのアルゴリズムを提供します。要約: グラフ内のノードsでBFSを実行し、最後に検出されたノードuを記憶します。最後に検出されたノードvを思い出して、uからBFSを実行します。d(u、v)は木の直径です。 なぜ機能するのですか? このページ2には理由がありますが、混乱を招きます。証明の最初の部分を引用しています: グラフ内のノードsでBFSを実行し、最後に検出されたノードuを記憶します。最後に検出されたノードvを思い出して、uからBFSを実行します。d(u、v)は木の直径です。 正しさ:d(a、b)が木の直径になるように、aとbを2つのノードとします。aからbへの一意のパスがあります。tをBFSによって検出されたそのパス上の最初のノードとします。sからuへのパスとaからbへのがエッジを共有しない場合、tからuへのパスにはsが含まれます。そうp1p1p_1p2p2p_2 d(t,u)≥d(s,u)d(t,u)≥d(s,u)d(t,u) \ge d(s,u) d(t,u)≥d(s,a)d(t,u)≥d(s,a)d(t,u) \ge d(s,a) ....(さらに不等式が続きます..) 不平等は私には意味がありません。

5
ラベルなしツリーの効率的な圧縮
ラベルのない、ルート付きのバイナリツリーを検討してください。私たちはできる圧縮サブツリーへのポインタがあるたび:そのような木をTTTとT′T′T'とT=T′T=T′T = T'(通訳===構造的平等など)、我々は保存(WLOG)TTTとのすべてのポインタ置き換えるT′T′T'へのポインタでTTT。例については、uliの回答を参照してください。 上記の意味でツリーを入力として使用し、圧縮後に残る(最小限の)ノード数を計算するアルゴリズムを提供します。このアルゴリズムは、入力のノード数nで、時間O(n log n )O(nlogn)O(nlog⁡n)\cal{O}(n\log n)(均一コストモデル)で実行する必要があります。nnn これは試験問題であり、良い解決策を思い付くことができず、見たこともありません。

1
なぜ関数型プログラミングは動的ツリーを研究していないのですか?
動的ツリーは、ネットワークフロー、動的グラフ、組み合わせの問題(TarjanおよびWerneckによる「Dynamic Trees in Practice」)や最近の辞書のマージ(Adam Karczmarzによる「A Simple Mergeable Dictionary」)などの問題の解決に重要な役割を果たします。 動的ツリーについては、1983年のSleator&Tarjanの論文「動的ツリーのデータ構造」に記載されている定義を参照します。 Edward Kmettは、主にC ++の対応物の翻訳として、STツリーのバージョンを実装しました。リンクカットツリーを参照してください。 クリス・オカサキは、著名な著書「純粋に機能的なデータ構造」に、スプレイツリーの限定的な実装を書いています。 Ralf HinzeとRoss Patersonは、2〜3本のフィンガーツリーと呼ばれる機能的なデータ構造を導入しましたが、動的ツリーの元の定義とは多少異なる目的があります。 動的ツリーの実装(およびパフォーマンス)は、次の3つのアプローチに従って分割されます。 ETツリー(オイラーツアー)が重要な役割を果たす線形化。純粋に機能的な研究は見つかりませんでした。 STツリーが主力であるパス分解では、Kmettのバージョンが見つかりました。 ツリーの収縮。トップツリー、トポロジツリー、およびRCツリーがプレーヤーです。純粋に機能的な研究は見つかりませんでした。 純粋に機能的な分析と実装は、Splay、AVL、赤黒木で見つけることができますが、それらは動的な木ではありません。前者は後者のシャドウ(仮想または補助とも呼ばれる)データ構造と見なされます。 だから、私の質問は: 関数型プログラミング研究コミュニティが動的ツリーデータ構造に参加しない理由(欠点、弱点)は何ですか?


1
Knuth、de Bruijn、Riceの「植えられた平面の木の平均高さ」(1972)
私はタイトルの古典的な論文を基本的な手段(生成関数、複雑な解析、フーリエ解析なし)だけで導き出そうとしていますが、精度はずっと低くなっています。要するに、私は、「のみ」を証明したいと平均高さhnhnh_nを有するツリーのnnnのノード(すなわち、葉へのルートからノードの最大数)を満たすのhn∼πn−−−√hn∼πnh_n \sim \sqrt{\pi n}。 AnhAnhA_{nh}hhhAnh=AnnAnh=AnnA_{nh} = A_{nn}B N H N H + 1件のB N H = A N N - A nは、H、H 、N = S N / A N N S N S N = Σ H ⩾ 1 H (A N H - A N 、H - 1)= Σ …

3
再帰、スタック、またはキューなしでツリーをたどることができますか?
半年前、私はデータ構造クラスに座っていました。そこでは、再帰、スタック、キューなど(または他の同様のデータ構造)といくつかのポインターを使用せずに誰もがツリーを横断できる場合、教授は追加のクレジットを提供しました。私はその質問に対する明白な答えだと思ったものを思いついたが、それは教授によって最終的に受け入れられた。私は同じ学部の別の教授と一緒に離散数学クラスに座っていました。彼は、再帰、スタック、キューなどなしでツリーを横断することは不可能であり、私の解決策は無効であると主張しました。 それで、それは可能ですか、不可能ですか?なぜですか? 編集:明確化を追加するために、3つの要素(各ノードに保存されたデータと2つの子へのポインター)を持つバイナリツリーにこれを実装しました。私のソリューションは、わずかな変更を加えるだけでn項ツリーに拡張できます。 私のデータ構造の教師は、ツリーの変更に対して何の制約も課していませんでした。実際、彼自身の解決策は、子ポインターを使用してツリーを下に向けることであることがわかりました。私の離散数学教授は、ツリーの突然変異は、ツリーの数学的な定義によるとツリーではなくなったことを意味し、彼の定義は親へのポインタも排除することを言った-これは上記で解決した場合と一致します。

2
木の頂点の最小カバーのための欲張りアルゴリズムの正当性証明
DFSトラバーサルを使用するツリーの最小頂点カバーを見つけるための貪欲なアルゴリズムがあります。 ツリーの葉ごとに、その親を選択します(つまり、その親は最小の頂点カバー内にあります)。 各内部ノードに対して: その子のいずれかが選択されていない場合、このノードを選択します。 この貪欲な戦略が最適な答えを与えることをどのように証明しますか?上記のアルゴリズムが生成するものよりもサイズが小さい頂点カバーがないこと?

2
ツリーの線形時間ラベル付けアルゴリズム?
頂点にラベルを付けたい無向ツリーがあります。リーフノードには1つのラベルを付ける必要があります。次に、葉が取り除かれたと仮定します。残っているツリーでは、葉に2つのラベルを付ける必要があります。このプロセスは、すべての頂点にラベルが付くまで明白な方法で続きます。これを行う理由は、頂点をキューに保存し、それらを「最初に残す」ことです。この時間を実行する簡単な方法はありますか?O(n+m)O(n+m)O(n+m) すべてのステップでBFSを実行することで問題を解決できます。しかし最悪の場合、すべてのステップですべての頂点を通過し、ちょうど2つのリーフを削除してキューに入れます。これには二次時間がかかると思います。 別のアイデアは、最初にすべての葉を見つけ、次にすべての葉からBFSを実行することでした。これは私に望ましい解決策を与えません。たとえば、次の図のような「クラウングラフ」の種類を考えます。目的のソリューションが示されていますが、各リーフからBFSを起動すると、2つのラベルのみが使用されます。 理想的には、線形時間アルゴリズムの説明と実装も簡単です。
12 algorithms  trees 

4
2つの異なるツリーの予約注文トラバーサルは、たとえ異なっていても同じですか?
この質問は、それらが可能であることをかなり説明していますが、同じプレオーダートラバーサルを持つ2つの異なるツリーがある例は示していません。 また、構造的には異なりますが、2つの異なるツリーの順序トラバーサルは同じでもかまいません。この例はありますか?

1
間隔のマップのデータ構造
ましょ整数であり、およびlet全ての整数の集合を表します。ましょう整数の意味間隔。nnnZZ\mathbb{Z}[a,b][a,b][a,b]{a,a+1,a+2,…,b}{a,a+1,a+2,…,b}\{a,a+1,a+2,\dots,b\} マップを表すデータ構造を探しています。データ構造で次の操作をサポートする必要があります。f:[1,n]→Zf:[1,n]→Zf:[1,n] \to \mathbb{Z} get(i)get(i)\text{get}(i)は返します。f(i)f(i)f(i) set([a,b],y)set([a,b],y)\text{set}([a,b],y)更新する必要がので、すなわち、更新新しいマップにこのような forおよび for。ffff(a)=f(a+1)=⋯=f(b)=yf(a)=f(a+1)=⋯=f(b)=yf(a)=f(a+1)=\cdots=f(b)=yffff′f′f'f′(i)=yf′(i)=yf'(i) = yi∈[a,b]i∈[a,b]i \in [a,b]f′(i)=f(i)f′(i)=f(i)f'(i) = f(i)i∉[a,b]i∉[a,b]i \notin [a,b] stab(i)stab(i)\text{stab}(i)は、とが一定になるような最大間隔を返す必要があります(つまり、)。[a,b][a,b][a,b]i∈[a,b]i∈[a,b]i \in [a,b]fff[a,b][a,b][a,b]f(a)=f(a+1)=⋯=f(b)f(a)=f(a+1)=⋯=f(b)f(a)=f(a+1)=\cdots=f(b) add([a,b],δ)add([a,b],δ)\text{add}([a,b],\delta)更新する必要が新しいマップにようにためのと for。、F ' 、F '(I )= F (I )+ δ I ∈ [ 、B ] F '(I )= F (I )I ∉ 〔、B ]ffff′f′f'f′(i)=f(i)+δf′(i)=f(i)+δf'(i) = f(i) + \deltai∈[a,b]i∈[a,b]i \in [a,b]f′(i)=f(i)f′(i)=f(i)f'(i) = …

1
このコードが終了する可能性は何ですか?
私はこのPythonコードを書いて、それが時々単に終了しないのではないかと考えました(無限のメモリ/時間と再帰の深さの制限がないと仮定した場合)。 直感的には、ある時点でluckyを取得する必要があるため、終了すると思います。終了しない場合、ラッキーを取得するための時間は無限です。一方、再帰の深さが増すにつれて、あなたは指数関数的にもっと幸運になる必要があります。 import random def random_tree(): if random.random() < 0.5: return 0 return [random_tree() for _ in range(random.randint(1, 5))] random_tree常に終了するとは限らない場合、なぜ、そしてそれが終了する可能性は何ですか? 私はを使用してそれを計算しようとしましたが、これはどちらかが非常に役に立たないということです答えまたは...。0.684124 1P= 1 − (1 − 0.5 )(1 − (P+ P2+ P3+ P4+ P5)/ 5 )P=1−(1−0.5)(1−(P+P2+P3+P4+P5)/5)P = 1 - (1 - 0.5)(1 - (P + P^2 + P^3 + P^4 …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.