細分化操作を実行するために、アルゴリズムは与えられた集合Xの要素をループ処理します。各要素xについて、 xを含む集合S iを見つけ、 S i ∩ Xの 2 番目の集合が既に開始されているかどうかを確認します。開始されていない場合は、2 番目の集合を作成し、S iを操作によって分割された集合のリストLに追加します。次に、新しい集合が形成されたかどうかに関わらず、アルゴリズムはx をS iから削除し、 S i ∩ Xに追加します。すべての要素が単一の配列に格納されている表現では、xをある集合から別の集合に移動するには、 xをS iの最後の要素と交換し、 S iの終了インデックスと新しい集合の開始インデックスをデクリメントします。最後に、このようにしてXのすべての要素が処理された後、アルゴリズムはLをループ処理し、現在の各集合S iを、そこから分割された 2 番目の集合から分離し、これらの両方の集合が細分化操作によって新たに形成されたことを報告します。
このように単一の改良操作を実行するのにかかる時間はO ( | X | )であり、集合族の要素数にも、データ構造内の集合の総数にも依存しません。したがって、一連の改良にかかる時間は、各改良ステップでアルゴリズムに渡される集合の総サイズに比例します。
アプリケーション
分割細分化の初期の応用例は、DFA 最小化のためのHopcroft (1971)のアルゴリズムである。この問題では、入力として決定性有限オートマトンが与えられ、可能な限り少ない状態を持つ同等のオートマトンを見つける必要がある。Hopcroft のアルゴリズムは、入力オートマトンの状態を部分集合に分割し、異なる部分集合内の任意の 2 つの状態が出力オートマトン内の異なる状態にマッピングされるという性質を維持する。最初は、オートマトンのすべての受理状態を含む部分集合と、残りの状態を含む部分集合の 2 つがある。各ステップで、部分集合S iの 1 つとオートマトンの入力記号xの 1 つが選択され、状態の部分集合は、ラベルxの遷移がS iにつながる状態と、x遷移が他の場所につながる状態に細分化される。既に選択された集合S i が精緻化によって分割される場合、結果として生じる 2 つの集合のうち (小さい方の集合) の 1 つだけを再度選択する必要があります。このようにして、各状態はO ( s log n )回の精緻化ステップで集合Xに参加し、アルゴリズム全体の処理時間はO ( ns log n )となります。ここで、nは初期状態の数、sはアルファベットのサイズです。[ 6 ]
↑ Habib, Michel; Paul, Christophe; Viennot, Laurent (1998), "A synthesis on partition refinement: a useful routine for strings, graphs, Boolean matrices and automata", in Morvan, Michel; Meinel, Christoph; Krob, Daniel (eds.), STACS 98: 15th Annual Symposium on Theoretical Aspects of Computer Science Paris, France, February 25–27, 1998, Proceedings (PDF) , Lecture Notes in Computer Science , vol. 1373, Springer-Verlag, pp. 25–38 , doi : 10.1007/BFb0028546 , ISBN978-3-540-64230-5MR 1650757。
↑ Valmari, Antti; Lehtinen, Petri (2008), "部分遷移関数を持つ DFA の効率的な最小化", Albers, Susanne ; Weil, Pascal (eds.), 25th International Symposium on Theoretical Aspects of Computer Science (STACS 2008) , Leibniz International Proceedings in Informatics (LIPIcs), vol. 1, Dagstuhl, Germany: Schloss Dagstuhl: Leibniz-Zentrum fuer Informatik, pp. 645– 656, arXiv : 0802.2826 , doi : 10.4230/LIPIcs.STACS.2008.1328 , ISBN978-3-939897-06-4MR 2873773