При проектировании алгоритмов , раздел уточнение представляет собой метод , представляющие собой разбиение множества в качестве структуры данных , что позволяет разбиению быть уточнено путем разделения его наборов на большее число более мелких наборов. В этом смысле она двойственна структуре данных объединение-поиск , которая также поддерживает разделение на непересекающиеся множества, но в которой операции объединяют пары множеств.
Уточнение разбиения является ключевым компонентом нескольких эффективных алгоритмов на графах и конечных автоматах , включая минимизацию DFA , алгоритм Коффмана – Грэма для параллельного планирования и лексикографический поиск графов в ширину . [1] [2] [3]
Структура данных [ править ]
Алгоритм уточнения разбиения поддерживает семейство непересекающихся множеств S i . В начале алгоритма это семейство содержит единый набор всех элементов в структуре данных. На каждом шаге алгоритма, набор Х представлен алгоритм, и каждый набор S I в семье , которая содержит членов X разбивается на два множества, то пересечение S я ∩ X и разность S I \ Х .
Такой алгоритм может быть эффективно реализован за счет поддержки структур данных, представляющих следующую информацию: [4] [5]
- Упорядоченная последовательность наборов S i в семействе в такой форме, как двусвязный список, который позволяет вставлять новые наборы в середину последовательности.
- Связанный с каждым набором S i , набор его элементов S i , в такой форме, как двусвязный список или структура данных массива, которая позволяет быстро удалять отдельные элементы из коллекции. В качестве альтернативы, этот компонент структуры данных может быть представлен путем хранения всех элементов всех наборов в одном массиве, отсортированных по идентификатору набора, к которому они принадлежат, и путем представления коллекции элементов в любом наборе S i по его начальной и конечной позициям в этом массиве.
- Связанный с каждым элементом, набор, которому он принадлежит.
Для того, чтобы выполнить операцию уточнения, алгоритм перебирает элементы данного множества X . Для каждого такого элемента x он находит набор S i, который содержит x , и проверяет, был ли уже запущен второй набор для S i ∩ X. Если нет, он создает второй набор и добавляет S i в список L наборов, которые разделяются операцией. Затем, независимо от того, был ли сформирован новый набор, алгоритм удаляет x из S i и добавляет его в S i ∩ X. В представлении, в котором все элементы хранятся в одном массиве, перемещение x из одного набора в другой может быть выполнено путем замены x последним элементом S i, а затем уменьшения конечного индекса S i и начального индекса нового набор. Наконец, после того, как все элементы X были обработаны таким образом, алгоритм проходит через L , отделяя каждый текущий набор S i от второго набора, который был отделен от него, и сообщает, что оба этих набора были вновь сформированы в результате уточнения. операция.
Время для выполнения одной операции уточнения таким образом составляет O (| X |) , независимо от количества элементов в семействе наборов, а также независимо от общего количества наборов в структуре данных. Таким образом, время для последовательности уточнений пропорционально общему размеру наборов, заданных алгоритму на каждом этапе уточнения.
Приложения [ править ]
Раннее применение уточнения разбиения было в алгоритме Хопкрофта (1971) для минимизации DFA . В этой задаче на входе задается детерминированный конечный автомат , и он должен найти эквивалентный автомат с как можно меньшим количеством состояний. Алгоритм Хопкрофта поддерживает разделение состояний входного автомата на подмножества с тем свойством, что любые два состояния в разных подмножествах должны отображаться в разные состояния выходного автомата. Изначально существует два подмножества, одно из которых содержит все принимающие состояния автомата, а другое - остальные. На каждом шаге одно из подмножеств S i и один из входных символов xавтомата выбираются, и подмножества состояний уточняются до состояний, для которых переход, помеченный x , приведет к S i , и состояний, для которых x -переход приведет в другое место. Когда набор S i , который уже был выбран, разделяется уточнением, только один из двух результирующих наборов (меньший из двух) нужно выбрать снова; таким образом, каждое состояние участвует в наборах X на протяжении O ( s log n ) шагов уточнения, а общий алгоритм занимает время O ( ns log n ) , где n- количество начальных состояний, а s - размер алфавита. [6]
Уточнение разделения было применено Сетхи (1976) в эффективной реализации алгоритма Коффмана – Грэма для параллельного планирования. Сетхи показал, что его можно использовать для построения лексикографически упорядоченного топологического типа заданного ориентированного ациклического графа за линейное время; такое лексикографическое топологическое упорядочение является одним из ключевых шагов алгоритма Коффмана – Грэма. В этом приложении элементы непересекающихся множеств являются вершинами входного графа, а множества Xдля уточнения разбиения используются множества соседей вершин. Поскольку общее количество соседей всех вершин - это просто количество ребер в графе, алгоритм требует времени, линейного по количеству ребер, его входному размеру. [7]
Уточнение разбиения также является ключевым этапом в лексикографическом поиске в ширину , алгоритме поиска по графу с приложениями для распознавания хордовых графов и некоторых других важных классов графов. Опять же, непересекающиеся элементы множества являются вершинами, а множество X представляет собой наборы соседей , поэтому алгоритм занимает линейное время. [8] [9]
См. Также [ править ]
Ссылки [ править ]
- ^ Пейдж, Роберт; Тарьян, Роберт Е. (1987), "Три алгоритмы раздела уточнения", SIAM журнал по вычислениям , 16 (6): 973-989, DOI : 10,1137 / 0216062 , МР 0917035.
- ^ Хабиб, Мишель; Пол, Кристоф; Viennot, Laurent (1999), "Методы Partition уточнения: интересная алгоритмическая Набор инструментов", Международный журнал Основы информатики , 10 (2): 147-170, DOI : 10,1142 / S0129054199000125 , MR 1759929 .
- ^ Хабиб, Мишель; Пол, Кристоф; Виеннот, Лоран (1998), «Синтез по уточнению разбиения: полезная процедура для строк, графов, булевых матриц и автоматов», в Морван, Мишель; Майнель, Кристоф; Krob, Daniel (eds.), STACS 98: 15-й ежегодный симпозиум по теоретическим аспектам компьютерных наук Париж, Франция, 25–27 февраля 1998 г., Proceedings , Lecture Notes in Computer Science , 1373 , Springer-Verlag, pp. 25–38 , DOI : 10.1007 / BFb0028546 , ISBN 978-3-540-64230-5, Руководство по ремонту 1650757.
- ^ Валмари, Антти; Лехтинен, Петри (2008), Альберс, Сюзанна ; Вейль, Паскаль (ред.), Эффективная минимизация DFA с частичными функциями перехода , Leibniz International Proceedings in Informatics (LIPIcs), 1 , Дагштуль, Германия: Schloss Dagstuhl: Leibniz-Zentrum fuer Informatik, стр. 645–656, doi : 10.4230 /LIPIcs.STACS.2008.1328 , ISBN 978-3-939897-06-4, MR 2873773
- ^ Knuutila, Тимо (2001), "Re-описания алгоритма по Hopcroft", Теоретическая информатика , 250 (1-2): 333-363, DOI : 10.1016 / S0304-3975 (99) 00150-4 , ISSN 0304- 3975
- ^ Хопкрофт, Джон (1971), " Алгоритм n log n для минимизации состояний в конечном автомате", Теория машин и вычислений (Proc. Internat. Sympos., Технион, Хайфа, 1971) , Нью-Йорк: Academic Press, стр. 189–196, MR 0403320 .
- ^ Sethi, Рави (1976), "Планирование графиков на двух процессорах", SIAM журнал по вычислениям , 5 (1): 73-82, DOI : 10,1137 / 0205005 , MR 0398156 .
- ^ Роуз, диджей; Tarjan, RE ; Lueker, GS (1976), "Алгоритмические аспекты устранения вершины на графах", SIAM журнал по вычислениям , 5 (2): 266-283, DOI : 10,1137 / 0205021.
- ^ Корнейл, Дерек Г. (2004), «Лексикографический поиск в широту - обзор», в Хромковиче, Юрай; Нагл, Манфред; Вестфехтель, Бернхард (ред.), Теоретико- графические методы в компьютерных науках: 30-й международный семинар, WG 2004, Бад-Хоннеф, Германия, 21-23 июня 2004 г., Revised Papers , Lecture Notes in Computer Science , 3353 , Springer-Verlag, стр. 1–19, DOI : 10.1007 / 978-3-540-30559-0_1.