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

4
抽象構文ツリーはどのくらい正確に作成されますか?
私はASTの目標を理解しており、以前にツリー構造をいくつか構築したことがありますが、ASTを構築したことはないと思います。ノードはテキストであり番号ではないため、ほとんど混乱しています。そのため、コードを解析しているときにトークン/文字列を入力する良い方法は考えられません。 たとえば、ASTの図を見ると、変数とその値は等号のリーフノードでした。これは私にとって完全に理にかなっていますが、これをどのように実装しますか?私はケースバイケースでそれを行うことができると思うので、「=」につまずいたとき、ノードとしてそれを使用し、「=」の前に解析された値をリーフとして追加します。私はおそらく構文に応じて、たくさんの事柄のケースを作成しなければならないので、それは間違っているようです。 そして、私は別の問題に遭遇しました、ツリーはどのように横断されますか?高さを一番下に移動し、最下部に到達したらノードを上に移動し、隣のノードでも同じことをしますか? ASTで多数の図を見てきましたが、コードで簡単な例を見つけることができませんでした。おそらく役立つでしょう。

3
抽象構文ツリーの訪問者パターンの実装
私は自分のプログラミング言語を作成している最中で、それは学習目的のためにしています。私はすでに自分の言語のサブセット用にレクサーと再帰降下パーサーを作成しました(現在、などの数式をサポートし+ - * /ています)。パーサーは、抽象構文ツリーを返します。抽象ツリーでは、Evaluateメソッドを呼び出して式の結果を取得します。すべて正常に動作します。ほぼ私の現在の状況は次のとおりです(C#のコード例、これはほとんど言語に依存しません): public abstract class Node { public abstract Double Evaluate(); } public class OperationNode : Node { public Node Left { get; set; } private String Operator { get; set; } private Node Right { get; set; } public Double Evaluate() { if (Operator == "+") return …

3
再帰を使用せずにツリーを横断するにはどうすればよいですか?
メモリノードツリーが非常に大きいため、ツリーを走査する必要があります。各子ノードの戻り値を親ノードに渡します。これは、すべてのノードのデータがルートノードまでバブルするまで実行する必要があります。 トラバーサルはこのように機能します。 private Data Execute(Node pNode) { Data[] values = new Data[pNode.Children.Count]; for(int i=0; i < pNode.Children.Count; i++) { values[i] = Execute(pNode.Children[i]); // recursive } return pNode.Process(values); } public void Start(Node pRoot) { Data result = Execute(pRoot); } これは正常に機能しますが、コールスタックがノードツリーのサイズを制限するのではないかと心配しています。 への再帰呼び出しExecuteが行われないように、どのようにコードを書き直すことができますか?
19 c#  optimization  trees 

2
構文解析ツリーと抽象構文ツリーの違いを説明する最も簡単な例は何ですか?
私の理解では、パーサーは解析ツリーを作成し、その後それを破棄します。ただし、抽象構文ツリーをポップアウトすることもできます。これは、コンパイラが使用すると思われます。 私は、解析ツリーと抽象構文ツリーの両方が解析段階で作成されているという印象を受けています。次に、これらが異なる理由を誰かが説明できますか?
14 parsing  trees 

5
任意/汎用のカテゴリノードを使用して、可変で多様なjtreeを作成するにはどうすればよいですか?
注:ここでコーディングのヘルプは必要ありませんProgrammers。理由があります。Javaの(単なる)理解ではなく、プログラムの計画/作成スキルを向上させたい。 ここでこのLARPゲームのスキルに基づいて、任意のカテゴリシステムを持つツリーを作成する方法を見つけようとしています。私の以前の試みは、スキルがカテゴリーでもあったかどうかについては愚かでした。それをコーディングしようとするのは面倒でした。自分のツリーを描くと、自分の「葉」だけがスキルであることに気付き、他のカテゴリにはカテゴリとしてラベルを付けました。 私が望んでいるのは、モデルとビューを分離しようとするツリーを作成し、任意の親に任意のタイプの子ノードを(編集/レンダリングの別の方法で)追加できるようにする方法です。 NBここにあるものはすべて、財産のように思える場合でも、スキルとして購入されます。エンドユーザーは、これを購買スキル(紙のATMで行う)と見なすため、同じページにすべて表示する必要があります。 ツリーの説明:ツリーは、ハードコードされた最高レベルのカテゴリ(武器、物理的および精神的、医療など)のセットで「生まれ」ます。このことから、ユーザーはスキルを追加できる必要があります。最終的に、彼らは「片手剣専門化」スキル(アイテムではない)を追加したいと考えています。そのためにはWeapons、選択One-handedした状態で「追加」をクリックし、その子に表示されるコンボボックスノードから選択し、もう一度追加をクリックして、表示されるその子ノードのテキストフィールドに名前を入力します。次に、もう一度追加をクリックして、そのリーフの「レベル」または「ティア」を追加/指定します。最初に習熟し、次に専門化(例えば)。 もちろん、別のスキルを購入する場合は、リーフへの完全に異なるルートです。武器の例で行ったように、ツリーの同じレベルにコンボボックスは必要なく、その背後にある他のロジックも必要になる場合があります。これは、プログラミングは言うまでもなく、頭を悩ませている問題です。一連のクラスを作成し、それらをどの順序でアタッチするかを指定せずに、すべてを適合させる方法。 この種のツリーをコードで記述するのに適したシステムは何ですか?私が見た他のすべてのJTreeの例には、予測可能なパターンがありますが、私の場合はそうではありません。これをすべて「リテラル」でコーディングする必要はありません。どのタイプ(コンボボックス、テキストフィールドなど)の子ノードの長いリストをどの親で許可する必要があります。抽象クラスを使用する必要がありますか?インターフェース? 上にリストされていない、異なる動作をする他のスキルを追加するときに、この種のオブジェクトのクラスターを拡張可能にするにはどうすればよいですか 使用する適切なシステムがない場合、この種のことを行う方法を決定するための適切なプロセスはありますか? 私の頭の中の歯車が回っています: 私はいつもする必要があります: 親を確認する 親に基づいてオプションを提供する 私はこの共通性のskillために、スキルとカテゴリの一般的なメソッドを定義/概説する何らかの抽象/インターフェイスクラスが必要だと考え始めています。(できれば)ルールとオプションをデータベースに入れて、そこから読み込めます。問題は、抽象メソッドまたはインターフェイスメソッドと、それを実装する方法との間の問題です。


5
重複した四分木
四分木を実装しています。このデータ構造を知らない人のために、次の小さな説明を含めます。 クワッドツリーはデータ構造であり、3次元空間でのオクトリーと同じようにユークリッド平面にあります。クワッドツリーの一般的な用途は、空間インデックスです。 それらがどのように機能するかを要約すると、クワッドツリーは、最大容量と初期バウンディングボックスを持つコレクションです(ここでは長方形としましょう)。最大容量に達したクワッドツリーに要素を挿入しようとすると、クワッドツリーは4つのクワッドツリーに分割されます(その幾何学的表現は、挿入前のツリーの4分の1の面積になります)。各要素は、その位置に応じてサブツリーに再配布されます。長方形を操作するときの左上の境界。 したがって、クワッドツリーはリーフであり、その容量よりも要素が少ないか、4つのクワッドツリーを子として持つツリー(通常、北西、北東、南西、南東)です。 私の懸念は、重複を追加しようとした場合、同じ要素が数回または同じ位置にあるいくつかの異なる要素である場合、四分木はエッジの処理に根本的な問題があることです。 たとえば、容量が1の四分木と、境界ボックスとして単位長方形を使用する場合: [(0,0),(0,1),(1,1),(1,0)] そして、左上の境界が原点である長方形を2回挿入しようとします(または、N> 1の容量を持つ四分木にN + 1回挿入しようとした場合も同様です)。 quadtree->insert(0.0, 0.0, 0.1, 0.1) quadtree->insert(0.0, 0.0, 0.1, 0.1) 最初の挿入は問題になりません: ただし、最初の挿入でサブディビジョンがトリガーされます(容量が1であるため)。 したがって、両方の長方形は同じサブツリーに配置されます。 次に、2つの要素が同じ四分木に到着し、サブディビジョンをトリガーします… 以下同様に、サブディビジョンメソッドは無期限に実行されます。なぜなら、(0、0)は、作成された4つのうち常に同じサブツリーにあるため、無限再帰問題が発生するためです。 重複した四分木を持つことは可能ですか?(そうでない場合、それをとして実装できますSet) 四分木のアーキテクチャを完全に壊すことなく、この問題をどのように解決できますか?

4
ツリー内のすべてのノードのすべての子孫を生成する最も効率的な方法
ツリー(エッジのリスト、または親ノードから子ノードのリストへのマッピングのリストのいずれかとして格納)を取得するための最も効率的なアルゴリズムを探しています。すべてのノードについて、そのノードの子孫であるすべてのノードのリスト(リーフレベルと非リーフレベル)を生成します。 規模の関係上、実装は反省ではなくループを介して行う必要があります。理想的にはO(N)である必要があります。 このSOの質問は、ツリー内の1つのノードの答えを見つけるための標準的な合理的に明白なソリューションをカバーしています。しかし、明らかに、すべてのツリーノードでそのアルゴリズムを繰り返すことは非常に非効率的です(頭上からO(NlogN)からO(N ^ 2)へ)。 ツリーのルートは既知です。ツリーは完全に任意の形状です(例:N-naryではなく、いかなる形でもバランスが取れていない、形状または形式、均一な深さではない)-一部のノードには1〜2個の子があり、一部には30Kの子があります。 実用的なレベルでは(アルゴリズムには影響しないはずですが)、ツリーには100K〜200Kのノードがあります。

1
メニュー構築パターン
メニューがルーティングに使用されていない場合、メニューのアクティブ状態の処理に頭を悩ませています。 メニューシステムがルーティングも処理するDrupalから来ました。したがって、アクティブ状態とアクティブトレイル状態の設定は、ルートによって処理されます(これはメニューレンダリングシステムとしても機能します)。 現在、多くのPHPフレームワークには、ルーティングを処理するルータークラスがあります。メニューはPOSTを認識してはならないため、これは良い分離のようです|| オプション|| ... リクエスト。 しかし、フロントエンドを書いているとき、メニューをハードコーディングしていることに気づきました。または、すべてをDBに保存し、それらの値をビューに渡します。このアプローチが嫌いなのは、ルーターで既に書き込んだもののコピーを作成しているが、現在はMenuクラスを使用していることです。 例: Route::get('/somewhere','routename.somewhere','showStuffController'); Route::post('/somewhere','routename.somewhere','saveStuffController'); Menu::add('label.somewhere','routename.somewhere'); ここで懸念を分離しているので、それは素晴らしいことです。しかし、MenuはRouteに大きく依存して、アクティブ状態を設定します。メニューは、アクティブトレイルを設定するための階層についても知る必要があります。 つまり、アクティブなトレイルとアクティブなステータスクラスを設定することは、実際にはビューのことです。しかし、 if ( Route::currentName() === $menuitem->getRouteName() ) { print 'active'; } あなたの意見の至る所で愚かに思えます。次に、迷惑なアクティブトレイルをすべて追加します。ビューがレンダリングされる前にそれを処理し、active-trailフラグをtrueに設定することは、私が知っている方法では非常に醜いようです(すべての子をループするforeachループ、...) 私の質問は: このよりきれいな、より良い、...を得るパターンまたはスマートな方法はありますか?アクティブトレイルの「問題」をどのように処理する必要がありますか? 子->親のレンダリングを考えていました。したがって、最も深いレベルの広告から始めて、次の段階に進みます。しかし、子供はその親について知っていますが、親は自分の子供については何も知りません(変なようです)。

2
親への参照を持つノードを持つツリーはまだツリーですか?
ツリー内の各ノードの親を参照する場合、(定義により)まだツリーはありますか? ウィキペディアの定義は次のとおりです。 コンピュータサイエンスでは、ツリーは広く使用されている抽象データ型(ADT)またはこのADTを実装するデータ構造であり、リンクされたノードのセットとして表される子のルート値とサブツリーを持つ階層ツリー構造をシミュレートします。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.