問題タブ [modified-preorder-tree-t]

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.

0 投票する
2 に答える
5579 参照

database - 複合パターン (階層データ) をデータベースに格納する

複合パターンをリレーショナル データベースに保存するための「ベスト プラクティス」とは何ですか?

Modified Preorder Tree Traversal を使用しています。これにより、ツリー全体を構築するのは非常に高速ですが、新しいノードを挿入または削除するには非常に時間がかかります (すべての左右の値を調整する必要があります)。また、ノードの子のクエリは簡単ではなく、非常に時間がかかります。

私たちが気付いたもう 1 つのことは、ツリーが乱雑にならないようにする必要があるということです。トランザクション ロックが必要です。そうしないと、左と右の値が破損する可能性があり、破損した左右のツリーを修正するのは簡単なことではありません。

ただし、Modified Preorder Tree Traversal は非常にうまく機能しますが、より良い代替手段があるかどうか疑問に思っていました。

0 投票する
1 に答える
407 参照

php - 列 PHP MySQL (Modified Preorder Tree Trasversal) にデータを表示する際の支援

こんにちは、以下のコードで複数列の表示を取得しようとしています (そう呼び出すことができる場合)。結果は次のとおりです代替テキスト 。これらの葉が壊れている理由を誰かが理解できますか?または、どちらが優れているか教えてください: サブカテゴリにリンクされたカテゴリ テーブル、または隣接モデル リスト。

連載版リンクテキスト

0 投票する
3 に答える
8252 参照

php - PHPのトラバーサルツリーのデータ構造?

CSやデータ構造のバックグラウンドがありません。データベースとの操作と同期のために、変更されたプレオーダートランスバーサルツリーを格納するPHPクラスを作成したいと思います。

基本的に、次のようなデータを保存する必要があります。

配列を使うことを考えていましたが、面倒そうです。これが次のような配列の配列である場合、array( 'name'=> "PORTABLE ELECTRONICS", 'lft' => 10, 'rgt' = 19 )すべての数値が存在することを確認するためにその配列を繰り返しループするのは面倒になります。

PHPにはいくつかの新しいデータ構造が用意されているので、これらのいずれかが配列を使用するよりもメリットがあるのではないかと思います。

  • SplDoubly
  • LinkedList
  • SplStack
  • SplQueue
  • SplHeap
  • SplMaxHeap
  • SplMinHeap
  • SplPriorityQueue
  • SplFixedArray
  • SplObjectStorage

編集:このクラスは、データベーステーブルに格納されているツリーへのゲートウェイにはなりません。(もしそうなら、私はクラスのクエリを持っているでしょう。)それはある種のPHPデータ構造のスタンドアロンmmptです。

0 投票する
2 に答える
1629 参照

php - ツリー トラバーサル アルゴリズムに基づいて、この結果セットからツリー ビューを生成する方法は?

私はこのテーブルを持っています:

この質問に基づいて: 変更された事前注文ツリー トラバーサル モデル (ネストされたセット) を <ul> に取得する

違いは、1 つのテーブルに多くのツリーがあることです。各行には、その親とその最上位の親を表す外部キー (category_id と root_id) があります。また、この例に基づいて lft フィールドと rht フィールドがあります: http://articles.sitepoint.com/article/hierarchical-data-database/2

この行に基づいて:

このツリーを表す順序付きリストを作成するにはどうすればよいですか?

次のSQLを使用します。

私はこの結果を得ました:

代替テキスト

ご覧のとおり、正しいツリーを生成できるように、root_id で並べ替える必要もあります。

また、ツリーを取得した後、各ノードを名前で並べ替える方法はありますか?

0 投票する
2 に答える
3027 参照

php - 親をローテーションせずにPHPでバイナリツリーのバランスをとる方法は?

私はできるだけ自分自身を明確にするように努めます。隣接リストモデルに基づく:http ://articles.sitepoint.com/article/hierarchical-data-database

この木のバランスをとる方法が必要です

次のようなものに:

サンプルコードに基づく:

次のようなフラットなhtmlテーブルを出力できるようにコードを変更しました。

$ super_parent = '0000'はノードエントリをフラットリストに残しました:

しかし、親を移動したり回転させたりせずに、これらすべてをバランスの取れたツリーに再編成する方法が必要です。データベースに複製テーブルを作成し、2番目のクエリを実行して別のBinarayツリーを表示または作成することは考えられますが、次のようなフラットツリーを再編成できる可能性があると思いました。

左から右へ。0は、親またはsuper_parent0000を表します。

これを実行したい理由は、プロジェクトの別のアルゴリズムの基礎となる元のツリーから仮想ツリーを作成できるようにするためです。

前もって感謝します。

ボブ

0 投票する
1 に答える
319 参照

sql - 左右ツリーのノードのインデックスをどのように取得しますか?

データベースに左右のツリーがありますが、これはパフォーマンスの問題です。parentIdとorderIdを持つシステムに切り替えます。

左右ツリーのノードのインデックスを取得できるSQLスクリプトを探しています。

0 投票する
1 に答える
456 参照

sql - ツリー トラバーサル (ネストされたセット) 用に作成されたこの CROSS JOIN SQL を変更するにはどうすればよいですか?

以下のクエリにはmain、カテゴリを区別するために使用される というフィールドがあります。したがって、一般的なカテゴリとメインのカテゴリがあり、両方ともツリーで見つけることができます。mainフィールドは単なる型で、ツリー構造には何もありません。つまり、ステータス フィールドのようなものです。

where親カテゴリがメインカテゴリである必要があることを指定する節があります。selectまた、親カテゴリが共通カテゴリである場所を実行する必要がある場合もありますp.main =0

depth、ツリー内の要素の位置です。したがって、あるカテゴリが別のレベルの子である場合、深さは になり1、2 つのレベルの場合、深さは になります2

私の問題は、上記の選択を行うときに、親がメイン カテゴリであるツリーに共通カテゴリとしてマークされた子がいる場合 ( を選択p.main =1)、共通カテゴリdepthは常に であるということ0です。

つまり、選択は適切に機能します。最上位の親が としてマークされているすべてのカテゴリを選択するとmain、 でマークされた子カテゴリを含むすべてのカテゴリを含むツリーが表示されmain=0ます。しかし、この場合、深さは常に0

結果を見る:

代替テキスト

カテゴリ1423は の子で27あり、メイン カテゴリではありませんが27、深さは ですが0、 である必要があります1。カテゴリ276は の子で64あり、両方がメイン カテゴリであるため、適切な深さがあります。

depthフィールドが期待どおりに機能するように、このクエリを変更するにはどうすればよいですか?

ここを参照してください:ツリー トラバーサル アルゴリズムに基づいて、この結果セットからツリー ビューを生成する方法は?

0 投票する
4 に答える
260 参照

php - 数値範囲の最適化

最適化したい数値範囲が設定されています。

初期値の簡単な例を次に示します。

最適化後の出力として期待するもの:

これらは、MySQL データベースに保存されている Modified Preorder Tree Traversal (Nested Set) データからのleftとの値です。right非アクティブなブランチを結果から除外するためにそれらを使用していますが、現在は範囲をまったく最適化していません。使用前に範囲を最適化することで、パフォーマンスが向上する可能性があると考えました。


より詳しい情報

NOT BETWEEN値は、句を使用してツリー内の非アクティブなブランチを除外するためのクエリに渡されます。最小限の範囲セットを使用することで、そのクエリのパフォーマンスを最適化できると考えました。

0 投票する
1 に答える
2735 参照

sql - 変更された事前注文ツリーのトラバーサル: 1 レベルの深さのノードを選択する

修正されたプレオーダー ツリー トラバーサル アルゴリズムを使用して保存された、階層的な順序付けされたデータがあります。

テーブルの内容は次のとおりです。

可視化:

図式

私が望むのは、特定のノードの子ノードのみを選択することです(子ノードの子ノードではありません)。「トップノード」としましょう。クエリを修正しようとしていますが、理解できないようです。

たとえば、インターネットを検索すると、しばらく時間がかかります。各ノードの深さを計算することはできますが、それを選択することはできないようです。

このクエリ

各ノードの深さを示します。

それはいいのですが、列の深さを条件として使用することはできません。