<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lizord</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lizord"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Lizord"/>
	<updated>2026-10-22T15:38:26Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30102</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30102"/>
		<updated>2025-11-29T10:30:20Z</updated>

		<summary type="html">&lt;p&gt;Lizord: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;compl&amp;quot;&amp;gt;Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&amp;lt;/ref&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;compl&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательной версией алгоритма Джонса-Плассмана является обычная жадная раскраска графа. Описание её алгоритма можно получить, убрав параллельные секции из описания алгоритма Джонса-Плассмана (т.е исполняя их последовательно).&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины v алгоритм проделывает следующие шаги:&lt;br /&gt;
# Просматривает её соседей.&lt;br /&gt;
# Собирает цвета уже окрашенных соседей.&lt;br /&gt;
# Выбирает минимальный свободный цвет.&lt;br /&gt;
# Присваивает его v.&lt;br /&gt;
&lt;br /&gt;
Инициализация начальных структур (расстановка приоритетов и цветов) требует один проход на &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt; итераций, что даёт сложность &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt;. &lt;br /&gt;
Для выбора доступного цвета необходимо просмотреть всех соседей вершины, что требует в сумме для всех вершин &amp;lt;math&amp;gt;\sum\limits_{v \in V} {deg(v)} = 2|E|&amp;lt;/math&amp;gt; итераций, что даёт вклад &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выбор минимального свободного цвета требует, в простейшем случае, также &amp;lt;math&amp;gt;\sum\limits_{v \in V} {O(deg(v))} = O(|E|)&amp;lt;/math&amp;gt; итераций, однако при эффективной реализации это можно делать за O(1) (например, при хранении доступных цветов в битовой карте).&lt;br /&gt;
&lt;br /&gt;
Итого получаем суммарную сложность &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Далее представлен информационный граф  &#039;&#039;&#039;одной итерации&#039;&#039;&#039; алгоритма. После её завершения, вершины, которые не были раскрашены прогоняются ещё раз - алгоритм работает, пока все вершины не будут раскрашены.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный граф итерации алгоритма Джонса Плассмана.png|center|thumb|500px|Рисунок 1. Информационный граф одной итерации алгоритма Джонса-Плассмана]]&lt;br /&gt;
&lt;br /&gt;
Обозначения:&lt;br /&gt;
Синие круги - набор нераскрашенных вершин, белые блоки вокруг них означают наборы соседей (в общем случае они могут пересекаться, но это не влияет на ход работы). Зеленые круги - операции выбора вершины с наибольшим приоритетом, желтые круги - операции выбора цвета, оранжевые круги - операции, непосредственно, раскраски&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Как видно из информационного графа, параллелизм достигается за счёт выделения из множества вершин независимых подмножеств, между которыми нет ребёр. Очевидно, что вершинам из таких подмножеств можно назначить цвет независимо, т.е параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления доступного вершине цвета имеет смысл использовать битмап, где каждый установленный бит означает доступный цвет. На большинстве вычислительных архитектур получить первый установленный бит в числе можно одной аппаратной инструкцией.&lt;br /&gt;
&lt;br /&gt;
Эту же оптимизацию можно перенести и на ядра для параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартные способы хранения графов обычно обладают плохой локальностью, которую можно улучшить, если изначально сортировать вершины, размещая их рядом с соседними.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
[[Файл:Результаты прогона алгоритма Джонса-Плассмана.png|center|800px|Рисунок 2. Результаты прогона алгоритма Джонса-Плассмана]]&lt;br /&gt;
&lt;br /&gt;
Из результатов прогонов видно, что несмотря на ожидаемый рост потенциальной производительности (скорости вычислений без учёта затрат на коммуникацию) с увеличением количества процессов, реальная производительность показывает прямо противоположную картину, с незначительным ростом производительности лишь на большом количестве процессов.&lt;br /&gt;
&lt;br /&gt;
Тесты проводились на синтетических графах с 8 миллионами вершинами и количеством ребёр равным 40, 60, 80, 100, 120, 140 и 160 миллионам.&lt;br /&gt;
&lt;br /&gt;
Производительность в данном случае измеряется в GTEPS - миллиардах обработанных ребёр в секунду. Это классическая метрика производительности для задач на графах.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Несмотря на хорошую масштабируемость в рамках одного устройства (без необходимости обмениваться данными с другими процессами), алгоритм обладает слабой масштабируемостью на кластере ввиду роста расходов на коммуникацию между независимыми потоками (после каждой итерации каждый из потоков должен синхронизировать своё состояние с остальными). Для раскраски графов на распределенных системах следует использовать специализированные алгоритмы, основанные на разбиении графа &amp;lt;ref&amp;gt;Ian Bogle and George M. Slota, Parallel Graph Coloring Algorithms for Distributed GPU Environments&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30101</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30101"/>
		<updated>2025-11-29T10:23:19Z</updated>

		<summary type="html">&lt;p&gt;Lizord: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;compl&amp;quot;&amp;gt;Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&amp;lt;/ref&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;compl&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательной версией алгоритма Джонса-Плассмана является обычная жадная раскраска графа. Описание её алгоритма можно получить, убрав параллельные секции из описания алгоритма Джонса-Плассмана (т.е исполняя их последовательно).&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины v алгоритм проделывает следующие шаги:&lt;br /&gt;
# Просматривает её соседей.&lt;br /&gt;
# Собирает цвета уже окрашенных соседей.&lt;br /&gt;
# Выбирает минимальный свободный цвет.&lt;br /&gt;
# Присваивает его v.&lt;br /&gt;
&lt;br /&gt;
Инициализация начальных структур (расстановка приоритетов и цветов) требует один проход на &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt; итераций, что даёт сложность &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt;. &lt;br /&gt;
Для выбора доступного цвета необходимо просмотреть всех соседей вершины, что требует в сумме для всех вершин &amp;lt;math&amp;gt;\sum\limits_{v \in V} {deg(v)} = 2|E|&amp;lt;/math&amp;gt; итераций, что даёт вклад &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выбор минимального свободного цвета требует, в простейшем случае, также &amp;lt;math&amp;gt;\sum\limits_{v \in V} {O(deg(v))} = O(|E|)&amp;lt;/math&amp;gt; итераций, однако при эффективной реализации это можно делать за O(1) (например, при хранении доступных цветов в битовой карте).&lt;br /&gt;
&lt;br /&gt;
Итого получаем суммарную сложность &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Далее представлен информационный граф  &#039;&#039;&#039;одной итерации&#039;&#039;&#039; алгоритма. После её завершения, вершины, которые не были раскрашены прогоняются ещё раз - алгоритм работает, пока все вершины не будут раскрашены.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный граф итерации алгоритма Джонса Плассмана.png|center|thumb|500px|Рисунок 1. Информационный граф одной итерации алгоритма Джонса-Плассмана]]&lt;br /&gt;
&lt;br /&gt;
Обозначения:&lt;br /&gt;
Синие круги - набор нераскрашенных вершин, белые блоки вокруг них означают наборы соседей (в общем случае они могут пересекаться, но это не влияет на ход работы). Зеленые круги - операции выбора вершины с наибольшим приоритетом, желтые круги - операции выбора цвета, оранжевые круги - операции, непосредственно, раскраски&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Как видно из информационного графа, параллелизм достигается за счёт выделения из множества вершин независимых подмножеств, между которыми нет ребёр. Очевидно, что вершинам из таких подмножеств можно назначить цвет независимо, т.е параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления доступного вершине цвета имеет смысл использовать битмап, где каждый установленный бит означает доступный цвет. На большинстве вычислительных архитектур получить первый установленный бит в числе можно одной аппаратной инструкцией.&lt;br /&gt;
&lt;br /&gt;
Эту же оптимизацию можно перенести и на ядра для параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартные способы хранения графов обычно обладают плохой локальностью, которую можно улучшить, если изначально сортировать вершины, размещая их рядом с соседними.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
[[Файл:Результаты прогона алгоритма Джонса-Плассмана.png|center|800px|Рисунок 2. Результаты прогона алгоритма Джонса-Плассмана]]&lt;br /&gt;
&lt;br /&gt;
Из результатов прогонов видно, что несмотря на ожидаемый рост потенциальной производительности (скорости вычислений без учёта затрат на коммуникацию) с увеличением количества процессов, реальная производительность показывает прямо противоположную картину, с незначительным ростом производительности лишь на большом количестве процессов.&lt;br /&gt;
&lt;br /&gt;
Тесты проводились на синтетических графах с 8 миллионами вершинами и количеством ребёр равным 40, 60, 80, 100, 120, 140 и 160 миллионам.&lt;br /&gt;
&lt;br /&gt;
Производительность в данном случае измеряется в GTEPS - миллиардах обработанных ребёр в секунду. Это классическая метрика производительности для задач на графах.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Несмотря на хорошую масштабируемость в рамках одного устройства (без необходимости обмениваться данными с другими процессами), алгоритм обладает слабой масштабируемостью на кластере ввиду роста расходов на коммуникацию между независимыми потоками (после каждой итерации каждый из потоков должен синхронизировать своё состояние с остальными). Для раскраски графов на распределенных системах следует использовать специализированные алгоритмы, основанные на разбиении графа &amp;lt;ref&amp;gt;Ian Bogle and George M. Slota, Parallel Graph Coloring Algorithms for Distributed GPU Environments&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30100</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30100"/>
		<updated>2025-11-29T10:21:53Z</updated>

		<summary type="html">&lt;p&gt;Lizord: /* Результаты прогонов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;compl&amp;quot;&amp;gt;Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&amp;lt;/ref&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;compl&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательной версией алгоритма Джонса-Плассмана является обычная жадная раскраска графа.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины v алгоритм проделывает следующие шаги:&lt;br /&gt;
# Просматривает её соседей.&lt;br /&gt;
# Собирает цвета уже окрашенных соседей.&lt;br /&gt;
# Выбирает минимальный свободный цвет.&lt;br /&gt;
# Присваивает его v.&lt;br /&gt;
&lt;br /&gt;
Инициализация начальных структур (расстановка приоритетов и цветов) требует один проход на &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt; итераций, что даёт сложность &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt;. &lt;br /&gt;
Для выбора доступного цвета необходимо просмотреть всех соседей вершины, что требует в сумме для всех вершин &amp;lt;math&amp;gt;\sum\limits_{v \in V} {deg(v)} = 2|E|&amp;lt;/math&amp;gt; итераций, что даёт вклад &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выбор минимального свободного цвета требует, в простейшем случае, также &amp;lt;math&amp;gt;\sum\limits_{v \in V} {O(deg(v))} = O(|E|)&amp;lt;/math&amp;gt; итераций, однако при эффективной реализации это можно делать за O(1) (например, при хранении доступных цветов в битовой карте).&lt;br /&gt;
&lt;br /&gt;
Итого получаем суммарную сложность &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Далее представлен информационный граф  &#039;&#039;&#039;одной итерации&#039;&#039;&#039; алгоритма. После её завершения, вершины, которые не были раскрашены прогоняются ещё раз - алгоритм работает, пока все вершины не будут раскрашены.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный граф итерации алгоритма Джонса Плассмана.png|center|thumb|500px|Рисунок 1. Информационный граф одной итерации алгоритма Джонса-Плассмана]]&lt;br /&gt;
&lt;br /&gt;
Обозначения:&lt;br /&gt;
Синие круги - набор нераскрашенных вершин, белые блоки вокруг них означают наборы соседей (в общем случае они могут пересекаться, но это не влияет на ход работы). Зеленые круги - операции выбора вершины с наибольшим приоритетом, желтые круги - операции выбора цвета, оранжевые круги - операции, непосредственно, раскраски&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Как видно из информационного графа, параллелизм достигается за счёт выделения из множества вершин независимых подмножеств, между которыми нет ребёр. Очевидно, что вершинам из таких подмножеств можно назначить цвет независимо, т.е параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления доступного вершине цвета имеет смысл использовать битмап, где каждый установленный бит означает доступный цвет. На большинстве вычислительных архитектур получить первый установленный бит в числе можно одной аппаратной инструкцией.&lt;br /&gt;
&lt;br /&gt;
Эту же оптимизацию можно перенести и на ядра для параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартные способы хранения графов обычно обладают плохой локальностью, которую можно улучшить, если изначально сортировать вершины, размещая их рядом с соседними.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
[[Файл:Результаты прогона алгоритма Джонса-Плассмана.png|center|800px|Рисунок 2. Результаты прогона алгоритма Джонса-Плассмана]]&lt;br /&gt;
&lt;br /&gt;
Из результатов прогонов видно, что несмотря на ожидаемый рост потенциальной производительности (скорости вычислений без учёта затрат на коммуникацию) с увеличением количества процессов, реальная производительность показывает прямо противоположную картину, с незначительным ростом производительности лишь на большом количестве процессов.&lt;br /&gt;
&lt;br /&gt;
Тесты проводились на синтетических графах с 8 миллионами вершинами и количеством ребёр равным 40, 60, 80, 100, 120, 140 и 160 миллионам.&lt;br /&gt;
&lt;br /&gt;
Производительность в данном случае измеряется в GTEPS - миллиардах обработанных ребёр в секунду. Это классическая метрика производительности для задач на графах.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Несмотря на хорошую масштабируемость в рамках одного устройства (без необходимости обмениваться данными с другими процессами), алгоритм обладает слабой масштабируемостью на кластере ввиду роста расходов на коммуникацию между независимыми потоками (после каждой итерации каждый из потоков должен синхронизировать своё состояние с остальными). Для раскраски графов на распределенных системах следует использовать специализированные алгоритмы, основанные на разбиении графа &amp;lt;ref&amp;gt;Ian Bogle and George M. Slota, Parallel Graph Coloring Algorithms for Distributed GPU Environments&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D1%8B_%D0%BF%D1%80%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0-%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0.png&amp;diff=30099</id>
		<title>Файл:Результаты прогона алгоритма Джонса-Плассмана.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D1%8B_%D0%BF%D1%80%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0-%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0.png&amp;diff=30099"/>
		<updated>2025-11-29T10:19:16Z</updated>

		<summary type="html">&lt;p&gt;Lizord: Lizord загрузил новую версию Файл:Результаты прогона алгоритма Джонса-Плассмана.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Результаты прогона алгоритма Джонса-Плассмана&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30098</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30098"/>
		<updated>2025-11-29T10:17:47Z</updated>

		<summary type="html">&lt;p&gt;Lizord: /* Результаты прогонов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;compl&amp;quot;&amp;gt;Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&amp;lt;/ref&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;compl&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательной версией алгоритма Джонса-Плассмана является обычная жадная раскраска графа.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины v алгоритм проделывает следующие шаги:&lt;br /&gt;
# Просматривает её соседей.&lt;br /&gt;
# Собирает цвета уже окрашенных соседей.&lt;br /&gt;
# Выбирает минимальный свободный цвет.&lt;br /&gt;
# Присваивает его v.&lt;br /&gt;
&lt;br /&gt;
Инициализация начальных структур (расстановка приоритетов и цветов) требует один проход на &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt; итераций, что даёт сложность &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt;. &lt;br /&gt;
Для выбора доступного цвета необходимо просмотреть всех соседей вершины, что требует в сумме для всех вершин &amp;lt;math&amp;gt;\sum\limits_{v \in V} {deg(v)} = 2|E|&amp;lt;/math&amp;gt; итераций, что даёт вклад &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выбор минимального свободного цвета требует, в простейшем случае, также &amp;lt;math&amp;gt;\sum\limits_{v \in V} {O(deg(v))} = O(|E|)&amp;lt;/math&amp;gt; итераций, однако при эффективной реализации это можно делать за O(1) (например, при хранении доступных цветов в битовой карте).&lt;br /&gt;
&lt;br /&gt;
Итого получаем суммарную сложность &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Далее представлен информационный граф  &#039;&#039;&#039;одной итерации&#039;&#039;&#039; алгоритма. После её завершения, вершины, которые не были раскрашены прогоняются ещё раз - алгоритм работает, пока все вершины не будут раскрашены.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный граф итерации алгоритма Джонса Плассмана.png|center|thumb|500px|Рисунок 1. Информационный граф одной итерации алгоритма Джонса-Плассмана]]&lt;br /&gt;
&lt;br /&gt;
Обозначения:&lt;br /&gt;
Синие круги - набор нераскрашенных вершин, белые блоки вокруг них означают наборы соседей (в общем случае они могут пересекаться, но это не влияет на ход работы). Зеленые круги - операции выбора вершины с наибольшим приоритетом, желтые круги - операции выбора цвета, оранжевые круги - операции, непосредственно, раскраски&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Как видно из информационного графа, параллелизм достигается за счёт выделения из множества вершин независимых подмножеств, между которыми нет ребёр. Очевидно, что вершинам из таких подмножеств можно назначить цвет независимо, т.е параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления доступного вершине цвета имеет смысл использовать битмап, где каждый установленный бит означает доступный цвет. На большинстве вычислительных архитектур получить первый установленный бит в числе можно одной аппаратной инструкцией.&lt;br /&gt;
&lt;br /&gt;
Эту же оптимизацию можно перенести и на ядра для параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартные способы хранения графов обычно обладают плохой локальностью, которую можно улучшить, если изначально сортировать вершины, размещая их рядом с соседними.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
[[Файл:Результаты прогона алгоритма Джонса-Плассмана.png|center|800px|Рисунок 2. Результаты прогона алгоритма Джонса-Плассмана]]&lt;br /&gt;
&lt;br /&gt;
Из результатов прогонов видно, что несмотря на ожидаемый рост потенциальной производительности (скорости вычислений без учёта затрат на коммуникацию) с увеличением количества процессов, реальная производительность показывает прямо противоположную картину, с незначительным ростом производительности лишь на большом количестве процессов.&lt;br /&gt;
&lt;br /&gt;
Производительность в данном случае измеряется в GTEPS - миллиардах обработанных ребёр в секунду. Это классическая метрика производительности для задач на графах.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Несмотря на хорошую масштабируемость в рамках одного устройства (без необходимости обмениваться данными с другими процессами), алгоритм обладает слабой масштабируемостью на кластере ввиду роста расходов на коммуникацию между независимыми потоками (после каждой итерации каждый из потоков должен синхронизировать своё состояние с остальными). Для раскраски графов на распределенных системах следует использовать специализированные алгоритмы, основанные на разбиении графа &amp;lt;ref&amp;gt;Ian Bogle and George M. Slota, Parallel Graph Coloring Algorithms for Distributed GPU Environments&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D1%8B_%D0%BF%D1%80%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0-%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0.png&amp;diff=30097</id>
		<title>Файл:Результаты прогона алгоритма Джонса-Плассмана.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D1%8B_%D0%BF%D1%80%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0-%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0.png&amp;diff=30097"/>
		<updated>2025-11-29T10:12:14Z</updated>

		<summary type="html">&lt;p&gt;Lizord: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Результаты прогона алгоритма Джонса-Плассмана&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30050</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30050"/>
		<updated>2025-11-23T13:58:18Z</updated>

		<summary type="html">&lt;p&gt;Lizord: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;compl&amp;quot;&amp;gt;Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&amp;lt;/ref&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;compl&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательной версией алгоритма Джонса-Плассмана является обычная жадная раскраска графа.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины v алгоритм проделывает следующие шаги:&lt;br /&gt;
# Просматривает её соседей.&lt;br /&gt;
# Собирает цвета уже окрашенных соседей.&lt;br /&gt;
# Выбирает минимальный свободный цвет.&lt;br /&gt;
# Присваивает его v.&lt;br /&gt;
&lt;br /&gt;
Инициализация начальных структур (расстановка приоритетов и цветов) требует один проход на &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt; итераций, что даёт сложность &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt;. &lt;br /&gt;
Для выбора доступного цвета необходимо просмотреть всех соседей вершины, что требует в сумме для всех вершин &amp;lt;math&amp;gt;\sum\limits_{v \in V} {deg(v)} = 2|E|&amp;lt;/math&amp;gt; итераций, что даёт вклад &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выбор минимального свободного цвета требует, в простейшем случае, также &amp;lt;math&amp;gt;\sum\limits_{v \in V} {O(deg(v))} = O(|E|)&amp;lt;/math&amp;gt; итераций, однако при эффективной реализации это можно делать за O(1) (например, при хранении доступных цветов в битовой карте).&lt;br /&gt;
&lt;br /&gt;
Итого получаем суммарную сложность &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Далее представлен информационный граф  &#039;&#039;&#039;одной итерации&#039;&#039;&#039; алгоритма. После её завершения, вершины, которые не были раскрашены прогоняются ещё раз - алгоритм работает, пока все вершины не будут раскрашены.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный граф итерации алгоритма Джонса Плассмана.png|center|thumb|500px|Рисунок 1. Информационный граф одной итерации алгоритма Джонса-Плассмана]]&lt;br /&gt;
&lt;br /&gt;
Обозначения:&lt;br /&gt;
Синие круги - набор нераскрашенных вершин, белые блоки вокруг них означают наборы соседей (в общем случае они могут пересекаться, но это не влияет на ход работы). Зеленые круги - операции выбора вершины с наибольшим приоритетом, желтые круги - операции выбора цвета, оранжевые круги - операции, непосредственно, раскраски&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Как видно из информационного графа, параллелизм достигается за счёт выделения из множества вершин независимых подмножеств, между которыми нет ребёр. Очевидно, что вершинам из таких подмножеств можно назначить цвет независимо, т.е параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления доступного вершине цвета имеет смысл использовать битмап, где каждый установленный бит означает доступный цвет. На большинстве вычислительных архитектур получить первый установленный бит в числе можно одной аппаратной инструкцией.&lt;br /&gt;
&lt;br /&gt;
Эту же оптимизацию можно перенести и на ядра для параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартные способы хранения графов обычно обладают плохой локальностью, которую можно улучшить, если изначально сортировать вершины, размещая их рядом с соседними.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Несмотря на хорошую масштабируемость в рамках одного устройства (без необходимости обмениваться данными с другими процессами), алгоритм обладает слабой масштабируемостью на кластере ввиду роста расходов на коммуникацию между независимыми потоками (после каждой итерации каждый из потоков должен синхронизировать своё состояние с остальными). Для раскраски графов на распределенных системах следует использовать специализированные алгоритмы, основанные на разбиении графа &amp;lt;ref&amp;gt;Ian Bogle and George M. Slota, Parallel Graph Coloring Algorithms for Distributed GPU Environments&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30049</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30049"/>
		<updated>2025-11-23T13:45:29Z</updated>

		<summary type="html">&lt;p&gt;Lizord: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;compl&amp;quot;&amp;gt;Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&amp;lt;/ref&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;compl&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательной версией алгоритма Джонса-Плассмана является обычная жадная раскраска графа.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины v алгоритм проделывает следующие шаги:&lt;br /&gt;
# Просматривает её соседей.&lt;br /&gt;
# Собирает цвета уже окрашенных соседей.&lt;br /&gt;
# Выбирает минимальный свободный цвет.&lt;br /&gt;
# Присваивает его v.&lt;br /&gt;
&lt;br /&gt;
Инициализация начальных структур (расстановка приоритетов и цветов) требует один проход на &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt; итераций, что даёт сложность &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt;. &lt;br /&gt;
Для выбора доступного цвета необходимо просмотреть всех соседей вершины, что требует в сумме для всех вершин &amp;lt;math&amp;gt;\sum\limits_{v \in V} {deg(v)} = 2|E|&amp;lt;/math&amp;gt; итераций, что даёт вклад &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выбор минимального свободного цвета требует, в простейшем случае, также &amp;lt;math&amp;gt;\sum\limits_{v \in V} {O(deg(v))} = O(|E|)&amp;lt;/math&amp;gt; итераций, однако при эффективной реализации это можно делать за O(1) (например, при хранении доступных цветов в битовой карте).&lt;br /&gt;
&lt;br /&gt;
Итого получаем суммарную сложность &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Далее представлен информационный граф  &#039;&#039;&#039;одной итерации&#039;&#039;&#039; алгоритма. После её завершения, вершины, которые не были раскрашены прогоняются ещё раз - алгоритм работает, пока все вершины не будут раскрашены.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный граф итерации алгоритма Джонса Плассмана.png|center|thumb|500px|Рисунок 1. Информационный граф одной итерации алгоритма Джонса-Плассмана]]&lt;br /&gt;
&lt;br /&gt;
Обозначения:&lt;br /&gt;
Синие круги - набор нераскрашенных вершин, белые блоки вокруг них означают наборы соседей (в общем случае они могут пересекаться, но это не влияет на ход работы). Зеленые круги - операции выбора вершины с наибольшим приоритетом, желтые круги - операции выбора цвета, оранжевые круги - операции, непосредственно, раскраски&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Параллелизм достигается за счёт выделения из множества вершин независимых подмножеств, между которыми нет ребёр. Очевидно, что вершинам из таких подмножеств можно назначить цвет независимо, т.е параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления доступного вершине цвета имеет смысл использовать битмап, где каждый установленный бит означает доступный цвет. На большинстве вычислительных архитектур получить первый установленный бит в числе можно одной аппаратной инструкцией.&lt;br /&gt;
&lt;br /&gt;
Эту же оптимизацию можно перенести и на ядра для параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартные способы хранения графов обычно обладают плохой локальностью, которую можно улучшить, если изначально сортировать вершины, размещая их рядом с соседними.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Несмотря на хорошую масштабируемость в рамках одного устройства (без необходимости обмениваться данными с другими процессами), алгоритм обладает слабой масштабируемостью на кластере ввиду роста расходов на коммуникацию между независимыми потоками (после каждой итерации каждый из потоков должен синхронизировать своё состояние с остальными). Для раскраски графов на распределенных системах следует использовать специализированные алгоритмы, основанные на разбиении графа &amp;lt;ref&amp;gt;Ian Bogle and George M. Slota, Parallel Graph Coloring Algorithms for Distributed GPU Environments&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30048</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30048"/>
		<updated>2025-11-23T13:44:50Z</updated>

		<summary type="html">&lt;p&gt;Lizord: Updated references&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;compl&amp;quot;&amp;gt;Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&amp;lt;/ref&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;compl&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательной версией алгоритма Джонса-Плассмана является обычная жадная раскраска графа.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины v алгоритм проделывает следующие шаги:&lt;br /&gt;
# Просматривает её соседей.&lt;br /&gt;
# Собирает цвета уже окрашенных соседей.&lt;br /&gt;
# Выбирает минимальный свободный цвет.&lt;br /&gt;
# Присваивает его v.&lt;br /&gt;
&lt;br /&gt;
Инициализация начальных структур (расстановка приоритетов и цветов) требует один проход на &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt; итераций, что даёт сложность &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt;. &lt;br /&gt;
Для выбора доступного цвета необходимо просмотреть всех соседей вершины, что требует в сумме для всех вершин &amp;lt;math&amp;gt;\sum\limits_{v \in V} {deg(v)} = 2|E|&amp;lt;/math&amp;gt; итераций, что даёт вклад &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выбор минимального свободного цвета требует, в простейшем случае, также &amp;lt;math&amp;gt;\sum\limits_{v \in V} {O(deg(v))} = O(|E|)&amp;lt;/math&amp;gt; итераций, однако при эффективной реализации это можно делать за O(1) (например, при хранении доступных цветов в битовой карте).&lt;br /&gt;
&lt;br /&gt;
Итого получаем суммарную сложность &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Далее представлен информационный граф  &#039;&#039;&#039;одной итерации&#039;&#039;&#039; алгоритма. После её завершения, вершины, которые не были раскрашены прогоняются ещё раз - алгоритм работает, пока все вершины не будут раскрашены.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный граф итерации алгоритма Джонса Плассмана.png|center|thumb|500px|Рисунок 1. Информационный граф одной итерации алгоритма Джонса-Плассмана]]&lt;br /&gt;
&lt;br /&gt;
Обозначения:&lt;br /&gt;
Синие круги - набор нераскрашенных вершин, белые блоки вокруг них означают наборы соседей (в общем случае они могут пересекаться, но это не влияет на ход работы). Зеленые круги - операции выбора вершины с наибольшим приоритетом, желтые круги - операции выбора цвета, оранжевые круги - операции, непосредственно, раскраски&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Параллелизм достигается за счёт выделения из множества вершин независимых подмножеств, между которыми нет ребёр. Очевидно, что вершинам из таких подмножеств можно назначить цвет независимо, т.е параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления доступного вершине цвета имеет смысл использовать битмап, где каждый установленный бит означает доступный цвет. На большинстве вычислительных архитектур получить первый установленный бит в числе можно одной аппаратной инструкцией.&lt;br /&gt;
&lt;br /&gt;
Эту же оптимизацию можно перенести и на ядра для параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартные способы хранения графов обычно обладают плохой локальностью, которую можно улучшить, если изначально сортировать вершины, размещая их рядом с соседними.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Несмотря на хорошую масштабируемость в рамках одного устройства (без необходимости обмениваться данными с другими процессами), алгоритм обладает слабой масштабируемостью на кластере ввиду роста расходов на коммуникацию между независимыми потоками (после каждой итерации каждый из потоков должен синхронизировать своё состояние с остальными). Для раскраски графов на распределенных системах следует использовать специализированные алгоритмы, основанные на разбиении графа &amp;lt;ref&amp;gt;Ian Bogle and George M. Slota, Parallel Graph Coloring Algorithms for Distributed GPU Environments&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30047</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30047"/>
		<updated>2025-11-23T13:38:11Z</updated>

		<summary type="html">&lt;p&gt;Lizord: /* Выводы для классов архитектур */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательной версией алгоритма Джонса-Плассмана является обычная жадная раскраска графа.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины v алгоритм проделывает следующие шаги:&lt;br /&gt;
# Просматривает её соседей.&lt;br /&gt;
# Собирает цвета уже окрашенных соседей.&lt;br /&gt;
# Выбирает минимальный свободный цвет.&lt;br /&gt;
# Присваивает его v.&lt;br /&gt;
&lt;br /&gt;
Инициализация начальных структур (расстановка приоритетов и цветов) требует один проход на &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt; итераций, что даёт сложность &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt;. &lt;br /&gt;
Для выбора доступного цвета необходимо просмотреть всех соседей вершины, что требует в сумме для всех вершин &amp;lt;math&amp;gt;\sum\limits_{v \in V} {deg(v)} = 2|E|&amp;lt;/math&amp;gt; итераций, что даёт вклад &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выбор минимального свободного цвета требует, в простейшем случае, также &amp;lt;math&amp;gt;\sum\limits_{v \in V} {O(deg(v))} = O(|E|)&amp;lt;/math&amp;gt; итераций, однако при эффективной реализации это можно делать за O(1) (например, при хранении доступных цветов в битовой карте).&lt;br /&gt;
&lt;br /&gt;
Итого получаем суммарную сложность &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Далее представлен информационный граф  &#039;&#039;&#039;одной итерации&#039;&#039;&#039; алгоритма. После её завершения, вершины, которые не были раскрашены прогоняются ещё раз - алгоритм работает, пока все вершины не будут раскрашены.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный граф итерации алгоритма Джонса Плассмана.png|center|thumb|500px|Рисунок 1. Информационный граф одной итерации алгоритма Джонса-Плассмана]]&lt;br /&gt;
&lt;br /&gt;
Обозначения:&lt;br /&gt;
Синие круги - набор нераскрашенных вершин, белые блоки вокруг них означают наборы соседей (в общем случае они могут пересекаться, но это не влияет на ход работы). Зеленые круги - операции выбора вершины с наибольшим приоритетом, желтые круги - операции выбора цвета, оранжевые круги - операции, непосредственно, раскраски&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Параллелизм достигается за счёт выделения из множества вершин независимых подмножеств, между которыми нет ребёр. Очевидно, что вершинам из таких подмножеств можно назначить цвет независимо, т.е параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления доступного вершине цвета имеет смысл использовать битмап, где каждый установленный бит означает доступный цвет. На большинстве вычислительных архитектур получить первый установленный бит в числе можно одной аппаратной инструкцией.&lt;br /&gt;
&lt;br /&gt;
Эту же оптимизацию можно перенести и на ядра для параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартные способы хранения графов обычно обладают плохой локальностью, которую можно улучшить, если изначально сортировать вершины, размещая их рядом с соседними.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Несмотря на хорошую масштабируемость в рамках одного устройства (без необходимости обмениваться данными с другими процессами), алгоритм обладает слабой масштабируемостью на кластере ввиду роста расходов на коммуникацию между независимыми потоками (после каждой итерации каждый из потоков должен синхронизировать своё состояние с остальными). Для раскраски графов на распределенных системах следует использовать специализированные алгоритмы, основанные на разбиении графа &amp;lt;ref&amp;gt;Ian Bogle and George M. Slota, Parallel Graph Coloring Algorithms for Distributed GPU Environments&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30046</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30046"/>
		<updated>2025-11-23T13:29:43Z</updated>

		<summary type="html">&lt;p&gt;Lizord: /* Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательной версией алгоритма Джонса-Плассмана является обычная жадная раскраска графа.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины v алгоритм проделывает следующие шаги:&lt;br /&gt;
# Просматривает её соседей.&lt;br /&gt;
# Собирает цвета уже окрашенных соседей.&lt;br /&gt;
# Выбирает минимальный свободный цвет.&lt;br /&gt;
# Присваивает его v.&lt;br /&gt;
&lt;br /&gt;
Инициализация начальных структур (расстановка приоритетов и цветов) требует один проход на &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt; итераций, что даёт сложность &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt;. &lt;br /&gt;
Для выбора доступного цвета необходимо просмотреть всех соседей вершины, что требует в сумме для всех вершин &amp;lt;math&amp;gt;\sum\limits_{v \in V} {deg(v)} = 2|E|&amp;lt;/math&amp;gt; итераций, что даёт вклад &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выбор минимального свободного цвета требует, в простейшем случае, также &amp;lt;math&amp;gt;\sum\limits_{v \in V} {O(deg(v))} = O(|E|)&amp;lt;/math&amp;gt; итераций, однако при эффективной реализации это можно делать за O(1) (например, при хранении доступных цветов в битовой карте).&lt;br /&gt;
&lt;br /&gt;
Итого получаем суммарную сложность &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Далее представлен информационный граф  &#039;&#039;&#039;одной итерации&#039;&#039;&#039; алгоритма. После её завершения, вершины, которые не были раскрашены прогоняются ещё раз - алгоритм работает, пока все вершины не будут раскрашены.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный граф итерации алгоритма Джонса Плассмана.png|center|thumb|500px|Рисунок 1. Информационный граф одной итерации алгоритма Джонса-Плассмана]]&lt;br /&gt;
&lt;br /&gt;
Обозначения:&lt;br /&gt;
Синие круги - набор нераскрашенных вершин, белые блоки вокруг них означают наборы соседей (в общем случае они могут пересекаться, но это не влияет на ход работы). Зеленые круги - операции выбора вершины с наибольшим приоритетом, желтые круги - операции выбора цвета, оранжевые круги - операции, непосредственно, раскраски&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Параллелизм достигается за счёт выделения из множества вершин независимых подмножеств, между которыми нет ребёр. Очевидно, что вершинам из таких подмножеств можно назначить цвет независимо, т.е параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления доступного вершине цвета имеет смысл использовать битмап, где каждый установленный бит означает доступный цвет. На большинстве вычислительных архитектур получить первый установленный бит в числе можно одной аппаратной инструкцией.&lt;br /&gt;
&lt;br /&gt;
Эту же оптимизацию можно перенести и на ядра для параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартные способы хранения графов обычно обладают плохой локальностью, которую можно улучшить, если изначально сортировать вершины, размещая их рядом с соседними.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30045</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30045"/>
		<updated>2025-11-23T13:23:17Z</updated>

		<summary type="html">&lt;p&gt;Lizord: /* Особенности реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательной версией алгоритма Джонса-Плассмана является обычная жадная раскраска графа.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины v алгоритм проделывает следующие шаги:&lt;br /&gt;
# Просматривает её соседей.&lt;br /&gt;
# Собирает цвета уже окрашенных соседей.&lt;br /&gt;
# Выбирает минимальный свободный цвет.&lt;br /&gt;
# Присваивает его v.&lt;br /&gt;
&lt;br /&gt;
Инициализация начальных структур (расстановка приоритетов и цветов) требует один проход на &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt; итераций, что даёт сложность &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt;. &lt;br /&gt;
Для выбора доступного цвета необходимо просмотреть всех соседей вершины, что требует в сумме для всех вершин &amp;lt;math&amp;gt;\sum\limits_{v \in V} {deg(v)} = 2|E|&amp;lt;/math&amp;gt; итераций, что даёт вклад &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выбор минимального свободного цвета требует, в простейшем случае, также &amp;lt;math&amp;gt;\sum\limits_{v \in V} {O(deg(v))} = O(|E|)&amp;lt;/math&amp;gt; итераций, однако при эффективной реализации это можно делать за O(1) (например, при хранении доступных цветов в битовой карте).&lt;br /&gt;
&lt;br /&gt;
Итого получаем суммарную сложность &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Далее представлен информационный граф  &#039;&#039;&#039;одной итерации&#039;&#039;&#039; алгоритма. После её завершения, вершины, которые не были раскрашены прогоняются ещё раз - алгоритм работает, пока все вершины не будут раскрашены.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный граф итерации алгоритма Джонса Плассмана.png|center|thumb|500px|Рисунок 1. Информационный граф одной итерации алгоритма Джонса-Плассмана]]&lt;br /&gt;
&lt;br /&gt;
Обозначения:&lt;br /&gt;
Синие круги - набор нераскрашенных вершин, белые блоки вокруг них означают наборы соседей (в общем случае они могут пересекаться, но это не влияет на ход работы). Зеленые круги - операции выбора вершины с наибольшим приоритетом, желтые круги - операции выбора цвета, оранжевые круги - операции, непосредственно, раскраски&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Параллелизм достигается за счёт выделения из множества вершин независимых подмножеств, между которыми нет ребёр. Очевидно, что вершинам из таких подмножеств можно назначить цвет независимо, т.е параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления доступного вершине цвета имеет смысл использовать битмап, где каждый установленный бит означает доступный цвет. На большинстве вычислительных архитектур получить первый установленный бит в числе можно одной аппаратной инструкцией.&lt;br /&gt;
&lt;br /&gt;
Эту же оптимизацию можно перенести и на ядра для параллельной реализации.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30032</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30032"/>
		<updated>2025-11-18T12:43:29Z</updated>

		<summary type="html">&lt;p&gt;Lizord: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательной версией алгоритма Джонса-Плассмана является обычная жадная раскраска графа.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины v алгоритм проделывает следующие шаги:&lt;br /&gt;
# Просматривает её соседей.&lt;br /&gt;
# Собирает цвета уже окрашенных соседей.&lt;br /&gt;
# Выбирает минимальный свободный цвет.&lt;br /&gt;
# Присваивает его v.&lt;br /&gt;
&lt;br /&gt;
Инициализация начальных структур (расстановка приоритетов и цветов) требует один проход на &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt; итераций, что даёт сложность &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt;. &lt;br /&gt;
Для выбора доступного цвета необходимо просмотреть всех соседей вершины, что требует в сумме для всех вершин &amp;lt;math&amp;gt;\sum\limits_{v \in V} {deg(v)} = 2|E|&amp;lt;/math&amp;gt; итераций, что даёт вклад &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выбор минимального свободного цвета требует, в простейшем случае, также &amp;lt;math&amp;gt;\sum\limits_{v \in V} {O(deg(v))} = O(|E|)&amp;lt;/math&amp;gt; итераций, однако при эффективной реализации это можно делать за O(1) (например, при хранении доступных цветов в битовой карте).&lt;br /&gt;
&lt;br /&gt;
Итого получаем суммарную сложность &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Далее представлен информационный граф  &#039;&#039;&#039;одной итерации&#039;&#039;&#039; алгоритма. После её завершения, вершины, которые не были раскрашены прогоняются ещё раз - алгоритм работает, пока все вершины не будут раскрашены.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный граф итерации алгоритма Джонса Плассмана.png|center|thumb|500px|Рисунок 1. Информационный граф одной итерации алгоритма Джонса-Плассмана]]&lt;br /&gt;
&lt;br /&gt;
Обозначения:&lt;br /&gt;
Синие круги - набор нераскрашенных вершин, белые блоки вокруг них означают наборы соседей (в общем случае они могут пересекаться, но это не влияет на ход работы). Зеленые круги - операции выбора вершины с наибольшим приоритетом, желтые круги - операции выбора цвета, оранжевые круги - операции, непосредственно, раскраски&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Параллелизм достигается за счёт выделения из множества вершин независимых подмножеств, между которыми нет ребёр. Очевидно, что вершинам из таких подмножеств можно назначить цвет независимо, т.е параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30031</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30031"/>
		<updated>2025-11-18T12:39:16Z</updated>

		<summary type="html">&lt;p&gt;Lizord: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательной версией алгоритма Джонса-Плассмана является обычная жадная раскраска графа.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины v алгоритм проделывает следующие шаги:&lt;br /&gt;
# Просматривает её соседей.&lt;br /&gt;
# Собирает цвета уже окрашенных соседей.&lt;br /&gt;
# Выбирает минимальный свободный цвет.&lt;br /&gt;
# Присваивает его v.&lt;br /&gt;
&lt;br /&gt;
Инициализация начальных структур (расстановка приоритетов и цветов) требует один проход на &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt; итераций, что даёт сложность &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt;. &lt;br /&gt;
Для выбора доступного цвета необходимо просмотреть всех соседей вершины, что требует в сумме для всех вершин &amp;lt;math&amp;gt;\sum\limits_{v \in V} {deg(v)} = 2|E|&amp;lt;/math&amp;gt; итераций, что даёт вклад &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выбор минимального свободного цвета требует, в простейшем случае, также &amp;lt;math&amp;gt;\sum\limits_{v \in V} {O(deg(v))} = O(|E|)&amp;lt;/math&amp;gt; итераций, однако при эффективной реализации это можно делать за O(1) (например, при хранении доступных цветов в битовой карте).&lt;br /&gt;
&lt;br /&gt;
Итого получаем суммарную сложность &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Информационный граф итерации алгоритма Джонса Плассмана.png|center|thumb|500px|Рисунок 1. Информационный граф одной итерации алгоритма Джонса-Плассмана]]&lt;br /&gt;
&lt;br /&gt;
Обозначения:&lt;br /&gt;
Синие круги - набор нераскрашенных вершин, белые блоки вокруг них означают наборы соседей (в общем случае они могут пересекаться, но это не влияет на ход работы). Зеленые круги - операции выбора вершины с наибольшим приоритетом, желтые круги - операции выбора цвета, оранжевые круги - операции, непосредственно, раскраски&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Параллелизм достигается за счёт выделения из множества вершин независимых подмножеств, между которыми нет ребёр. Очевидно, что вершинам из таких подмножеств можно назначить цвет независимо, т.е параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B3%D1%80%D0%B0%D1%84_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0.png&amp;diff=30030</id>
		<title>Файл:Информационный граф итерации алгоритма Джонса Плассмана.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B3%D1%80%D0%B0%D1%84_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0.png&amp;diff=30030"/>
		<updated>2025-11-18T12:35:30Z</updated>

		<summary type="html">&lt;p&gt;Lizord: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Синие круги - набор нераскрашенных вершин, белые блоки вокруг них означают наборы соседей (в общем случае они могут пересекаться, но это не влияет на ход работы). Зеленые круги - операции выбора вершины с наибольшим приоритетом, желтые круги - операции выбора цвета, оранжевые круги - операции, непосредственно, раскраски.&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30029</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30029"/>
		<updated>2025-11-18T12:05:47Z</updated>

		<summary type="html">&lt;p&gt;Lizord: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательной версией алгоритма Джонса-Плассмана является обычная жадная раскраска графа.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины v алгоритм проделывает следующие шаги:&lt;br /&gt;
# Просматривает её соседей.&lt;br /&gt;
# Собирает цвета уже окрашенных соседей.&lt;br /&gt;
# Выбирает минимальный свободный цвет.&lt;br /&gt;
# Присваивает его v.&lt;br /&gt;
&lt;br /&gt;
Инициализация начальных структур (расстановка приоритетов и цветов) требует один проход на &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt; итераций, что даёт сложность &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt;. &lt;br /&gt;
Для выбора доступного цвета необходимо просмотреть всех соседей вершины, что требует в сумме для всех вершин &amp;lt;math&amp;gt;\sum\limits_{v \in V} {deg(v)} = 2|E|&amp;lt;/math&amp;gt; итераций, что даёт вклад &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выбор минимального свободного цвета требует, в простейшем случае, также &amp;lt;math&amp;gt;\sum\limits_{v \in V} {O(deg(v))} = O(|E|)&amp;lt;/math&amp;gt; итераций, однако при эффективной реализации это можно делать за O(1) (например, при хранении доступных цветов в битовой карте).&lt;br /&gt;
&lt;br /&gt;
Итого получаем суммарную сложность &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Параллелизм достигается за счёт выделения из множества вершин независимых подмножеств, между которыми нет ребёр. Очевидно, что вершинам из таких подмножеств можно назначить цвет независимо, т.е параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30028</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30028"/>
		<updated>2025-11-18T12:00:37Z</updated>

		<summary type="html">&lt;p&gt;Lizord: Исправлена ошибка в размере выходных данных&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательной версией алгоритма Джонса-Плассмана является обычная жадная раскраска графа.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины v алгоритм проделывает следующие шаги:&lt;br /&gt;
# Просматривает её соседей.&lt;br /&gt;
# Собирает цвета уже окрашенных соседей.&lt;br /&gt;
# Выбирает минимальный свободный цвет.&lt;br /&gt;
# Присваивает его v.&lt;br /&gt;
&lt;br /&gt;
Инициализация начальных структур (расстановка приоритетов и цветов) требует один проход на &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt; итераций, что даёт сложность &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt;. &lt;br /&gt;
Для выбора доступного цвета необходимо просмотреть всех соседей вершины, что требует в сумме для всех вершин &amp;lt;math&amp;gt;\sum\limits_{v \in V} {deg(v)} = 2|E|&amp;lt;/math&amp;gt; итераций, что даёт вклад &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выбор минимального свободного цвета требует, в простейшем случае, также &amp;lt;math&amp;gt;\sum\limits_{v \in V} {O(deg(v))} = O(|E|)&amp;lt;/math&amp;gt; итераций, однако при эффективной реализации это можно делать за O(1) (например, при хранении доступных цветов в битовой карте).&lt;br /&gt;
&lt;br /&gt;
Итого получаем суммарную сложность &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30027</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30027"/>
		<updated>2025-11-18T11:59:37Z</updated>

		<summary type="html">&lt;p&gt;Lizord: Исправлена ошибка в последовательной сложности&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательной версией алгоритма Джонса-Плассмана является обычная жадная раскраска графа.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины v алгоритм проделывает следующие шаги:&lt;br /&gt;
# Просматривает её соседей.&lt;br /&gt;
# Собирает цвета уже окрашенных соседей.&lt;br /&gt;
# Выбирает минимальный свободный цвет.&lt;br /&gt;
# Присваивает его v.&lt;br /&gt;
&lt;br /&gt;
Инициализация начальных структур (расстановка приоритетов и цветов) требует один проход на &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt; итераций, что даёт сложность &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt;. &lt;br /&gt;
Для выбора доступного цвета необходимо просмотреть всех соседей вершины, что требует в сумме для всех вершин &amp;lt;math&amp;gt;\sum\limits_{v \in V} {deg(v)} = 2|E|&amp;lt;/math&amp;gt; итераций, что даёт вклад &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выбор минимального свободного цвета требует, в простейшем случае, также &amp;lt;math&amp;gt;\sum\limits_{v \in V} {O(deg(v))} = O(|E|)&amp;lt;/math&amp;gt; итераций, однако при эффективной реализации это можно делать за O(1) (например, при хранении доступных цветов в битовой карте).&lt;br /&gt;
&lt;br /&gt;
Итого получаем суммарную сложность &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30026</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30026"/>
		<updated>2025-11-18T11:58:50Z</updated>

		<summary type="html">&lt;p&gt;Lizord: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательной версией алгоритма Джонса-Плассмана является обычная жадная раскраска графа.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для каждой вершины v алгоритм проделывает следующие шаги:&lt;br /&gt;
# Просматривает её соседей.&lt;br /&gt;
# Собирает цвета уже окрашенных соседей.&lt;br /&gt;
# Выбирает минимальный свободный цвет.&lt;br /&gt;
# Присваивает его v.&lt;br /&gt;
&lt;br /&gt;
Инициализация начальных структур (расстановка приоритетов и цветов) требует один проход на &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt; итераций, что даёт сложность &amp;lt;math&amp;gt;O(|V|)&amp;lt;/math&amp;gt;. &lt;br /&gt;
Для выбора доступного цвета необходимо просмотреть всех соседей вершины, что требует в сумме для всех вершин &amp;lt;math&amp;gt;\sum\limits_{v \in V} {deg(v)} = 2|E|&amp;lt;/math&amp;gt; итераций, что даёт вклад &amp;lt;math&amp;gt;O(|E|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выбор минимального свободного цвета требует, в простейшем случае, также &amp;lt;math&amp;gt;\sum\limits_{v \in V} {O(deg(v))} = O(|E|)&amp;lt;/math&amp;gt; итераций, однако при эффективной реализации это можно делать за O(1) (например, при хранении доступных цветов в битовой карте).&lt;br /&gt;
&lt;br /&gt;
Итого получаем суммарную сложность &amp;lt;math&amp;gt;O(|V| + |E|)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30024</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30024"/>
		<updated>2025-11-18T11:42:21Z</updated>

		<summary type="html">&lt;p&gt;Lizord: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Последовательной версией алгоритма Джонса-Плассмана является обычная жадная раскраска графа.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30023</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=30023"/>
		<updated>2025-11-18T11:38:48Z</updated>

		<summary type="html">&lt;p&gt;Lizord: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Входные данные:&lt;br /&gt;
  граф с вершинами V, рёбрами E.&lt;br /&gt;
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V&lt;br /&gt;
&lt;br /&gt;
color := []&lt;br /&gt;
w := []&lt;br /&gt;
for each v ∈ V:&lt;br /&gt;
     color[v] := 0&lt;br /&gt;
     w[v] := PRIORITY(v)&lt;br /&gt;
&lt;br /&gt;
while v с color[v] == 0:&lt;br /&gt;
     S := ∅&lt;br /&gt;
     for each v с color[v] == 0 in parallel:&lt;br /&gt;
         isMax := true&lt;br /&gt;
         for each u ∈ N(v):&lt;br /&gt;
             if color[u] == 0 и ( w[u] &amp;gt; w[v] или (w[u] == w[v] и u.id &amp;gt; v.id) ):&lt;br /&gt;
                 isMax := false&lt;br /&gt;
                 break&lt;br /&gt;
         if isMax:&lt;br /&gt;
             S.append(v)&lt;br /&gt;
&lt;br /&gt;
     for each v ∈ S in parallel:&lt;br /&gt;
         used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }&lt;br /&gt;
         c := 1&lt;br /&gt;
         while c ∈ used:&lt;br /&gt;
             c := c + 1&lt;br /&gt;
         color[v] := c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29749</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29749"/>
		<updated>2025-10-22T08:44:24Z</updated>

		<summary type="html">&lt;p&gt;Lizord: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29748</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29748"/>
		<updated>2025-10-22T08:40:34Z</updated>

		<summary type="html">&lt;p&gt;Lizord: Улучшен раздел 1.1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманном в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29747</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29747"/>
		<updated>2025-10-22T08:36:11Z</updated>

		<summary type="html">&lt;p&gt;Lizord: Добавлено описание различных функций приоритетов&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, основанная на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Алгоритм выделения этого подмножества был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt; Был предложен американскими исследователями Марком Джонсом и Паулем Плассманном в 1991 году.&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Функции приоритета ====&lt;br /&gt;
Существуют различные способы определять функцию приоритета &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;, которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:&lt;br /&gt;
* First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.&lt;br /&gt;
* Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.&lt;br /&gt;
* Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.&lt;br /&gt;
* Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней&lt;br /&gt;
* Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.&lt;br /&gt;
* и др.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29746</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29746"/>
		<updated>2025-10-22T08:21:18Z</updated>

		<summary type="html">&lt;p&gt;Lizord: Небольшие исправления&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, основанная на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Алгоритм выделения этого подмножества был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt; Был предложен американскими исследователями Марком Джонсом и Паулем Плассманном в 1991 году.&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29745</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29745"/>
		<updated>2025-10-22T07:29:32Z</updated>

		<summary type="html">&lt;p&gt;Lizord: Различные исправления, добавлены свойства алгоритма&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, основанная на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Алгоритм выделения этого подмножества был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt; Был предложен американскими исследователями Марком Джонсом и Паулем Плассманном в 1991 году.&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v_i) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности, либо &amp;lt;math&amp;gt;|V|^2&amp;lt;/math&amp;gt;, если матрицей смежности&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов будет распределено неравномерно)&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
3. Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29744</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29744"/>
		<updated>2025-10-16T13:29:48Z</updated>

		<summary type="html">&lt;p&gt;Lizord: Удалён лишний тег&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, основанная на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Алгоритм выделения этого подмножества был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае &amp;lt;math&amp;gt;deg(v_i)&amp;lt;/math&amp;gt; итераций.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = {c_i}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
Test2 &amp;lt;ref&amp;gt;Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29743</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29743"/>
		<updated>2025-10-16T13:29:19Z</updated>

		<summary type="html">&lt;p&gt;Lizord: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, основанная на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Алгоритм выделения этого подмножества был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае &amp;lt;math&amp;gt;deg(v_i)&amp;lt;/math&amp;gt; итераций.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: Граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt; если граф представлен списком связности.&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор &amp;lt;math&amp;gt;c = {c_i}&amp;lt;/math&amp;gt;, содержащий итоговые цвета вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
Test2 &amp;lt;ref&amp;gt;Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29742</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29742"/>
		<updated>2025-10-16T13:25:02Z</updated>

		<summary type="html">&lt;p&gt;Lizord: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, основанная на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Алгоритм выделения этого подмножества был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае &amp;lt;math&amp;gt;deg(v_i)&amp;lt;/math&amp;gt; итераций.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
Test2 &amp;lt;ref&amp;gt;Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29741</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29741"/>
		<updated>2025-10-16T13:23:12Z</updated>

		<summary type="html">&lt;p&gt;Lizord: Исправлено описание алгоритма&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, основанная на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Алгоритм выделения этого подмножества был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&lt;br /&gt;
## Для каждой вершины &amp;lt;math&amp;gt;v_i \in V&#039;&amp;lt;/math&amp;gt; назначается уникальная случайная метка &amp;lt;math&amp;gt;p(v_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v_i \in I \Leftrightarrow p(v) &amp;gt; p(w), \forall w \in adj(v_i) &amp;lt;/math&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае &amp;lt;math&amp;gt;deg(v_i)&amp;lt;/math&amp;gt; итераций.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма === &lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
Test2 &amp;lt;ref&amp;gt;Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29740</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29740"/>
		<updated>2025-10-16T12:26:27Z</updated>

		<summary type="html">&lt;p&gt;Lizord: Поправлена опечатка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, основанная на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Алгоритм выделения этого подмножества был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&amp;lt;br&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подмножество независимых вершин &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; выделяется следующим образом &amp;lt;ref&amp;gt;M. Luby, A simple parallel algorithm for the maximal independent set problem, SIAM&lt;br /&gt;
Journal on Computing, 4 (1986), pp. 10&amp;lt;/ref&amp;gt;:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;I = \emptyset, V&#039; = V, G&#039; = G&amp;lt;/math&amp;gt;. Повторяем следующие шаги, пока &amp;lt;math&amp;gt;G&#039; \neq \emptyset &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt;I = I \cup I&#039;&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;X = I&#039; \cup N(I&#039;)&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;V&#039; = V&#039; \;\backslash\; X&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;G&#039; = G(V&#039;)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае &amp;lt;math&amp;gt;deg(v_i)&amp;lt;/math&amp;gt; итераций.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма === &lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
Test2 &amp;lt;ref&amp;gt;Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29739</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29739"/>
		<updated>2025-10-16T12:25:42Z</updated>

		<summary type="html">&lt;p&gt;Lizord: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, основанная на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Алгоритм выделения этого подмножества был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: граф &amp;lt;math&amp;gt;G = G(V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - множество вершин, а &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; - множество ребёр.&amp;lt;br&amp;gt;&lt;br /&gt;
Вычисляемые данные: вектор цветов &amp;lt;math&amp;gt;c = \{c_i\}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;|V|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски графа, необходимо проделать следующие шаги:&lt;br /&gt;
# Обозначим множество нераскрашенных вершин как &amp;lt;math&amp;gt;V&#039; = V&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
# На каждой итерации будем выделять максимальное независимое подмножество вершин &amp;lt;math&amp;gt;I \subset V&#039;&amp;lt;/math&amp;gt;, которое раскрашивается параллельно.&amp;lt;br&amp;gt;&lt;br /&gt;
# После этого полагаем &amp;lt;math&amp;gt;V&#039; = V&#039;\;\backslash\;I&amp;lt;/math&amp;gt;. Алгоритм работает, пока &amp;lt;math&amp;gt;V&#039; \neq \emptyset&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подмножество независимых вершин &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; выделяется следующим образом &amp;lt;ref&amp;gt;M. Luby, A simple paral lel algorithm for the maximal independent set problem, SIAM&lt;br /&gt;
Journal on Computing, 4 (1986), pp. 10&amp;lt;/ref&amp;gt;:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;I = \emptyset, V&#039; = V, G&#039; = G&amp;lt;/math&amp;gt;. Повторяем следующие шаги, пока &amp;lt;math&amp;gt;G&#039; \neq \emptyset &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt;I = I \cup I&#039;&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;X = I&#039; \cup N(I&#039;)&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;V&#039; = V&#039; \;\backslash\; X&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;G&#039; = G(V&#039;)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для раскраски вершины &amp;lt;math&amp;gt;v_i \in I&amp;lt;/math&amp;gt; необходимо назначить ей цвет &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt; такой, что &amp;lt;math&amp;gt;c_i \notin N_c(v_i)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N_c(v_i)&amp;lt;/math&amp;gt; - цвета вершин, соседних для &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;. Это можно сделать последовательным перебором, это займёт в худшем случае &amp;lt;math&amp;gt;deg(v_i)&amp;lt;/math&amp;gt; итераций.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма === &lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
Test2 &amp;lt;ref&amp;gt;Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29738</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29738"/>
		<updated>2025-10-16T11:39:55Z</updated>

		<summary type="html">&lt;p&gt;Lizord: Добавлено общее описание алгоритма&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
&#039;&#039;&#039;Алгоритм Джонса-Плассмана&#039;&#039;&#039; - параллельная версия жадного алгоритма для раскраски графа, основанная на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Алгоритм выделения этого подмножества был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. &amp;lt;ref name=&amp;quot;jp&amp;quot;&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&lt;br /&gt;
=== Математическое описание алгоритма === &lt;br /&gt;
=== Вычислительное ядро алгоритма === &lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
Test2 &amp;lt;ref&amp;gt;Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29737</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29737"/>
		<updated>2025-10-16T11:26:26Z</updated>

		<summary type="html">&lt;p&gt;Lizord: Корректные сноски на литературу&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
Test1 &amp;lt;ref&amp;gt;M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&amp;lt;/ref&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Test2 &amp;lt;ref&amp;gt;Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&amp;lt;/ref&amp;gt;&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
=== Математическое описание алгоритма === &lt;br /&gt;
=== Вычислительное ядро алгоритма === &lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29736</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29736"/>
		<updated>2025-10-16T11:14:17Z</updated>

		<summary type="html">&lt;p&gt;Lizord: Исправлен объем входных данных&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;8|E|&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
=== Математическое описание алгоритма === &lt;br /&gt;
=== Вычислительное ядро алгоритма === &lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
# M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&lt;br /&gt;
# Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29735</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29735"/>
		<updated>2025-10-16T11:09:40Z</updated>

		<summary type="html">&lt;p&gt;Lizord: Добавлена информация о сложности алгоритма&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(V + E)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(\frac{log(V)}{log log(V)})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(log(V))&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;V + E&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
=== Математическое описание алгоритма === &lt;br /&gt;
=== Вычислительное ядро алгоритма === &lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;br /&gt;
# M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993&lt;br /&gt;
# Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29734</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29734"/>
		<updated>2025-10-15T13:28:03Z</updated>

		<summary type="html">&lt;p&gt;Lizord: Stub&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;V + E&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
=== Математическое описание алгоритма === &lt;br /&gt;
=== Вычислительное ядро алгоритма === &lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29733</id>
		<title>Участник:Lizord/Алгоритм Джонса Плассмана</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lizord/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%B0_%D0%9F%D0%BB%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=29733"/>
		<updated>2025-10-15T13:22:46Z</updated>

		<summary type="html">&lt;p&gt;Lizord: Stub&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{in use|[[Участник:Lizord|Lizord]] ([[Обсуждение участника:Lizord|обсуждение]])}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Lizord|Демаков М. А.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Джонса-Плассмана&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;V + E&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма === &lt;br /&gt;
=== Математическое описание алгоритма === &lt;br /&gt;
=== Вычислительное ядро алгоритма === &lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма === &lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lizord</name></author>
	</entry>
</feed>