Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

При проектировании алгоритмов , раздел уточнение представляет собой метод , представляющие собой разбиение множества в качестве структуры данных , что позволяет разбиению быть уточнено путем разделения его наборов на большее число более мелких наборов. В этом смысле она двойственна структуре данных объединение-поиск , которая также поддерживает разделение на непересекающиеся множества, но в которой операции объединяют пары множеств.

Уточнение разбиения является ключевым компонентом нескольких эффективных алгоритмов на графах и конечных автоматах , включая минимизацию 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 iX. Если нет, он создает второй набор и добавляет S i в список L наборов, которые разделяются операцией. Затем, независимо от того, был ли сформирован новый набор, алгоритм удаляет x из S i и добавляет его в S iX. В представлении, в котором все элементы хранятся в одном массиве, перемещение 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]

См. Также [ править ]

Ссылки [ править ]

  1. ^ Пейдж, Роберт; Тарьян, Роберт Е. (1987), "Три алгоритмы раздела уточнения", SIAM журнал по вычислениям , 16 (6): 973-989, DOI : 10,1137 / 0216062 , МР  0917035.
  2. ^ Хабиб, Мишель; Пол, Кристоф; Viennot, Laurent (1999), "Методы Partition уточнения: интересная алгоритмическая Набор инструментов", Международный журнал Основы информатики , 10 (2): 147-170, DOI : 10,1142 / S0129054199000125 , MR 1759929 .
  3. ^ Хабиб, Мишель; Пол, Кристоф; Виеннот, Лоран (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.
  4. ^ Валмари, Антти; Лехтинен, Петри (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
  5. ^ Knuutila, Тимо (2001), "Re-описания алгоритма по Hopcroft", Теоретическая информатика , 250 (1-2): 333-363, DOI : 10.1016 / S0304-3975 (99) 00150-4 , ISSN 0304- 3975 
  6. ^ Хопкрофт, Джон (1971), " Алгоритм n log n для минимизации состояний в конечном автомате", Теория машин и вычислений (Proc. Internat. Sympos., Технион, Хайфа, 1971) , Нью-Йорк: Academic Press, стр. 189–196, MR 0403320 .
  7. ^ Sethi, Рави (1976), "Планирование графиков на двух процессорах", SIAM журнал по вычислениям , 5 (1): 73-82, DOI : 10,1137 / 0205005 , MR 0398156 .
  8. ^ Роуз, диджей; Tarjan, RE ; Lueker, GS (1976), "Алгоритмические аспекты устранения вершины на графах", SIAM журнал по вычислениям , 5 (2): 266-283, DOI : 10,1137 / 0205021.
  9. ^ Корнейл, Дерек Г. (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.