これは、有向非巡回グラフでのトポロジカル ソートです。最初にグラフを作成する必要があります。頂点は文字であり、辞書順で一方が他方よりも小さい場合にエッジがあります。トポロジー順序が答えを与えてくれます。
矛盾は、有向グラフが非巡回でない場合です。一意性は、多項式時間でテスト可能なハミルトニアン パスが存在するかどうかによって決まります。
グラフの作成
これを行うには、辞書にある 2 つの連続する「単語」をそれぞれ比較します。次の 2 つの単語が次々に現れるとします。
x156@
x1$#2z
次に、この場合、最も長い一般的なプレフィックスを見つけ、x1
このプレフィックスの直後に続く文字を確認します。この場合、 と が5
あり$
ます。5
単語は辞書にこの順序で表示されるため、 は辞書式に より小さくなければならないと判断でき$
ます。
同様に、次の単語が与えられた場合(辞書に次々と表示されます)
jhdsgf
19846
19846adlk
'j' < '1'
最初のペア (最も長い一般的なプレフィックスは空の文字列) からわかります。2 番目のペアは、有用なことを何も教えてくれません (1 つは別のプレフィックスであるため、比較する文字がないため)。
ここで、後で次のように表示されるとします。
oi1019823
oij(*#@&$
次に、このペアが'1' < 'j'
.
トポロジカルソート
トポロジカル ソートを行う従来の方法は 2 つあります。アルゴリズム的に単純なのは深さ優先検索アプローチで、 fromx
からy
ifへのエッジがありy < x
ます。
アルゴリズムの擬似コードはウィキペディアで提供されています。
L ← Empty list that will contain the sorted nodes
S ← Set of all nodes with no incoming edges
function visit(node n)
if n has not been visited yet then
mark n as visited
for each node m with an edge from n to m do
visit(m)
add n to L
for each node n in S do
visit(n)
上記のアルゴリズムが完了すると、リストL
にはトポロジー順に頂点が含まれます。
一意性のチェック
以下はウィキペディアからの引用です。
トポロジカル ソートに、ソートされた順序で連続する頂点のすべてのペアがエッジで接続されるというプロパティがある場合、これらのエッジは DAG で有向ハミルトニアン パスを形成します。ハミルトニアン パスが存在する場合、トポロジの並べ替え順序は一意です。パスの端を尊重する他の順序はありません。逆に、トポロジカル ソートがハミルトン パスを形成しない場合、DAG は 2 つ以上の有効なトポロジカル順序を持ちます。この場合、エッジで接続されていない 2 つの連続する頂点を交換することにより、2 番目の有効な順序を形成することが常に可能です。お互いに。したがって、一意の順序付けが存在するかどうか、およびハミルトニアン パスが存在するかどうかを多項式時間でテストできます。
したがって、順序が一意であるかどうかを確認するには、L
(上記のアルゴリズムから) の 2 つの連続する頂点すべてが直接エッジで接続されているかどうかを確認するだけです。そうであれば、その順序は一意です。
複雑さの分析
グラフが作成されると、トポロジカル ソートは になりO(|V|+|E|)
ます。一意性チェックは ですO(|V| edgeTest)
。ここで、edgeTest
は 2 つの頂点がエッジで接続されているかどうかをテストする複雑さです。隣接行列では、これはO(1)
です。
グラフの作成には、ディクショナリの 1 回の線形スキャンのみが必要です。単語がある場合W
、それは ですO(W cmp)
。ここで、cmp
は 2 つの単語を比較する複雑さです。常に 2 つの後続の単語を比較するため、必要に応じてあらゆる種類の最適化を行うことができますが、それ以外の場合は単語の長さがO(L)
どこにあるかという単純な比較になります。L
アルファベットなどについて十分な情報があると判断したら、辞書の読み取りを短絡することもできますが、単純な構築ステップでさえO(WL)
、辞書のサイズである が必要です。