<?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=Dmarkin</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=Dmarkin"/>
	<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/Dmarkin"/>
	<updated>2026-10-22T15:52:49Z</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22450</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22450"/>
		<updated>2017-02-08T04:19:26Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{assignment}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (&amp;lt;math&amp;gt;MST&amp;lt;/math&amp;gt;):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 \log N) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Отсюда следует, что вычислительным ядром алгоритма является этап построения минимального покрывающего дерева, поскольку он имеет наибольшую сложность.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктура алгоритма описана в пункте 1.3. &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;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {}     //множество ребер минимального остовного дерева объявляется пустым&lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;     //расстояние до построенного дерева объявляется максимальным&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;     //вершина не имеет предков из построенного дерева&lt;br /&gt;
 &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;     //включаем вершину с номером 1 в дерево&lt;br /&gt;
 &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt;     //записываем в очередь множество всех вершин&lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt;     //извлекаем из очереди вершину с минимальным расстоянием до построенного дерева &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;     //добавляем выбранное ребро в дерево&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 \log N) + O(N) = O(N^2 \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; множество объектов &amp;lt;math&amp;gt;x = (x_1,...,x_N)&amp;lt;/math&amp;gt;. Объём &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; множество кластеров &amp;lt;math&amp;gt;Clust = (Clust_1,...,Clust_K)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Clust_i = (x_{i,1},..., x_{i, N_i}), x_{i, l} \ne x_{j, m}, i \ne j, \forall l&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;m, \sum_{i=1}^K {N_i} = N &amp;lt;/math&amp;gt;. Объём &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм останавливается за конечное число шагов, поскольку на каждом шаге становится по крайней мере на один фрагмент меньше.&lt;br /&gt;
* Число фрагментов на каждом шаге уменьшается как минимум вдвое, так что общее число шагов составляет не более &amp;lt;math&amp;gt;\log_2 N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Соотношение последовательной и параллельной сложности: &amp;lt;math&amp;gt; \frac{N^2 \log N} {N \log N} = N &amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность: &amp;lt;math&amp;gt; \frac {N^2 \log N} {N}   = N \log N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Алгоритм детерминирован. Если случается, что имеются два ребра &amp;lt;math&amp;gt;(x_i,x_j)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(x_l,x_m)&amp;lt;/math&amp;gt;, такие что &amp;lt;math&amp;gt;d(x_i,x_j) = d(x_l,x_m)&amp;lt;/math&amp;gt;, то алгоритм должен выбрать ребро, одна из вершин которого имеет минимальный индекс &amp;lt;math&amp;gt;\min(i,j,l,m)&amp;lt;/math&amp;gt;, если эти два ребра выходят из одной вершины, индекс которой является минимальным (например, &amp;lt;math&amp;gt;i=l&amp;lt;/math&amp;gt; ), то выбирается ребро, вершина которого имеет наименьший индекс из двух других вершин &amp;lt;math&amp;gt;\min(j,m)&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;
Масштабируемость алгоритма Прима исследована на параллельной версии, представленной в [http://portal.tpu.ru/SHARED/a/AXOENOWSW/Publications_rus/Tab3/Tab/Гергель%20В.П.%20-%20Высокопроизводит.pdf книге]. При помощи директив OpenMP алгоритм распараллеливался по ядрам. В данном источнике представлены результаты экспериментов при использовании 2 и 4 вычислительных ядер и изменении объёма входных данных от 100 до 1000. Эксперименты проводились на двухпроцессорном вычислительном узле на базе четырехядерных процессоров Intel Xeon E5320, 1.86 ГГц, 4 Гб RAM под управлением операционной системы Microsoft Windows HPC Server 2008. Разработка программ проводилась в среде Microsoft Visual Studio 2008, для компиляции использовался Intel C++ Compiler 10.0 for Windows.  &lt;br /&gt;
&lt;br /&gt;
[[Файл:2017-02-08_06-56-11.png|border|мини|центр|1000px|Результаты вычислительных экспериментов для параллельного алгоритма Прима (при использовании двух и четырех вычислительных ядер) ]]&lt;br /&gt;
&lt;br /&gt;
Из графика видно, что время выполнения увеличивается при увеличении объёма входных данных, но уменьшается при увеличении вычислительных ядер.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*[https://github.com/jakevdp/mst_clustering Python: MST Clustering]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_62_0/libs/graph_parallel/doc/html/index.html С++: Parallel boost graph library]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_53_0/libs/graph_parallel/doc/html/dehne_gotz_min_spanning_tree.html C++: Minimum Spanning Tree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/PrimMinimumSpanningTree.html Java: JGraphT PrimMinimumSpanningTree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/KruskalMinimumSpanningTree.html Java: JGraphT  KruskalMinimumSpanningTree] &lt;br /&gt;
*[http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.sparse.csgraph.minimum_spanning_tree.html Python: SciPy]&lt;br /&gt;
*[https://networkx.github.io/documentation/networkx-1.10/reference/algorithms.mst.html Python: NetworkX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
# Нейский И.М. Классификация и сравнение методов кластеризации&lt;br /&gt;
# C. Kingsford. Minimum Spanning Trees &amp;amp; Clustering&lt;br /&gt;
# Y. Zhou et al. Clustering with Minimum Spanning Trees&lt;br /&gt;
# Gallager, Robert G, P A Humblet, and P M Spira. “A Distributed Algorithm for Minimum-Weight Spanning Trees.” ACM Transactions on Programming Languages and Systems 5, no. 1 (1983): 66–77. doi:10.1145/357195.357200.&lt;br /&gt;
# Gafni, Eli. “Improvements in the Time Complexity of Two Message-Optimal Election Algorithms,” 175–85, New York, New York, USA: ACM Press, 1985. doi:10.1145/323596.323612.&lt;br /&gt;
# Awerbuch, B. “Optimal Distributed Algorithms for Minimum Weight Spanning Tree, Counting, Leader Election, and Related Problems,” 230–40, New York, New York, USA: ACM Press, 1987. doi:10.1145/28395.28421.&lt;br /&gt;
# Гергель В.П. Высокопроизводительные вычисления для многоядерных многопроцессорных систем&lt;/div&gt;</summary>
		<author><name>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22449</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22449"/>
		<updated>2017-02-08T04:14:18Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{assigment}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (&amp;lt;math&amp;gt;MST&amp;lt;/math&amp;gt;):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 \log N) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Отсюда следует, что вычислительным ядром алгоритма является этап построения минимального покрывающего дерева, поскольку он имеет наибольшую сложность.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктура алгоритма описана в пункте 1.3. &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;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {}     //множество ребер минимального остовного дерева объявляется пустым&lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;     //расстояние до построенного дерева объявляется максимальным&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;     //вершина не имеет предков из построенного дерева&lt;br /&gt;
 &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;     //включаем вершину с номером 1 в дерево&lt;br /&gt;
 &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt;     //записываем в очередь множество всех вершин&lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt;     //извлекаем из очереди вершину с минимальным расстоянием до построенного дерева &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;     //добавляем выбранное ребро в дерево&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 \log N) + O(N) = O(N^2 \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; множество объектов &amp;lt;math&amp;gt;x = (x_1,...,x_N)&amp;lt;/math&amp;gt;. Объём &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; множество кластеров &amp;lt;math&amp;gt;Clust = (Clust_1,...,Clust_K)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Clust_i = (x_{i,1},..., x_{i, N_i}), x_{i, l} \ne x_{j, m}, i \ne j, \forall l&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;m, \sum_{i=1}^K {N_i} = N &amp;lt;/math&amp;gt;. Объём &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм останавливается за конечное число шагов, поскольку на каждом шаге становится по крайней мере на один фрагмент меньше.&lt;br /&gt;
* Число фрагментов на каждом шаге уменьшается как минимум вдвое, так что общее число шагов составляет не более &amp;lt;math&amp;gt;\log_2 N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Соотношение последовательной и параллельной сложности: &amp;lt;math&amp;gt; \frac{N^2 \log N} {N \log N} = N &amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность: &amp;lt;math&amp;gt; \frac {N^2 \log N} {N}   = N \log N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Алгоритм детерминирован. Если случается, что имеются два ребра &amp;lt;math&amp;gt;(x_i,x_j)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(x_l,x_m)&amp;lt;/math&amp;gt;, такие что &amp;lt;math&amp;gt;d(x_i,x_j) = d(x_l,x_m)&amp;lt;/math&amp;gt;, то алгоритм должен выбрать ребро, одна из вершин которого имеет минимальный индекс &amp;lt;math&amp;gt;\min(i,j,l,m)&amp;lt;/math&amp;gt;, если эти два ребра выходят из одной вершины, индекс которой является минимальным (например, &amp;lt;math&amp;gt;i=l&amp;lt;/math&amp;gt; ), то выбирается ребро, вершина которого имеет наименьший индекс из двух других вершин &amp;lt;math&amp;gt;\min(j,m)&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;
Масштабируемость алгоритма Прима исследована на параллельной версии, представленной в [http://portal.tpu.ru/SHARED/a/AXOENOWSW/Publications_rus/Tab3/Tab/Гергель%20В.П.%20-%20Высокопроизводит.pdf книге]. При помощи директив OpenMP алгоритм распараллеливался по ядрам. В данном источнике представлены результаты экспериментов при использовании 2 и 4 вычислительных ядер и изменении объёма входных данных от 100 до 1000. Эксперименты проводились на двухпроцессорном вычислительном узле на базе четырехядерных процессоров Intel Xeon E5320, 1.86 ГГц, 4 Гб RAM под управлением операционной системы Microsoft Windows HPC Server 2008. Разработка программ проводилась в среде Microsoft Visual Studio 2008, для компиляции использовался Intel C++ Compiler 10.0 for Windows.  &lt;br /&gt;
&lt;br /&gt;
[[Файл:2017-02-08_06-56-11.png|border|мини|центр|1000px|Результаты вычислительных экспериментов для параллельного алгоритма Прима (при использовании двух и четырех вычислительных ядер) ]]&lt;br /&gt;
&lt;br /&gt;
Из графика видно, что время выполнения увеличивается при увеличении объёма входных данных, но уменьшается при увеличении вычислительных ядер.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*[https://github.com/jakevdp/mst_clustering Python: MST Clustering]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_62_0/libs/graph_parallel/doc/html/index.html С++: Parallel boost graph library]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_53_0/libs/graph_parallel/doc/html/dehne_gotz_min_spanning_tree.html C++: Minimum Spanning Tree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/PrimMinimumSpanningTree.html Java: JGraphT PrimMinimumSpanningTree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/KruskalMinimumSpanningTree.html Java: JGraphT  KruskalMinimumSpanningTree] &lt;br /&gt;
*[http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.sparse.csgraph.minimum_spanning_tree.html Python: SciPy]&lt;br /&gt;
*[https://networkx.github.io/documentation/networkx-1.10/reference/algorithms.mst.html Python: NetworkX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
# Нейский И.М. Классификация и сравнение методов кластеризации&lt;br /&gt;
# C. Kingsford. Minimum Spanning Trees &amp;amp; Clustering&lt;br /&gt;
# Y. Zhou et al. Clustering with Minimum Spanning Trees&lt;br /&gt;
# Gallager, Robert G, P A Humblet, and P M Spira. “A Distributed Algorithm for Minimum-Weight Spanning Trees.” ACM Transactions on Programming Languages and Systems 5, no. 1 (1983): 66–77. doi:10.1145/357195.357200.&lt;br /&gt;
# Gafni, Eli. “Improvements in the Time Complexity of Two Message-Optimal Election Algorithms,” 175–85, New York, New York, USA: ACM Press, 1985. doi:10.1145/323596.323612.&lt;br /&gt;
# Awerbuch, B. “Optimal Distributed Algorithms for Minimum Weight Spanning Tree, Counting, Leader Election, and Related Problems,” 230–40, New York, New York, USA: ACM Press, 1987. doi:10.1145/28395.28421.&lt;br /&gt;
# Гергель В.П. Высокопроизводительные вычисления для многоядерных многопроцессорных систем&lt;/div&gt;</summary>
		<author><name>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22448</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22448"/>
		<updated>2017-02-08T04:13:10Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (&amp;lt;math&amp;gt;MST&amp;lt;/math&amp;gt;):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 \log N) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Отсюда следует, что вычислительным ядром алгоритма является этап построения минимального покрывающего дерева, поскольку он имеет наибольшую сложность.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктура алгоритма описана в пункте 1.3. &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;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {}     //множество ребер минимального остовного дерева объявляется пустым&lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;     //расстояние до построенного дерева объявляется максимальным&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;     //вершина не имеет предков из построенного дерева&lt;br /&gt;
 &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;     //включаем вершину с номером 1 в дерево&lt;br /&gt;
 &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt;     //записываем в очередь множество всех вершин&lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt;     //извлекаем из очереди вершину с минимальным расстоянием до построенного дерева &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;     //добавляем выбранное ребро в дерево&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 \log N) + O(N) = O(N^2 \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; множество объектов &amp;lt;math&amp;gt;x = (x_1,...,x_N)&amp;lt;/math&amp;gt;. Объём &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; множество кластеров &amp;lt;math&amp;gt;Clust = (Clust_1,...,Clust_K)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Clust_i = (x_{i,1},..., x_{i, N_i}), x_{i, l} \ne x_{j, m}, i \ne j, \forall l&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;m, \sum_{i=1}^K {N_i} = N &amp;lt;/math&amp;gt;. Объём &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм останавливается за конечное число шагов, поскольку на каждом шаге становится по крайней мере на один фрагмент меньше.&lt;br /&gt;
* Число фрагментов на каждом шаге уменьшается как минимум вдвое, так что общее число шагов составляет не более &amp;lt;math&amp;gt;\log_2 N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Соотношение последовательной и параллельной сложности: &amp;lt;math&amp;gt; \frac{N^2 \log N} {N \log N} = N &amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность: &amp;lt;math&amp;gt; \frac {N^2 \log N} {N}   = N \log N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Алгоритм детерминирован. Если случается, что имеются два ребра &amp;lt;math&amp;gt;(x_i,x_j)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(x_l,x_m)&amp;lt;/math&amp;gt;, такие что &amp;lt;math&amp;gt;d(x_i,x_j) = d(x_l,x_m)&amp;lt;/math&amp;gt;, то алгоритм должен выбрать ребро, одна из вершин которого имеет минимальный индекс &amp;lt;math&amp;gt;\min(i,j,l,m)&amp;lt;/math&amp;gt;, если эти два ребра выходят из одной вершины, индекс которой является минимальным (например, &amp;lt;math&amp;gt;i=l&amp;lt;/math&amp;gt; ), то выбирается ребро, вершина которого имеет наименьший индекс из двух других вершин &amp;lt;math&amp;gt;\min(j,m)&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;
Масштабируемость алгоритма Прима исследована на параллельной версии, представленной в [http://portal.tpu.ru/SHARED/a/AXOENOWSW/Publications_rus/Tab3/Tab/Гергель%20В.П.%20-%20Высокопроизводит.pdf книге]. При помощи директив OpenMP алгоритм распараллеливался по ядрам. В данном источнике представлены результаты экспериментов при использовании 2 и 4 вычислительных ядер и изменении объёма входных данных от 100 до 1000. Эксперименты проводились на двухпроцессорном вычислительном узле на базе четырехядерных процессоров Intel Xeon E5320, 1.86 ГГц, 4 Гб RAM под управлением операционной системы Microsoft Windows HPC Server 2008. Разработка программ проводилась в среде Microsoft Visual Studio 2008, для компиляции использовался Intel C++ Compiler 10.0 for Windows.  &lt;br /&gt;
&lt;br /&gt;
[[Файл:2017-02-08_06-56-11.png|border|мини|центр|1000px|Результаты вычислительных экспериментов для параллельного алгоритма Прима (при использовании двух и четырех вычислительных ядер) ]]&lt;br /&gt;
&lt;br /&gt;
Из графика видно, что время выполнения увеличивается при увеличении объёма входных данных, но уменьшается при увеличении вычислительных ядер.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*[https://github.com/jakevdp/mst_clustering Python: MST Clustering]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_62_0/libs/graph_parallel/doc/html/index.html С++: Parallel boost graph library]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_53_0/libs/graph_parallel/doc/html/dehne_gotz_min_spanning_tree.html C++: Minimum Spanning Tree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/PrimMinimumSpanningTree.html Java: JGraphT PrimMinimumSpanningTree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/KruskalMinimumSpanningTree.html Java: JGraphT  KruskalMinimumSpanningTree] &lt;br /&gt;
*[http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.sparse.csgraph.minimum_spanning_tree.html Python: SciPy]&lt;br /&gt;
*[https://networkx.github.io/documentation/networkx-1.10/reference/algorithms.mst.html Python: NetworkX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
# Нейский И.М. Классификация и сравнение методов кластеризации&lt;br /&gt;
# C. Kingsford. Minimum Spanning Trees &amp;amp; Clustering&lt;br /&gt;
# Y. Zhou et al. Clustering with Minimum Spanning Trees&lt;br /&gt;
# Gallager, Robert G, P A Humblet, and P M Spira. “A Distributed Algorithm for Minimum-Weight Spanning Trees.” ACM Transactions on Programming Languages and Systems 5, no. 1 (1983): 66–77. doi:10.1145/357195.357200.&lt;br /&gt;
# Gafni, Eli. “Improvements in the Time Complexity of Two Message-Optimal Election Algorithms,” 175–85, New York, New York, USA: ACM Press, 1985. doi:10.1145/323596.323612.&lt;br /&gt;
# Awerbuch, B. “Optimal Distributed Algorithms for Minimum Weight Spanning Tree, Counting, Leader Election, and Related Problems,” 230–40, New York, New York, USA: ACM Press, 1987. doi:10.1145/28395.28421.&lt;br /&gt;
# Гергель В.П. Высокопроизводительные вычисления для многоядерных многопроцессорных систем&lt;/div&gt;</summary>
		<author><name>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22447</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22447"/>
		<updated>2017-02-08T04:09:05Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (&amp;lt;math&amp;gt;MST&amp;lt;/math&amp;gt;):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 \log N) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Отсюда следует, что вычислительным ядром алгоритма является этап построения минимального покрывающего дерева, поскольку он имеет наибольшую сложность.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктура алгоритма описана в пункте 1.3. &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;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {}     //множество ребер минимального остовного дерева объявляется пустым&lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;     //расстояние до построенного дерева объявляется максимальным&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;     //вершина не имеет предков из построенного дерева&lt;br /&gt;
 &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;     //включаем вершину с номером 1 в дерево&lt;br /&gt;
 &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt;     //записываем в очередь множество всех вершин&lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt;     //извлекаем из очереди вершину с минимальным расстоянием до построенного дерева &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;     //добавляем выбранное ребро в дерево&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 \log N) + O(N) = O(N^2 \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; множество объектов &amp;lt;math&amp;gt;x = (x_1,...,x_N)&amp;lt;/math&amp;gt;. Объём &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; множество кластеров &amp;lt;math&amp;gt;Clust = (Clust_1,...,Clust_K)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Clust_i = (x_{i,1},..., x_{i, N_i}), x_{i, l} \ne x_{j, m}, i \ne j, \forall l&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;m, \sum_{i=1}^K {N_i} = N &amp;lt;/math&amp;gt;. Объём &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм останавливается за конечное число шагов, поскольку на каждом шаге становится по крайней мере на один фрагмент меньше.&lt;br /&gt;
* Число фрагментов на каждом шаге уменьшается как минимум вдвое, так что общее число шагов составляет не более &amp;lt;math&amp;gt;\log_2 N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Соотношение последовательной и параллельной сложности: &amp;lt;math&amp;gt; \frac{N^2 \log N} {N \log N} = N &amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность: &amp;lt;math&amp;gt; \frac {N^2 \log N} {N}   = N \log N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Алгоритм детерминирован. Если случается, что имеются два ребра &amp;lt;math&amp;gt;(x_i,x_j)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(x_l,x_m)&amp;lt;/math&amp;gt;, такие что &amp;lt;math&amp;gt;d(x_i,x_j) = d(x_l,x_m)&amp;lt;/math&amp;gt;, то алгоритм должен выбрать ребро, одна из вершин которого имеет минимальный индекс &amp;lt;math&amp;gt;\min(i,j,l,m)&amp;lt;/math&amp;gt;, если эти два ребра выходят из одной вершины, индекс которой является минимальным (например, &amp;lt;math&amp;gt;i=l&amp;lt;/math&amp;gt; ), то выбирается ребро, вершина которого имеет наименьший индекс из двух других вершин &amp;lt;math&amp;gt;\min(j,m)&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;
Масштабируемость алгоритма Прима исследована на параллельной версии, представленной в [http://portal.tpu.ru/SHARED/a/AXOENOWSW/Publications_rus/Tab3/Tab/Гергель%20В.П.%20-%20Высокопроизводит.pdf книге]. При помощи директив OpenMP алгоритм распараллеливался по ядрам. В данном источнике представлены результаты экспериментов при использовании 2 и 4 вычислительных ядер и изменении объёма входных данных от 100 до 1000. Эксперименты проводились на двухпроцессорном вычислительном узле на базе четырехядерных процессоров Intel Xeon E5320, 1.86 ГГц, 4 Гб RAM под управлением операционной системы Microsoft Windows HPC Server 2008. Разработка программ проводилась в среде Microsoft Visual Studio 2008, для компиляции использовался Intel C++ Compiler 10.0 for Windows.  &lt;br /&gt;
&lt;br /&gt;
[[Файл:2017-02-08_06-56-11.png|border|мини|центр|1000px|Результаты вычислительных экспериментов для параллельного алгоритма Прима (при использовании двух и четырех вычислительных ядер) ]]&lt;br /&gt;
&lt;br /&gt;
Из графика видно, что время выполнения увеличивается при увеличении объёма входных данных, но уменьшается при увеличении вычислительных ядер.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*[https://github.com/jakevdp/mst_clustering Python: MST Clustering]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_62_0/libs/graph_parallel/doc/html/index.html С++: Parallel boost graph library]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_53_0/libs/graph_parallel/doc/html/dehne_gotz_min_spanning_tree.html C++: Minimum Spanning Tree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/PrimMinimumSpanningTree.html Java: JGraphT PrimMinimumSpanningTree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/KruskalMinimumSpanningTree.html Java: JGraphT  KruskalMinimumSpanningTree] &lt;br /&gt;
*[http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.sparse.csgraph.minimum_spanning_tree.html Python: SciPy]&lt;br /&gt;
*[https://networkx.github.io/documentation/networkx-1.10/reference/algorithms.mst.html Python: NetworkX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
# Нейский И.М. Классификация и сравнение методов кластеризации&lt;br /&gt;
# C. Kingsford. Minimum Spanning Trees &amp;amp; Clustering&lt;br /&gt;
# Y. Zhou et al. Clustering with Minimum Spanning Trees&lt;br /&gt;
# Gallager, Robert G, P A Humblet, and P M Spira. “A Distributed Algorithm for Minimum-Weight Spanning Trees.” ACM Transactions on Programming Languages and Systems 5, no. 1 (1983): 66–77. doi:10.1145/357195.357200.&lt;br /&gt;
# Gafni, Eli. “Improvements in the Time Complexity of Two Message-Optimal Election Algorithms,” 175–85, New York, New York, USA: ACM Press, 1985. doi:10.1145/323596.323612.&lt;br /&gt;
# Awerbuch, B. “Optimal Distributed Algorithms for Minimum Weight Spanning Tree, Counting, Leader Election, and Related Problems,” 230–40, New York, New York, USA: ACM Press, 1987. doi:10.1145/28395.28421.&lt;/div&gt;</summary>
		<author><name>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22446</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22446"/>
		<updated>2017-02-08T03:33:22Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (&amp;lt;math&amp;gt;MST&amp;lt;/math&amp;gt;):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 \log N) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Отсюда следует, что вычислительным ядром алгоритма является этап построения минимального покрывающего дерева, поскольку он имеет наибольшую сложность.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктура алгоритма описана в пункте 1.3. &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;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {}     //множество ребер минимального остовного дерева объявляется пустым&lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;     //расстояние до построенного дерева объявляется максимальным&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;     //вершина не имеет предков из построенного дерева&lt;br /&gt;
 &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;     //включаем вершину с номером 1 в дерево&lt;br /&gt;
 &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt;     //записываем в очередь множество всех вершин&lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt;     //извлекаем из очереди вершину с минимальным расстоянием до построенного дерева &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;     //добавляем выбранное ребро в дерево&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 \log N) + O(N) = O(N^2 \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; множество объектов &amp;lt;math&amp;gt;x = (x_1,...,x_N)&amp;lt;/math&amp;gt;. Объём &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; множество кластеров &amp;lt;math&amp;gt;Clust = (Clust_1,...,Clust_K)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Clust_i = (x_{i,1},..., x_{i, N_i}), x_{i, l} \ne x_{j, m}, i \ne j, \forall l&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;m, \sum_{i=1}^K {N_i} = N &amp;lt;/math&amp;gt;. Объём &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм останавливается за конечное число шагов, поскольку на каждом шаге становится по крайней мере на один фрагмент меньше.&lt;br /&gt;
* Число фрагментов на каждом шаге уменьшается как минимум вдвое, так что общее число шагов составляет не более &amp;lt;math&amp;gt;\log_2 N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Соотношение последовательной и параллельной сложности: &amp;lt;math&amp;gt; \frac{N^2 \log N} {N \log N} = N &amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность: &amp;lt;math&amp;gt; \frac {N^2 \log N} {N}   = N \log N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Алгоритм детерминирован. Если случается, что имеются два ребра &amp;lt;math&amp;gt;(x_i,x_j)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(x_l,x_m)&amp;lt;/math&amp;gt;, такие что &amp;lt;math&amp;gt;d(x_i,x_j) = d(x_l,x_m)&amp;lt;/math&amp;gt;, то алгоритм должен выбрать ребро, одна из вершин которого имеет минимальный индекс &amp;lt;math&amp;gt;\min(i,j,l,m)&amp;lt;/math&amp;gt;, если эти два ребра выходят из одной вершины, индекс которой является минимальным (например, &amp;lt;math&amp;gt;i=l&amp;lt;/math&amp;gt; ), то выбирается ребро, вершина которого имеет наименьший индекс из двух других вершин &amp;lt;math&amp;gt;\min(j,m)&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;
[[Файл:2017-02-08_06-22-13.png|border|мини|центр|1000px|Время работы параллельного алгоритма Прима в зависимости от числа потоков и объёма входных данных]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*[https://github.com/jakevdp/mst_clustering Python: MST Clustering]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_62_0/libs/graph_parallel/doc/html/index.html С++: Parallel boost graph library]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_53_0/libs/graph_parallel/doc/html/dehne_gotz_min_spanning_tree.html C++: Minimum Spanning Tree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/PrimMinimumSpanningTree.html Java: JGraphT PrimMinimumSpanningTree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/KruskalMinimumSpanningTree.html Java: JGraphT  KruskalMinimumSpanningTree] &lt;br /&gt;
*[http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.sparse.csgraph.minimum_spanning_tree.html Python: SciPy]&lt;br /&gt;
*[https://networkx.github.io/documentation/networkx-1.10/reference/algorithms.mst.html Python: NetworkX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
# Нейский И.М. Классификация и сравнение методов кластеризации&lt;br /&gt;
# C. Kingsford. Minimum Spanning Trees &amp;amp; Clustering&lt;br /&gt;
# Y. Zhou et al. Clustering with Minimum Spanning Trees&lt;br /&gt;
# Gallager, Robert G, P A Humblet, and P M Spira. “A Distributed Algorithm for Minimum-Weight Spanning Trees.” ACM Transactions on Programming Languages and Systems 5, no. 1 (1983): 66–77. doi:10.1145/357195.357200.&lt;br /&gt;
# Gafni, Eli. “Improvements in the Time Complexity of Two Message-Optimal Election Algorithms,” 175–85, New York, New York, USA: ACM Press, 1985. doi:10.1145/323596.323612.&lt;br /&gt;
# Awerbuch, B. “Optimal Distributed Algorithms for Minimum Weight Spanning Tree, Counting, Leader Election, and Related Problems,” 230–40, New York, New York, USA: ACM Press, 1987. doi:10.1145/28395.28421.&lt;/div&gt;</summary>
		<author><name>Dmarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Dmarkin&amp;diff=22409</id>
		<title>Обсуждение участника:Dmarkin</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Dmarkin&amp;diff=22409"/>
		<updated>2017-02-07T12:37:50Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Замечания по тексту */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве]] ==&lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:28, 6 февраля 2017 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:28, 6 февраля 2017 (MSK) .  Исправил.&lt;br /&gt;
* В разделе 1.5 кроме псевдокода нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:28, 6 февраля 2017 (MSK) .   Исправил&lt;br /&gt;
* В разделе 1.9 должны быть оценки объёмов входных и выходных данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:28, 6 февраля 2017 (MSK) .  Исправил&lt;/div&gt;</summary>
		<author><name>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22408</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22408"/>
		<updated>2017-02-07T12:37:15Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (&amp;lt;math&amp;gt;MST&amp;lt;/math&amp;gt;):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 \log N) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Отсюда следует, что вычислительным ядром алгоритма является этап построения минимального покрывающего дерева, поскольку он имеет наибольшую сложность.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Макроструктура алгоритма описана в пункте 1.3. &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;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {}     //множество ребер минимального остовного дерева объявляется пустым&lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;     //расстояние до построенного дерева объявляется максимальным&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;     //вершина не имеет предков из построенного дерева&lt;br /&gt;
 &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;     //включаем вершину с номером 1 в дерево&lt;br /&gt;
 &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt;     //записываем в очередь множество всех вершин&lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt;     //извлекаем из очереди вершину с минимальным расстоянием до построенного дерева &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;     //добавляем выбранное ребро в дерево&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 \log N) + O(N) = O(N^2 \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; множество объектов &amp;lt;math&amp;gt;x = (x_1,...,x_N)&amp;lt;/math&amp;gt;. Объём &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; множество кластеров &amp;lt;math&amp;gt;Clust = (Clust_1,...,Clust_K)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Clust_i = (x_{i,1},..., x_{i, N_i}), x_{i, l} \ne x_{j, m}, i \ne j, \forall l&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;m, \sum_{i=1}^K {N_i} = N &amp;lt;/math&amp;gt;. Объём &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм останавливается за конечное число шагов, поскольку на каждом шаге становится по крайней мере на один фрагмент меньше.&lt;br /&gt;
* Число фрагментов на каждом шаге уменьшается как минимум вдвое, так что общее число шагов составляет не более &amp;lt;math&amp;gt;\log_2 N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Соотношение последовательной и параллельной сложности: &amp;lt;math&amp;gt; \frac{N^2 \log N} {N \log N} = N &amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность: &amp;lt;math&amp;gt; \frac {N^2 \log N} {N}   = N \log N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Алгоритм детерминирован. Если случается, что имеются два ребра &amp;lt;math&amp;gt;(x_i,x_j)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(x_l,x_m)&amp;lt;/math&amp;gt;, такие что &amp;lt;math&amp;gt;d(x_i,x_j) = d(x_l,x_m)&amp;lt;/math&amp;gt;, то алгоритм должен выбрать ребро, одна из вершин которого имеет минимальный индекс &amp;lt;math&amp;gt;\min(i,j,l,m)&amp;lt;/math&amp;gt;, если эти два ребра выходят из одной вершины, индекс которой является минимальным (например, &amp;lt;math&amp;gt;i=l&amp;lt;/math&amp;gt; ), то выбирается ребро, вершина которого имеет наименьший индекс из двух других вершин &amp;lt;math&amp;gt;\min(j,m)&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;
*[https://github.com/jakevdp/mst_clustering Python: MST Clustering]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_62_0/libs/graph_parallel/doc/html/index.html С++: Parallel boost graph library]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_53_0/libs/graph_parallel/doc/html/dehne_gotz_min_spanning_tree.html C++: Minimum Spanning Tree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/PrimMinimumSpanningTree.html Java: JGraphT PrimMinimumSpanningTree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/KruskalMinimumSpanningTree.html Java: JGraphT  KruskalMinimumSpanningTree] &lt;br /&gt;
*[http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.sparse.csgraph.minimum_spanning_tree.html Python: SciPy]&lt;br /&gt;
*[https://networkx.github.io/documentation/networkx-1.10/reference/algorithms.mst.html Python: NetworkX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
# Нейский И.М. Классификация и сравнение методов кластеризации&lt;br /&gt;
# C. Kingsford. Minimum Spanning Trees &amp;amp; Clustering&lt;br /&gt;
# Y. Zhou et al. Clustering with Minimum Spanning Trees&lt;br /&gt;
# Gallager, Robert G, P A Humblet, and P M Spira. “A Distributed Algorithm for Minimum-Weight Spanning Trees.” ACM Transactions on Programming Languages and Systems 5, no. 1 (1983): 66–77. doi:10.1145/357195.357200.&lt;br /&gt;
# Gafni, Eli. “Improvements in the Time Complexity of Two Message-Optimal Election Algorithms,” 175–85, New York, New York, USA: ACM Press, 1985. doi:10.1145/323596.323612.&lt;br /&gt;
# Awerbuch, B. “Optimal Distributed Algorithms for Minimum Weight Spanning Tree, Counting, Leader Election, and Related Problems,” 230–40, New York, New York, USA: ACM Press, 1987. doi:10.1145/28395.28421.&lt;/div&gt;</summary>
		<author><name>Dmarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Dmarkin&amp;diff=22405</id>
		<title>Обсуждение участника:Dmarkin</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Dmarkin&amp;diff=22405"/>
		<updated>2017-02-07T12:26:56Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Замечания по тексту */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве]] ==&lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:28, 6 февраля 2017 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:28, 6 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 1.5 кроме псевдокода нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:28, 6 февраля 2017 (MSK) .   Исправил&lt;br /&gt;
* В разделе 1.9 должны быть оценки объёмов входных и выходных данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:28, 6 февраля 2017 (MSK) .  Исправил&lt;/div&gt;</summary>
		<author><name>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22404</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22404"/>
		<updated>2017-02-07T12:25:50Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Псевдокод */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (&amp;lt;math&amp;gt;MST&amp;lt;/math&amp;gt;):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 \log N) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {}     //множество ребер минимального остовного дерева объявляется пустым&lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;     //расстояние до построенного дерева объявляется максимальным&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;     //вершина не имеет предков из построенного дерева&lt;br /&gt;
 &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;     //включаем вершину с номером 1 в дерево&lt;br /&gt;
 &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt;     //записываем в очередь множество всех вершин&lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt;     //извлекаем из очереди вершину с минимальным расстоянием до построенного дерева &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;     //добавляем выбранное ребро в дерево&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 \log N) + O(N) = O(N^2 \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; множество объектов &amp;lt;math&amp;gt;x = (x_1,...,x_N)&amp;lt;/math&amp;gt;. Объём &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; множество кластеров &amp;lt;math&amp;gt;Clust = (Clust_1,...,Clust_K)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Clust_i = (x_{i,1},..., x_{i, N_i}), x_{i, l} \ne x_{j, m}, i \ne j, \forall l&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;m, \sum_{i=1}^K {N_i} = N &amp;lt;/math&amp;gt;. Объём &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм останавливается за конечное число шагов, поскольку на каждом шаге становится по крайней мере на один фрагмент меньше.&lt;br /&gt;
* Число фрагментов на каждом шаге уменьшается как минимум вдвое, так что общее число шагов составляет не более &amp;lt;math&amp;gt;\log_2 N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Соотношение последовательной и параллельной сложности: &amp;lt;math&amp;gt; \frac{N^2 \log N} {N \log N} = N &amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность: &amp;lt;math&amp;gt; \frac {N^2 \log N} {N}   = N \log N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Алгоритм детерминирован. Если случается, что имеются два ребра &amp;lt;math&amp;gt;(x_i,x_j)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(x_l,x_m)&amp;lt;/math&amp;gt;, такие что &amp;lt;math&amp;gt;d(x_i,x_j) = d(x_l,x_m)&amp;lt;/math&amp;gt;, то алгоритм должен выбрать ребро, одна из вершин которого имеет минимальный индекс &amp;lt;math&amp;gt;\min(i,j,l,m)&amp;lt;/math&amp;gt;, если эти два ребра выходят из одной вершины, индекс которой является минимальным (например, &amp;lt;math&amp;gt;i=l&amp;lt;/math&amp;gt; ), то выбирается ребро, вершина которого имеет наименьший индекс из двух других вершин &amp;lt;math&amp;gt;\min(j,m)&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;
*[https://github.com/jakevdp/mst_clustering Python: MST Clustering]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_62_0/libs/graph_parallel/doc/html/index.html С++: Parallel boost graph library]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_53_0/libs/graph_parallel/doc/html/dehne_gotz_min_spanning_tree.html C++: Minimum Spanning Tree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/PrimMinimumSpanningTree.html Java: JGraphT PrimMinimumSpanningTree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/KruskalMinimumSpanningTree.html Java: JGraphT  KruskalMinimumSpanningTree] &lt;br /&gt;
*[http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.sparse.csgraph.minimum_spanning_tree.html Python: SciPy]&lt;br /&gt;
*[https://networkx.github.io/documentation/networkx-1.10/reference/algorithms.mst.html Python: NetworkX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
# Нейский И.М. Классификация и сравнение методов кластеризации&lt;br /&gt;
# C. Kingsford. Minimum Spanning Trees &amp;amp; Clustering&lt;br /&gt;
# Y. Zhou et al. Clustering with Minimum Spanning Trees&lt;br /&gt;
# Gallager, Robert G, P A Humblet, and P M Spira. “A Distributed Algorithm for Minimum-Weight Spanning Trees.” ACM Transactions on Programming Languages and Systems 5, no. 1 (1983): 66–77. doi:10.1145/357195.357200.&lt;br /&gt;
# Gafni, Eli. “Improvements in the Time Complexity of Two Message-Optimal Election Algorithms,” 175–85, New York, New York, USA: ACM Press, 1985. doi:10.1145/323596.323612.&lt;br /&gt;
# Awerbuch, B. “Optimal Distributed Algorithms for Minimum Weight Spanning Tree, Counting, Leader Election, and Related Problems,” 230–40, New York, New York, USA: ACM Press, 1987. doi:10.1145/28395.28421.&lt;/div&gt;</summary>
		<author><name>Dmarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Dmarkin&amp;diff=22391</id>
		<title>Обсуждение участника:Dmarkin</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Dmarkin&amp;diff=22391"/>
		<updated>2017-02-07T11:36:47Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Замечания по тексту */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве]] ==&lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:28, 6 февраля 2017 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:28, 6 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 1.5 кроме псевдокода нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:28, 6 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 1.9 должны быть оценки объёмов входных и выходных данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:28, 6 февраля 2017 (MSK) .  Исправил&lt;/div&gt;</summary>
		<author><name>Dmarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Dmarkin&amp;diff=22390</id>
		<title>Обсуждение участника:Dmarkin</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Dmarkin&amp;diff=22390"/>
		<updated>2017-02-07T11:36:24Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Замечания по тексту */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве]] ==&lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:28, 6 февраля 2017 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:28, 6 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 1.5 кроме псевдокода нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:28, 6 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 1.9 должны быть оценки объёмов входных и выходных данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:28, 6 февраля 2017 (MSK)&lt;br /&gt;
Исправил&lt;/div&gt;</summary>
		<author><name>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22389</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22389"/>
		<updated>2017-02-07T11:35:28Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (&amp;lt;math&amp;gt;MST&amp;lt;/math&amp;gt;):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 \log N) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 \log N) + O(N) = O(N^2 \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; множество объектов &amp;lt;math&amp;gt;x = (x_1,...,x_N)&amp;lt;/math&amp;gt;. Объём &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; множество кластеров &amp;lt;math&amp;gt;Clust = (Clust_1,...,Clust_K)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Clust_i = (x_{i,1},..., x_{i, N_i}), x_{i, l} \ne x_{j, m}, i \ne j, \forall l&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;m, \sum_{i=1}^K {N_i} = N &amp;lt;/math&amp;gt;. Объём &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм останавливается за конечное число шагов, поскольку на каждом шаге становится по крайней мере на один фрагмент меньше.&lt;br /&gt;
* Число фрагментов на каждом шаге уменьшается как минимум вдвое, так что общее число шагов составляет не более &amp;lt;math&amp;gt;\log_2 N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Соотношение последовательной и параллельной сложности: &amp;lt;math&amp;gt; \frac{N^2 \log N} {N \log N} = N &amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность: &amp;lt;math&amp;gt; \frac {N^2 \log N} {N}   = N \log N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Алгоритм детерминирован. Если случается, что имеются два ребра &amp;lt;math&amp;gt;(x_i,x_j)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(x_l,x_m)&amp;lt;/math&amp;gt;, такие что &amp;lt;math&amp;gt;d(x_i,x_j) = d(x_l,x_m)&amp;lt;/math&amp;gt;, то алгоритм должен выбрать ребро, одна из вершин которого имеет минимальный индекс &amp;lt;math&amp;gt;\min(i,j,l,m)&amp;lt;/math&amp;gt;, если эти два ребра выходят из одной вершины, индекс которой является минимальным (например, &amp;lt;math&amp;gt;i=l&amp;lt;/math&amp;gt; ), то выбирается ребро, вершина которого имеет наименьший индекс из двух других вершин &amp;lt;math&amp;gt;\min(j,m)&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;
*[https://github.com/jakevdp/mst_clustering Python: MST Clustering]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_62_0/libs/graph_parallel/doc/html/index.html С++: Parallel boost graph library]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_53_0/libs/graph_parallel/doc/html/dehne_gotz_min_spanning_tree.html C++: Minimum Spanning Tree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/PrimMinimumSpanningTree.html Java: JGraphT PrimMinimumSpanningTree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/KruskalMinimumSpanningTree.html Java: JGraphT  KruskalMinimumSpanningTree] &lt;br /&gt;
*[http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.sparse.csgraph.minimum_spanning_tree.html Python: SciPy]&lt;br /&gt;
*[https://networkx.github.io/documentation/networkx-1.10/reference/algorithms.mst.html Python: NetworkX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
# Нейский И.М. Классификация и сравнение методов кластеризации&lt;br /&gt;
# C. Kingsford. Minimum Spanning Trees &amp;amp; Clustering&lt;br /&gt;
# Y. Zhou et al. Clustering with Minimum Spanning Trees&lt;br /&gt;
# Gallager, Robert G, P A Humblet, and P M Spira. “A Distributed Algorithm for Minimum-Weight Spanning Trees.” ACM Transactions on Programming Languages and Systems 5, no. 1 (1983): 66–77. doi:10.1145/357195.357200.&lt;br /&gt;
# Gafni, Eli. “Improvements in the Time Complexity of Two Message-Optimal Election Algorithms,” 175–85, New York, New York, USA: ACM Press, 1985. doi:10.1145/323596.323612.&lt;br /&gt;
# Awerbuch, B. “Optimal Distributed Algorithms for Minimum Weight Spanning Tree, Counting, Leader Election, and Related Problems,” 230–40, New York, New York, USA: ACM Press, 1987. doi:10.1145/28395.28421.&lt;/div&gt;</summary>
		<author><name>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22132</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22132"/>
		<updated>2017-02-04T16:49:07Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (&amp;lt;math&amp;gt;MST&amp;lt;/math&amp;gt;):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 \log N) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 \log N) + O(N) = O(N^2 \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: множество объектов &amp;lt;math&amp;gt;x = (x_1,...,x_N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: множество кластеров &amp;lt;math&amp;gt;Clust = (Clust_1,...,Clust_K)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Clust_i = (x_{i,1},..., x_{i, N_i}), x_{i, l} \ne x_{j, m}, i \ne j, \forall l&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;m, \sum_{i=1}^K {N_i} = N &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм останавливается за конечное число шагов, поскольку на каждом шаге становится по крайней мере на один фрагмент меньше.&lt;br /&gt;
* Число фрагментов на каждом шаге уменьшается как минимум вдвое, так что общее число шагов составляет не более &amp;lt;math&amp;gt;\log_2 N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Соотношение последовательной и параллельной сложности: &amp;lt;math&amp;gt; \frac{N^2 \log N} {N \log N} = N &amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность: &amp;lt;math&amp;gt; \frac {N^2 \log N} {N}   = N \log N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Алгоритм детерминирован. Если случается, что имеются два ребра &amp;lt;math&amp;gt;(x_i,x_j)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(x_l,x_m)&amp;lt;/math&amp;gt;, такие что &amp;lt;math&amp;gt;d(x_i,x_j) = d(x_l,x_m)&amp;lt;/math&amp;gt;, то алгоритм должен выбрать ребро, одна из вершин которого имеет минимальный индекс &amp;lt;math&amp;gt;\min(i,j,l,m)&amp;lt;/math&amp;gt;, если эти два ребра выходят из одной вершины, индекс которой является минимальным (например, &amp;lt;math&amp;gt;i=l&amp;lt;/math&amp;gt; ), то выбирается ребро, вершина которого имеет наименьший индекс из двух других вершин &amp;lt;math&amp;gt;\min(j,m)&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;
*[https://github.com/jakevdp/mst_clustering Python: MST Clustering]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_62_0/libs/graph_parallel/doc/html/index.html С++: Parallel boost graph library]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_53_0/libs/graph_parallel/doc/html/dehne_gotz_min_spanning_tree.html C++: Minimum Spanning Tree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/PrimMinimumSpanningTree.html Java: JGraphT PrimMinimumSpanningTree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/KruskalMinimumSpanningTree.html Java: JGraphT  KruskalMinimumSpanningTree] &lt;br /&gt;
*[http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.sparse.csgraph.minimum_spanning_tree.html Python: SciPy]&lt;br /&gt;
*[https://networkx.github.io/documentation/networkx-1.10/reference/algorithms.mst.html Python: NetworkX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
# Нейский И.М. Классификация и сравнение методов кластеризации&lt;br /&gt;
# C. Kingsford. Minimum Spanning Trees &amp;amp; Clustering&lt;br /&gt;
# Y. Zhou et al. Clustering with Minimum Spanning Trees&lt;br /&gt;
# Gallager, Robert G, P A Humblet, and P M Spira. “A Distributed Algorithm for Minimum-Weight Spanning Trees.” ACM Transactions on Programming Languages and Systems 5, no. 1 (1983): 66–77. doi:10.1145/357195.357200.&lt;br /&gt;
# Gafni, Eli. “Improvements in the Time Complexity of Two Message-Optimal Election Algorithms,” 175–85, New York, New York, USA: ACM Press, 1985. doi:10.1145/323596.323612.&lt;br /&gt;
# Awerbuch, B. “Optimal Distributed Algorithms for Minimum Weight Spanning Tree, Counting, Leader Election, and Related Problems,” 230–40, New York, New York, USA: ACM Press, 1987. doi:10.1145/28395.28421.&lt;/div&gt;</summary>
		<author><name>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22130</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22130"/>
		<updated>2017-02-04T16:32:30Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (&amp;lt;math&amp;gt;MST&amp;lt;/math&amp;gt;):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 \log N) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 \log N) + O(N) = O(N^2 \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: множество объектов &amp;lt;math&amp;gt;x = (x_1,...,x_N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: множество кластеров &amp;lt;math&amp;gt;Clust = (Clust_1,...,Clust_K)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Clust_i = (x_{i,1},..., x_{i, N_i}), x_{i, l} \ne x_{j, m}, i \ne j, \forall l&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;m, \sum_{i=1}^K {N_i} = N &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм останавливается за конечное число шагов, поскольку на каждом шаге становится по крайней мере на один фрагмент меньше.&lt;br /&gt;
* Число фрагментов на каждом шаге уменьшается как минимум вдвое, так что общее число шагов составляет не более &amp;lt;math&amp;gt;\log_2 N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Соотношение последовательной и параллельной сложности: &amp;lt;math&amp;gt; \frac{N^2 \log N} {N \log N} = N &amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность: &amp;lt;math&amp;gt; \frac {N^2 \log N} {N}   = N \log N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Алгоритм детерминирован. Если случается, что имеются два ребра &amp;lt;math&amp;gt;(x_i,x_j)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;(x_l,x_m)&amp;lt;/math&amp;gt;, такие что &amp;lt;math&amp;gt;d(x_i,x_j) = d(x_l,x_m)&amp;lt;/math&amp;gt;, то алгоритм должен выбрать ребро, одна из вершин которого имеет минимальный индекс &amp;lt;math&amp;gt;\min(i,j,l,m)&amp;lt;/math&amp;gt;, если эти два ребра выходят из одной вершины, индекс которой является минимальным (например, &amp;lt;math&amp;gt;i=l&amp;lt;/math&amp;gt; ), то выбирается ребро, вершина которого имеет наименьший индекс из двух других вершин &amp;lt;math&amp;gt;\min(j,m)&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;
*[https://github.com/jakevdp/mst_clustering Python: MST Clustering]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_62_0/libs/graph_parallel/doc/html/index.html С++: Parallel boost graph library]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_53_0/libs/graph_parallel/doc/html/dehne_gotz_min_spanning_tree.html C++: Minimum Spanning Tree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/PrimMinimumSpanningTree.html Java: JGraphT PrimMinimumSpanningTree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/KruskalMinimumSpanningTree.html Java: JGraphT  KruskalMinimumSpanningTree] &lt;br /&gt;
*[http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.sparse.csgraph.minimum_spanning_tree.html Python: SciPy]&lt;br /&gt;
*[https://networkx.github.io/documentation/networkx-1.10/reference/algorithms.mst.html Python: NetworkX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
# Нейский И.М. Классификация и сравнение методов кластеризации&lt;br /&gt;
# C. Kingsford. Minimum Spanning Trees &amp;amp; Clustering&lt;br /&gt;
# Y. Zhou et al. Clustering with Minimum Spanning Trees&lt;br /&gt;
# Gallager, Robert G, P A Humblet, and P M Spira. “A Distributed Algorithm for Minimum-Weight Spanning Trees.” ACM Transactions on Programming Languages and Systems 5, no. 1 (1983): 66–77. doi:10.1145/357195.357200.&lt;br /&gt;
# Gafni, Eli. “Improvements in the Time Complexity of Two Message-Optimal Election Algorithms,” 175–85, New York, New York, USA: ACM Press, 1985. doi:10.1145/323596.323612.&lt;br /&gt;
# Awerbuch, B. “Optimal Distributed Algorithms for Minimum Weight Spanning Tree, Counting, Leader Election, and Related Problems,” 230–40, New York, New York, USA: ACM Press, 1987. doi:10.1145/28395.28421.&lt;/div&gt;</summary>
		<author><name>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22060</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22060"/>
		<updated>2017-02-03T12:45:34Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (&amp;lt;math&amp;gt;MST&amp;lt;/math&amp;gt;):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 \log N) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 \log N) + O(N) = O(N^2 \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: множество объектов &amp;lt;math&amp;gt;x = (x_1,...,x_N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: множество кластеров &amp;lt;math&amp;gt;Clust = (Clust_1,...,Clust_K)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Clust_i = (x_{i,1},..., x_{i, N_i}), x_{i, l} \ne x_{j, m}, i \ne j, \forall l&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;m, \sum_{i=1}^K {N_i} = N &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;
*[https://github.com/jakevdp/mst_clustering Python: MST Clustering]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_62_0/libs/graph_parallel/doc/html/index.html С++: Parallel boost graph library]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_53_0/libs/graph_parallel/doc/html/dehne_gotz_min_spanning_tree.html C++: Minimum Spanning Tree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/PrimMinimumSpanningTree.html Java: JGraphT PrimMinimumSpanningTree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/KruskalMinimumSpanningTree.html Java: JGraphT  KruskalMinimumSpanningTree] &lt;br /&gt;
*[http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.sparse.csgraph.minimum_spanning_tree.html Python: SciPy]&lt;br /&gt;
*[https://networkx.github.io/documentation/networkx-1.10/reference/algorithms.mst.html Python: NetworkX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
# Нейский И.М. Классификация и сравнение методов кластеризации&lt;br /&gt;
# C. Kingsford. Minimum Spanning Trees &amp;amp; Clustering&lt;br /&gt;
# Y. Zhou et al. Clustering with Minimum Spanning Trees&lt;br /&gt;
# Gallager, Robert G, P A Humblet, and P M Spira. “A Distributed Algorithm for Minimum-Weight Spanning Trees.” ACM Transactions on Programming Languages and Systems 5, no. 1 (1983): 66–77. doi:10.1145/357195.357200.&lt;br /&gt;
# Gafni, Eli. “Improvements in the Time Complexity of Two Message-Optimal Election Algorithms,” 175–85, New York, New York, USA: ACM Press, 1985. doi:10.1145/323596.323612.&lt;br /&gt;
# Awerbuch, B. “Optimal Distributed Algorithms for Minimum Weight Spanning Tree, Counting, Leader Election, and Related Problems,” 230–40, New York, New York, USA: ACM Press, 1987. doi:10.1145/28395.28421.&lt;/div&gt;</summary>
		<author><name>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22057</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22057"/>
		<updated>2017-02-03T12:36:08Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (&amp;lt;math&amp;gt;MST&amp;lt;/math&amp;gt;):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 \log N) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 \log N) + O(N) = O(N^2 \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: множество объектов &amp;lt;math&amp;gt;x = (x_1,...,x_N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: множество кластеров &amp;lt;math&amp;gt;Clust = (Clust_1,...,Clust_K)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Clust_i = (x_{i,1},..., x_{i, N_i}), x_{i, l} \ne x_{j, m}, i \ne j, \forall l&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;m, \sum_{i=1}^K {N_i} = N &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;
*[https://github.com/jakevdp/mst_clustering Python: MST Clustering]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_62_0/libs/graph_parallel/doc/html/index.html С++: Parallel boost graph library]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_53_0/libs/graph_parallel/doc/html/dehne_gotz_min_spanning_tree.html C++: Minimum Spanning Tree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/PrimMinimumSpanningTree.html Java: JGraphT PrimMinimumSpanningTree]&lt;br /&gt;
*[http://jgrapht.org/javadoc/org/jgrapht/alg/KruskalMinimumSpanningTree.html Java: JGraphT  KruskalMinimumSpanningTree] &lt;br /&gt;
*[http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.sparse.csgraph.minimum_spanning_tree.html Python: SciPy]&lt;br /&gt;
*[https://networkx.github.io/documentation/networkx-1.10/reference/algorithms.mst.html Python: NetworkX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22054</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22054"/>
		<updated>2017-02-03T10:18:50Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (&amp;lt;math&amp;gt;MST&amp;lt;/math&amp;gt;):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 \log N) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 \log N) + O(N) = O(N^2 \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: множество объектов &amp;lt;math&amp;gt;x = (x_1,...,x_N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: множество кластеров &amp;lt;math&amp;gt;Clust = (Clust_1,...,Clust_K)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Clust_i = (x_{i,1},..., x_{i, N_i}), x_{i, l} \ne x_{j, m}, i \ne j, \forall l&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;m, \sum_{i=1}^K {N_i} = N &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;/div&gt;</summary>
		<author><name>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22053</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22053"/>
		<updated>2017-02-02T21:44:34Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (&amp;lt;math&amp;gt;MST&amp;lt;/math&amp;gt;):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 \log N) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 \log N) + O(N) = O(N^2 \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: множество объектов &amp;lt;math&amp;gt;x = (x_1,...,x_N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: множество кластеров &amp;lt;math&amp;gt;Clust = (Clust_1,...,Clust_K)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Clust_i = (x_{i,1},..., x_{i, n_i}), x_{i, l} \ne x_{j, m}, i \ne j, \forall l&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;m, \sum_{i=1}^K {n_i} = n &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;/div&gt;</summary>
		<author><name>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22052</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22052"/>
		<updated>2017-02-02T21:16:39Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (&amp;lt;math&amp;gt;MST&amp;lt;/math&amp;gt;):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 \log N) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 \log N) + O(N) = O(N^2 \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22051</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22051"/>
		<updated>2017-02-02T21:16:08Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 \log N) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 \log N) + O(N) = O(N^2 \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22050</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22050"/>
		<updated>2017-02-02T21:15:35Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 \log N) + O(N) = O(N^2 \log N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22049</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22049"/>
		<updated>2017-02-02T21:14:54Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 log(N)) + O(N) = O(N^2 log(N))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22048</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22048"/>
		<updated>2017-02-02T21:12:41Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 log(N)) + O(N) = O(N^2 log(N))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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;
Существуют распределённые алгоритмы построения минимального покрывающего дерева, имеющие асимптотическую параллельную сложность &amp;lt;math&amp;gt;O(N*log(N))&amp;lt;/math&amp;gt;. Например, &#039;&#039;&#039;[[Алгоритм GHS]]&#039;&#039;&#039; (Gallager, Humblet, Spira) является распределённым вариантом алгоритма Борувки. Последующие версии этого алгоритма имеют более низкую параллельную сложность.&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22009</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=22009"/>
		<updated>2017-02-01T19:28:49Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 log(N)) + O(N) = O(N^2 log(N))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим основные свойства задачи:&lt;br /&gt;
*&#039;&#039;&#039;Схлопывание фрагментов&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, а граф &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; получен из &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; склеиванием вершин, принадлежащих &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. Тогда объединение &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; и минимального остовного дерева графа &amp;lt;math&amp;gt;G&#039;&amp;lt;/math&amp;gt; даёт минимальное остовное дерево исходного графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&#039;&#039;&#039;Ассоциативность по рёбрам&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;MSF(E)&amp;lt;/math&amp;gt; – минимальный остовный лес графа с рёбрами &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. Тогда:&amp;lt;math&amp;gt;&lt;br /&gt;
        MSF(E_1 \cup E_2 \cup \dots \cup E_k) = MSF(MSF(E_1) \cup MSF(E_2) \cup \dots \cup MSF(E_k)).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Минимальное ребро фрагмента&#039;&#039;&#039;. Пусть &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; – фрагмент минимального остовного дерева и &amp;lt;math&amp;gt;e_F&amp;lt;/math&amp;gt; – ребро наименьшего веса, исходящее из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; (т.е. ровно один его конец является вершиной из &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;). Если ребро &amp;lt;math&amp;gt;e_F&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21890</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21890"/>
		<updated>2017-01-31T22:16:45Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 log(N)) + O(N) = O(N^2 log(N))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:15.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21787</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21787"/>
		<updated>2017-01-29T08:53:32Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 log(N)) + O(N) = O(N^2 log(N))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21786</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21786"/>
		<updated>2017-01-29T08:52:44Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 log(N)) + O(N) = O(N^2 log(N))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21785</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21785"/>
		<updated>2017-01-29T08:52:20Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 log(N)) + O(N) = O(N^2 log(N))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21646</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21646"/>
		<updated>2017-01-20T13:33:27Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность определяется суммой сложностей трёх основных этапов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T(N) = O(N^2) + O(N^2 log(N)) + O(N) = O(N^2 log(N))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21639</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21639"/>
		<updated>2017-01-20T11:49:52Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt; &lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(1) \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21628</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21628"/>
		<updated>2017-01-20T02:12:01Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Псевдокод */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt; D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt; P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее i с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt; T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt;  &amp;lt;br /&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt; D(1) \gets 0&amp;lt;/math&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt; v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt; T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21625</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21625"/>
		<updated>2017-01-19T22:07:45Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt; D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt; P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее i с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; T \gets  &amp;lt;/math&amp;gt; {} &lt;br /&gt;
 Для каждой вершины  &amp;lt;math&amp;gt; i \in V &amp;lt;/math&amp;gt;  &amp;lt;br /&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;D(i) \gets \infty &amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt;P(i) \gets nil&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt; D(1) \gets 0&amp;lt;/math&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;Q \gets V&amp;lt;/math&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
 Пока &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; не пуста&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets\ Extract.min(Q) &amp;lt;/math&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
  Для каждой вершины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; смежной с &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
   Если &amp;lt;math&amp;gt;u \in Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;W(v,u) &amp;lt; D(u)&amp;lt;/math&amp;gt;  &lt;br /&gt;
    &amp;lt;math&amp;gt;D(u) \gets W(v,u)&amp;lt;/math&amp;gt;&lt;br /&gt;
    &amp;lt;math&amp;gt;P(u) \gets v&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt; v \gets Extract.Min(Q)&amp;lt;/math&amp;gt;&lt;br /&gt;
  &amp;lt;math&amp;gt; T \gets T+(P(v),v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21624</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21624"/>
		<updated>2017-01-19T21:25:21Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt; D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt; P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее i с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21622</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21622"/>
		<updated>2017-01-19T19:18:21Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt; D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt; P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее i с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21621</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21621"/>
		<updated>2017-01-19T19:14:27Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt; D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt; P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее i с вершиной из построенного дерева&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21619</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21619"/>
		<updated>2017-01-19T19:00:25Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt; D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева&lt;br /&gt;
* &amp;lt;math&amp;gt; P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее i с вершиной из построенного дерева&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева&lt;br /&gt;
&lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21618</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21618"/>
		<updated>2017-01-19T18:36:22Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt; D(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева&lt;br /&gt;
* &amp;lt;math&amp;gt; P(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее i с вершиной из построенного дерева&lt;br /&gt;
* &amp;lt;math&amp;gt;W(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — приоритетная очередь вершин графа, где ключ — &amp;lt;math&amp;gt;D(i)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — множество ребер минимального остовного дерева&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21616</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21616"/>
		<updated>2017-01-19T18:24:43Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt; d(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt; p(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее i с вершиной из построенного дерева;&lt;br /&gt;
* &amp;lt;math&amp;gt; w(i,j) &amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt; (i,j) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21613</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21613"/>
		<updated>2017-01-19T17:43:40Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Обозначения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt; d(i) &amp;lt;/math&amp;gt; — расстояние от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины до построенного дерева&lt;br /&gt;
* &amp;lt;math&amp;gt; p(i) &amp;lt;/math&amp;gt; — предок &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й вершины, то есть такая вершина &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, что &amp;lt;math&amp;gt;(u,i)&amp;lt;/math&amp;gt; легчайшее из всех рёбер, соединяющее i с вершиной из построенного дерева.&lt;br /&gt;
* &amp;lt;math&amp;gt;w(i,j)&amp;lt;/math&amp;gt; — вес ребра &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21609</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21609"/>
		<updated>2017-01-19T17:24:38Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Обозначения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21608</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21608"/>
		<updated>2017-01-19T17:21:10Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt;d(i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21607</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21607"/>
		<updated>2017-01-19T17:10:34Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Обозначения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
* &amp;lt;math&amp;gt; d[i] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21606</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21606"/>
		<updated>2017-01-19T17:00:49Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21602</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21602"/>
		<updated>2017-01-19T15:07:04Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21592</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21592"/>
		<updated>2017-01-19T14:05:47Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21590</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21590"/>
		<updated>2017-01-19T14:04:21Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(N)) &amp;lt;/math&amp;gt;&lt;br /&gt;
;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21589</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21589"/>
		<updated>2017-01-19T13:56:27Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 \log_2 N) &amp;lt;/math&amp;gt;&lt;br /&gt;
;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21588</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21588"/>
		<updated>2017-01-19T13:53:25Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(n^2 * log(n)) &amp;lt;/math&amp;gt;&lt;br /&gt;
;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21587</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21587"/>
		<updated>2017-01-19T13:46:24Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(N^2 log(n)) &amp;lt;/math&amp;gt;&lt;br /&gt;
;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21586</id>
		<title>Участник:Dmarkin/Алгоритм кластеризации, основанный на минимальном покрывающем дереве</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:Dmarkin/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8,_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D0%BE%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%BC_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5&amp;diff=21586"/>
		<updated>2017-01-19T13:43:42Z</updated>

		<summary type="html">&lt;p&gt;Dmarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Автор описания:&#039;&#039;&#039; [[Участник:Dmarkin | Маркин Дмитрий Валерьевич, группа 611]]&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Кластеризация (или кластерный анализ) — это задача разбиения множества объектов на группы, называемые кластерами. Внутри каждой группы должны оказаться «похожие» объекты, а объекты разных группы должны быть как можно более отличны.&lt;br /&gt;
 &lt;br /&gt;
Алгоритм кластеризации на k кластеров, основанный на построении минимального остовного дерева (MST):&lt;br /&gt;
#По исходным данным строится граф. Каждый объект представляется в виде вершины графа, каждые две вершины соединяются ребром. Вычисляется вес ребра при помощи выбранной метрики (например, евклидовой);&lt;br /&gt;
#Для полученного графа строится минимальное остовное дерево при помощи одного из алгоритмов (наиболее распространены: [[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]])&lt;br /&gt;
#Удаляется k-1 ребро минимального остовного дерева с максимальным весом и получаются k компонент связности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Имеем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; объектов &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которые представляют собой элемент метрического пространства с метрикой &amp;lt;math&amp;gt;d(x_i,x_j)=\sqrt{\sum^{n}_{k=1} {(x_{ik}-x_{jk})^2}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На первом шаге строим граф &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; с множеством вершин &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|V|=N&amp;lt;/math&amp;gt;) и множеством ребер &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;|E|=\frac{N*(N-1)} {2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
На втором этапе строится минимальное покрывающее дерево &amp;lt;math&amp;gt;MST(G)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
На третьем этапе удаляется &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt; ребро, и дерево распадается на поддеревья &amp;lt;math&amp;gt;MST_i&amp;lt;/math&amp;gt;, вершины которых объявляются принадлежащими кластеру с номером &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм состоит из трёх независимых шагов:&lt;br /&gt;
&lt;br /&gt;
#Построение графа и вычисление расстояний. Сложность &amp;lt;math&amp;gt;O(N^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Построение минимального покрывающего дерева при помощи одного из наиболее распространенных методов ([[Алгоритм Крускала | Алгоритм Крускала]],  [[Алгоритм Борувки | Алгоритм Борувки]],  [[Алгоритм Прима | Алгоритм Прима]]). Сложность &amp;lt;math&amp;gt; O(n^2 log(n)) &amp;lt;/math&amp;gt;&lt;br /&gt;
;&lt;br /&gt;
#Разбиение на кластеры. Сложность в худшем случае &amp;lt;math&amp;gt;O(N)&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;
[[Файл:14.png|border|мини|центр|1000px|Информационный граф параллельного алгоритма построения минимального покрывающего дерева]]&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>Dmarkin</name></author>
	</entry>
</feed>