Алгоритм Катхилл — Макки

Материал из testwiki
Перейти к навигации Перейти к поиску
Упорядочение обратным алгоритмом Катхилл — Макки

Алгоритм Ка́тхилл — Макки́ (Шаблон:Lang-en) — алгоритм уменьшения Шаблон:Не переведено разреженных симметричных матриц. Назван по именам разработчиков — Шаблон:Iw и Джеймса Макки.

Шаблон:ЯкорьОбратный алгоритм Катхилл — Макки (RCM, Шаблон:Lang-en2) — тот же самый алгоритм с обратной нумераций индексов.

Алгоритм

Исходная симметричная матрица n×n рассматривается как матрица смежности графа (V,E). Алгоритм Катхилл — Макки перенумеровывает вершины графа таким образом, чтобы в результате соответствующей перестановки столбцов и строк исходной матрицы уменьшить ширину её ленты.

Алгоритм строит упорядоченный набор вершин R, представляющий новую нумерацию вершин. Для связного графа алгоритм выглядит следующим образом:

  1. выбрать периферийную вершину (или псевдопериферийную вершину) v для начального значения кортежа R:=(v);
  2. для i=1,2,..., пока выполнено условие |R|<n, выполнять шаги 3—5:
  3. построить множество смежности Adj(Ri) для Ri, где Ri — i-ая компонента R, и исключить вершины, которые уже содержатся в R, то есть: Ai:=Adj(Ri)R;
  4. отсортировать Ai по возрастанию степеней вершин;
  5. добавить Ai в кортеж результата R.

Другими словами, алгоритм нумерует вершины в ходе поиска в ширину, при котором смежные вершины обходятся в порядке увеличения их степеней.

Для несвязного графа алгоритм можно применить отдельно к каждой компоненте связностиШаблон:Sfn.

Временна́я вычислительная сложность алгоритма RCM при условии, что для упорядочения применена сортировка вставками, O(m|E|), где m — максимальная степень вершины, |E| — количество ребер графаШаблон:Sfn.

Выбор начальной вершины

Для получения хороших результатов необходимо найти периферийную вершину графа (V,E). Эта задача в общем случае является достаточно трудной, поэтому вместо неё обычно ищут псевдопериферийную вершину с помощью одной из модификаций эвристического алгоритма Гиббса, либо какого-либо другого метода.

Для описания алгоритма вводится понятие корневой структуры уровней (Шаблон:Lang-en). Для заданной вершины v структурой уровней с корнем в v будет разбиение множества вершин V:

(v)={L0(v),L1(v),,Ll(v)(v)},

где подмножества Li(v) определены следующий образом:

L0(v)={v},
L1(v)=Adj(L0(v))

и

Li(v)=Adj(Li1(v))Li2(v),i=2,3,,l(v).

Алгоритм нахождения псевдопериферийной вершиныШаблон:Sfn:

  1. выбрать произвольную вершину r из V;
  2. построить структуру уровней для корня r: (r)={L0(r),L1(r),,Ll(r)(r)};
  3. выбрать вершину с минимальной степенью v из Ll(r)(r);
  4. построить структуру уровней для корня v: (v)={L0(v),L1(v),,Ll(v)(v)};
  5. если l(v)>l(r), то присвоить r:=v и перейти к шагу 3;
  6. вершина v является искомой псевдопериферийной вершиной.

Примечания

Шаблон:Примечания

Литература

Ссылки

Шаблон:Алгоритмы на графах