トライにより、要素のリストを効率的に保存できます。接頭辞は共有されるため、スペース効率が高くなります。
木を効率的に保管するための同様の方法を探しています。特定のツリーがいくつかの格納されたツリーのサブツリーであるかどうか、または特定のツリーのサブツリーである格納されたツリーが存在するかどうかを知って、メンバーシップをチェックして要素を追加できるようにしたいと思います。
私は通常、高さが50未満の約500の不平衡バイナリツリーを格納します。
編集
私のアプリケーションは、ある種のメモを使用したある種のモデルチェッカーです。私が持っている状態を想像と以下の式:F = φとG = (φ ∨ ψ )とφは、複雑な部分式であることを、私が最初かどうかを知りたいと想像fが成り立つ秒。私はϕが成立するかどうかを確認し、長いプロセスの後、それが事実であることを確認します。ここで、gがsに成立するかどうかを知りたい。私は事実を覚えたいfが保持していることに注意してくださいにグラム⇒ F私は導き出すことができ中のほぼ瞬時に。
逆に、gがtに保持されないことを証明した場合、fはtにほぼ瞬時に保持されないことを伝えたいと思います。
私たちは式に部分的秩序を構築し、持つことができます IFF グラム⇒ F。状態sごとに、2組の式を保存します。L (s )は保持する最大の数式を格納し、l (s )は保持しない最小の数式を格納します。今状態所与Sおよび式Gの場合、私が見ることができる∃ F ∈ L (S )、F ⇒ G、又は場合∃ F ∈ L (S )私が行っていると私はかどうかを直接知っている場合には gが成り立つ秒。
現在、とlはリストとして実装されており、保存されているすべての数式を個別に反復処理する必要があるため、これは明らかに最適ではありません。私の数式がシーケンスであり、部分的な順序が「の接頭辞」である場合、トライははるかに速く証明できます。残念ながら、私の式は、に基づいて構造のような木の持つ¬ 、∧、モーダルオペレータ、および原子命題を。
@Raphaelと@Jackが指摘しているように、ツリーを順次化することはできますが、関心のある半順序が「is a prefix of」に対応しないため、問題が解決しないのではないかと心配しています。