Как найти число связностей в матрице

Неориентированный
граф называется связным,
если каждая пара различных вершин может
быть соединена, по крайней мере, одной
цепью.

Ориентированный
граф называется сильно
связным
,
если для любых двух его вершин


и


существует
хотя бы один путь, соединяющий


с

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

Компонентой
связности неориентированного графа

называется его связный подграф, не
являющийся собственным подграфом
никакого другого связного подграфа
данного графа (максимально связный
подграф).

Компонентой
сильной связности ориентированного
графа

называется его сильно связный подграф,
не являющийся собственным подграфом
никакого другого сильно связного
подграфа данного графа (максимально
сильно связный подграф).

Компонентой
односторонней связности ориентированного
графа
называется
его односторонне связный подграф, не
являющийся собственным подграфом
никакого другого односторонне связного
подграфа данного графа (максимально
односторонне связный подграф).

Пусть

неориентированный граф с множеством
вершин

.
Квадратная матрица


порядка

,
у которой


называется
матрицей
связности
графа

.

Для ориентированного
графа квадратная матрица

порядка

,
у которой

называется
матрицей
односторонней связности (достижимости)
.

Квадратная матрица

порядка

,
у которой

называется матрицей
сильной связности
.

Пример. У
неориентированного графа, изображенного
на рис. 22 две компоненты связности.
Первая компонента связности включает
вершины

,
а вторая
состоит из одной вершины

.

Рис. 22. Компоненты
связанности неориентированного графа

Матрица связности
этого графа имеет вид:

.

Мы видим, что 1-ая,
2-ая, 4-ая и 5-ая строки матрицы

одинаковы.

Пример. У
ориентированного графа, изображенного
на рис. 23 две компоненты сильной связности.
Первая компонента связности включает
вершины

,
а вторая
состоит из одной вершины

.
Действительно, для любой пары вершин
из множества


существует
хотя бы один путь, соединяющий эти
вершины. Например, путь

соединяет все эти вершины. Из вершины

нет пути ни в одну вершину графа.

Рис. 23. Компоненты
сильной связанности ориентированного
графа

Матрица сильной
связности этого графа имеет вид:


.

Заметим, что 1-ая,
2-ая, 3-ая и 5-ая строки матрицы

одинаковы.

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

ориентированного графа, затем находим
матрицу сильной связности

ориентированного графа (она должна быть
симметрической).

Алгоритм выделения
компонента сильной связности:

1. Присваиваем

(

− количество компонент связности),


.

2. Включаем в
множество вершин


компоненты
сильной связности

вершины, соответствующие единицам
первой строки матрицы

.
В качестве матрицы смежности

возьмем подматрицу матрицы

,
состоящую из элементов матрицы

,
находящихся на пересечении строк и
столбцов, соответствующих вершинам из

.

3. Вычеркиваем из

строки и столбцы, соответствующие
вершинам из

.
Если не остается ни одной строки (и
столбца), то


количество компонент сильной связности.
В противном случае обозначим оставшуюся
после вычеркивания срок и столбцов
матрицу как

,
присваиваем

и переходим к п. 2.

Пример. Выделим
компоненты связности ориентированного
графа, изображенного на рис. 25. Количество
вершин

.

Рис. 25.

Значит, для данного
ориентированного графа матрица смежности
будет иметь размерность

и будет выглядеть следующим образом


.

Найдем матрицу
достижимости и матрицу сильной связности
для данного ориентированного графа:


,


.

Присваиваем

,

и составляем множество вершин первой
компоненты сильной связности

:
это те вершины, которым соответствуют
единицы в первой строке матрицы

.
Таким образом, первая компонента сильной
связности состоит из одной вершины

.

Вычеркиваем из
матрицы

строку и столбец, соответствующие
вершине

,
чтобы получить матрицу

.

Присваиваем

.
Множество вершин второй компоненты
связности составят те вершины, которым
соответствуют единицы в первой строке
матрицы

,
то есть

.
Составляем матрицу смежности для
компоненты сильной связности

исходного графа


− в ее
качестве возьмем подматрицу матрицы

,
состоящую из элементов матрицы

,
находящихся на пересечении строк и
столбцов, соответствующих вершинам из

:


.

Вычеркиваем из
матрицы

строки и столбцы, соответствующие
вершинам из

,чтобы
получить матрицу

,
которая состоит из одного элемента

,
присваиваем

.
Таким образом, третья компонента сильной
связности исходного графа, как и первая,
состоит из одной вершины

.

Таким образом,
выделены 3 компоненты сильной связности
ориентированного графа

:

:


:


:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

С помощью матрицы смежности найти компоненты сильной связности ориентированного графа D.

Cоставляем матрицу смежности A(D) размерности (N− количество вершин) для данного ориентированного графа: она состоит из нулей и единиц, номера строк – индексы вершин, из которых исходят дуги, номера столбцов – индексы вершин, в которые дуги входят (если есть дуга, исходящая из вершины Vi и входящая в Vj, то элемент матрицы смежности, стоящий на пересечении I-той строки и J-того столбца равен 1, иначе – 0.).

Для того, чтобы выделить компоненты сильной связности, необходимо сначала найти матрицу достижимости T(D) ориентированного графа по первой формуле утверждения 3, затем находим матрицу сильной связности S(D) ориентированного графа (она должна быть симметрической) по второй формуле из того же утверждения.

Алгоритм выделения компонент сильной связности

1. Присваиваем P=1 (P − количество компонент связности), .

2. Включаем в множество вершин Vp Компоненты сильной связности Dp вершины, соответствующие единицам первой строки матрицы Sp. В качестве матрицы A(Dp) возьмем подматрицу матрицы A(D), состоящую из элементов матрицы A, находящихся на пересечении строк и столбцов, соответствующих вершинам из Vp.

3. Вычеркиваем из Sp строки и столбцы, соответствующие вершинам из Vp. Если не остается ни одной строки (и столбца), то P– количество компонент сильной связности. В противном случае обозначим оставшуюся после вычеркивания срок и столбцов матрицу как Sp+1, присваиваем P=P+1 и переходим к п. 2.

Пример

Выделим компоненты связности ориентированного графа, изображенного на рис. 6. В данной задаче количество вершин N=5.

Рис. 6.

Значит, для данного ориентированного графа матрица смежности будет иметь размерность 5×5 и будет выглядеть следующим образом

.

Найдем матрицу достижимости для данного ориентированного графа по формуле 1) из утверждения 3:

, ,

,

Следовательно,

.

Таким образом, матрица сильной связности, полученная по формуле 2) утверждения 3, будет следующей:

.

Присваиваем P=1 и составляем множество вершин первой компоненты сильной связности D1: это те вершины, которым соответствуют единицы в первой строке матрицы S(D). Таким образом, первая компонента сильной связности состоит из одной вершины .

Вычеркиваем из матрицы S1(D) строку и столбец, соответствующие вершине V1, чтобы получить матрицу S2(D):

.

Присваиваем P=2. Множество вершин второй компоненты связности составят те вершины, которым соответствуют единицы в первой строке матрицы S2(D), то есть . Составляем матрицу смежности для компоненты сильной связности исходного графа D − в ее качестве возьмем подматрицу матрицы A(D), состоящую из элементов матрицы A, находящихся на пересечении строк и столбцов, соответствующих вершинам из V2:

.

Вычеркиваем из матрицы S2(D) строки и столбцы, соответствующие вершинам из V2 ,чтобы получить матрицу S3(D), которая состоит из одного элемента:

И присваиваем P=3. Таким образом, третья компонента сильной связности исходного графа, как и первая, состоит из одной вершины .

Таким образом, выделены 3 компоненты сильной связности ориентированного графа D:

< Предыдущая   Следующая >

1.5. Матрицы достижимости и связности

Пусть A(D) – матрица смежности ориентированного псевдографа D=(V,X) (или псевдографа G=(V,X)), где V=V1,…, VN>. Обозначим через Ak=[A(K)Ij] K-ю степень матрицы смежности A(D).

Элемент A(K)Ij матрицы Ak ориентированного псевдографа D=(V,X) (псевдографа G=(V,X)) равен числу всех путей (маршрутов) длины K из Vi в Vj.

Матрица достижимости ориентированного графа D − квадратная матрица T(D)=[Tij] порядка N, элементы которой равны

Матрица сильной связности ориентированного графа D − квадратная матрица S(D)=[Sij] порядка N, элементы которой равны

Матрица связности графа G − квадратная матрица S(G)=[Sij] порядка N, элементы которой равны

Утверждение 3. Пусть D=(V,X) – ориентированный граф, V=V1,…, VN>, A(D) – его матрица смежности. Тогда

1) T(D)=sign[E+A+A2+A3+… AN-1],

2) S(D)=T(D)&TT(D) (TT-транспонированная матрица, &- поэлементное умножение).

Пусть G=(V,X) – граф, V=V1,…, VN>, A(G) – его матрица смежности. Тогда

S(G)=sign[E+A+A2+A3+… AN-1] (E— единичная матрица порядка N).

Матрица достижимостей

Вершина графа называется достижимой из вершины того же графа, если существует по крайней мере один путь из в .

Множество вершин R(vi), достижимых из некоторой вершины , определяется следующим выражением:

Действительно, первым элементом множества является вершина , которая достижима из себя самой с помощью пути длины нуль; Г(vi) – множество вершин vj, достижимых из vi с использованием путей длины единица; Г 2 (vi) – множество вершин, достижимых из vi с использованием путей длины два; — множество вершин, достижимых из vi с использованием путей длины p. Таким образом, множество R(vi) получается путем последовательного выполнения слева направо операции объединения в выражении (2.9) до тех пор, пока мощность текущего множества не перестанет увеличиваться при очередной операции объединения. С этого момента последующие операции объединения не будут давать новых элементов множеству R(vi). Число объединений, которые необходимо выполнить, зависит от графа G. Но если граф конечен, то p<n, где n – число вершин графа.

Матрицей достижимостей называется квадратная матрица порядка n, элемент которой

Пример. Построить матрицу достижимостей графа G, представленного на рис. 2.6.

Следовательно, матрица достижимостей имеет вид:

Очевидно, что элементы di,i=1, i=1, 2, …, n, так как каждая вершина достижима из себя самой.

Матрица контрдостижимостей (обратных достижимостей) определяется следующим образом:

где Q(vi) – множество таких вершин viÎV, что из любой вершины этого множества можно достигнуть вершину vi:

где — множество вершин, из которых достижима вершина vi с использованием пути длины единица; ) – множество вершин, из которых достижима вершина vi с использованием пути длины два и т.д. Операция объединения в выражении (2.10) выполняется слева направо до тех пор, пока очередное объединение не перестанет изменять “текущее множество”.

Пример. Построить матрицу контрдостижимостей Q для графа G рис. 2.6.

Матрица контрдостижимостей будет иметь вид:

Из определения матриц D и Q следует, что Q=D T . Так как D(vi) является множеством вершин, достижимых из , а Q(vj) – множество вершин, из которых достижима вершина vj, то D(vi) — множество таких вершин, каждая из которых принадлежит по крайней мере одному пути, идущему от vi к vj. Эти вершины называются существенными (неотъемлемыми) относительно двух концевых вершин vi и vj. Вершины называются несущественными (избыточными), так как их удаление не влияет на пути от vi к vj.

Как найти матрицу достижимости

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

Задач, в которых используется понятие достижимости, довольно много. Вот одна из них. Граф может быть моделью какой-то организации или социальной сети, в которой люди представлены вершинами, а дуги интерпретируют каналы связи. При рассмотрении такой модели можно поставить вопрос, может ли информация от одного лица хi быть передана другому лицу хj, т.е. существует ли путь, идущий от вершины хi к вершине хj. Если такой путь существует, то говорят, что вершина хj достижима из вершины хi. Можно интересоваться достижимостью вершины хj из вершины хi только на таких путях, длины которых не превосходят заданной величины или длина которых меньше наибольшего числа вершин в графе и т.п. задачи.

Характерной особенностью таких задач является большая размерность, что обусловливает необходимость конструирования более скоростных алгоритмов. Плодотворной основой для построения таких алгоритмов могут служить их сетевые и графовые формализации [1, 7].

Программные реализации указанных задач весьма универсальны и просто программируемы при небольших размерностях графа. Однако при значительном увеличении количества узлов или дуг графа время программного решения при последовательном исполнении инструкций становится практически неприемлемым. Аппаратные реализации хотя и обеспечивают необходимую скорость за счет параллельной обработки информации, но не обладают достаточной алгоритмической гибкостью, в силу этого – их адаптация к изменениям логики вычислений не всегда возможна [2, 3, 4, 5]. Решением данной проблемы является использование таких вычислительных алгоритмов, которые бы совмещали скорость аппаратных вычислений с легкостью программной модификации в параллельных алгоритмах [6, 8, 9].

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

Допустим, что мы имеем граф, структура которого описана матрицей смежности (рис. 1) размерностью n×n, (где n – число вершин графа), однозначно представляющая его структуру:

pic_17.wmf

Рис. 1. Пример 1: а ‒ граф; б ‒ матрица смежности графа

A = , i, j = 1, 2, . n, а каждый элемент матрицы определяется следующим образом:

aij = 1, если существует дуга из вершины xi в вершину xj,

aij = 0, если нет дуги из вершины xi в вершину xj.

Достижимость в графе описывается матрицей достижимости

R = [rij], i, j = 1, 2, . n, где n – число вершин графа, а каждый элемент определяется следующим образом:

rij = 1, если вершина хj достижима из хi,

rij = 0, в противном случае.

Множество вершин R(xi) графа G, достижимых из заданной вершины xi, состоит из таких элементов xj, для которых (i, j)-й элемент в матрице достижимостей равен 1. Очевидно, что все диагональные элементы в матрице R равны 1, поскольку каждая вершина достижима из себя самой путeм длины 0. Поскольку прямое отображение 1-го порядка Г+1 (xi) является множеством таких вершин xj, которые достижимы из xi с использованием путей длины 1, то множество Г+(Г+1(xi)) = Г+2 (xi) состоит из вершин, достижимых из xi с использованием путей длины 2. Аналогично Г+p(xi) является множеством вершин, которые достижимы из xi с помощью путей длины p.

Так как любая вершина графа, которая достижима из xi, должна быть достижима с использованием пути (или путей) длины 0 или 1, или 2, . или p, то множество вершин, достижимых для вершины xi, можно представить в виде

Как видим, множество достижимых вершин R(xi) представляет собой прямое транзитивное замыкание вершины xi, т.е. R(xi) = T+(xi). Следовательно, для построения матрицы достижимости находим достижимые множества R(xi) для всех вершин xi ∈ X. Полагая rij = 1, если xj ∈ R(xi) и rij = 0 в противном случае.

Суть предлагаемого параллельного алгоритма нахождения матрицы достижимости заключается в следующем:

1. Так как каждая вершина достижима сама для себя, то в матрице достижимости R1 на главной диагонали должны стоять 1. Единицы можно предварительно занести на главную диагональ матрицы смежности, для того чтобы в п. 2 алгоритма использовать общую формулу преобразования.

Студворк — интернет-сервис помощи студентам

Найти количество компонент связности в ориентированным графе, заданном с помощью матрицы смежности.
Ориентированный граф задан матрицой смежности. Как найти кол-во компонент связности в нем.
Написал код для НЕОРИЕНТИРОВАННОГО графа, с помощью dfs:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
using namespace std;
 
const int N = 6;
int m[N][N];
char used[N]{};
 
void fill_the_matrix() {
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            cin >> m[i][j];
}
 
void dfs(int s) {
    used[s] = 1;
    for (int i = 0; i < N; i++) {
        if (used[i] == 0 && m[s][i] == 1)
            dfs(i);
    }
}
 
int main()
{
    int cnt = 0;
    fill_the_matrix();
    //dfs(3);
 
    for (int i = 0; i < N; i++) {
        if (used[i] == 0) {
            dfs(i);
            cnt++;
        }
    }
 
    cout << endl << cnt << endl;
 
    return 0;
}

Помогите, пожалуйста, найти решение для ОРИЕНТИРОВАННЫХ ГРАФОВ

Добавлено через 22 минуты
Все, сумел решить. Вот, если что, кто будет искать:
Замените условие в первоначальном алгоритме в фукнции dfs на:

if (used[i] == 0 && (m[s][i] == 1 || m[i][s] == 1))

И получите:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
using namespace std;
 
/*ОРИЕНТИРОВАННЫЙ ГРАФ*/
 
const int N = 14;
int m[N][N];
char used[N]{};
 
void fill_the_matrix() {
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            cin >> m[i][j];
}
 
void dfs(int s) {
    used[s] = 1;
    for (int i = 0; i < N; i++) {
        if (used[i] == 0 && (m[s][i] == 1 || m[i][s] == 1))
            dfs(i);
    }
}
 
int main()
{
    int cnt = 0;
    fill_the_matrix();
 
    for (int i = 0; i < N; i++) {
        if (used[i] == 0) {
            dfs(i);
            cnt++;
        }
    }
 
    cout << endl << cnt << endl;
 
    return 0;
}

Графы и программирование

Уровень сложности
Средний

Время на прочтение
12 мин

Количество просмотров 2.5K

Программы и графы

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

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

Характеристика связности графов часто описывается достижимостью из некоторой вершины графа всех других, а очевидное средство такой достижимости проложенный между парой вершин путь. Наличие множества путей, покрывающих вершины иили ребра (дуги) графа, обеспечивает часто решение целевых задач таких, например, как минимизация контрольных точек или тестирование программ. Затрагиваются вопросы и цикломатической сложности графа.

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

Задачи обеспечения информационной безопасности (ИБ) ресурсов напрямую связаны с IT- технологиями и моделированием явлений с целью прогноза развития ситуации и процессов информационного взаимодействия приобретают главенствующее значение. Из всех возможных подходов к подобному моделированию самый эффективный, но не самый затратный считается метод математического моделирования. Применение алгебры, дискретной математики, теории графов и результатов их теории не обошло вниманием область IT- технологий и непосредственно программирования.  Здесь рассмотрим задачи представления программ средствами теории графов (графами) и представления самих графов средствами алгебры (матрицами, списками и др.)

Не очень длинный список задач

Не очень длинный список задач

Представление графа в памяти компьютера

Представление матрицами

Матрицы. При работе с графами используются различные алгебраические средства, в частности матрицы. Матрицы используются для создания описания графов G (V, U), которые могут быть применены в формульных выражениях для вычислений различных характеристик графов. Простейшие матричные описания графов – это матрицы инциденций и смежностей.  

Рисунок 1 a) размеченный граф, b) матрица смежностей, с) матрица инциденций

Рисунок 1 a) размеченный граф, b) матрица смежностей, с) матрица инциденций

Матрицей смежностей А(G) графа G c n вершинами (без петель) называется квадратная матрица размера (порядка) n×n с элементами аij: аij = 1, если в графе существует дуга (ребро) (xi, xj); aij = 0 в противном случае. Эта матрица симметрична относительно главной диагонали для неориентированного графа.

В случае орграфа входу в вершины графа соответствует столбец из нулей, выходу из вершин графа – строка из нулей, число единиц в i –й строке равно полустепени исхода вершины xi, число единиц в j-м столбце равно полустепени захода вершины xj.

Матрицей инцидентности В(G) графа G c n вершинами, которые соответствуют строкам матрицы и m дугами, соответствующими столбцам, называется прямоугольная матрица размера n×m с элементами bij: bij =1, если в графе существует вершина xi, начало дуги uj; bij = –1, если вершина xi есть конец дуги uj; bij = 0 противном случае.

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

Теорема 1. Ранг матрицы инциденций связного графа G (V, U) равен rank = |V| – 1.

Следствие. Ранг матрицы инциденций произвольного графа G (V, U) равен разности числа вершин и числа компонент связности.

Теорема 2. В матрице инциденций значение любого минора равно 0, 1 или – 1.

Матрицей достижимости R(G) графа G c n вершинами называется квадратная матрица размера (порядка) n×n с элементами rij: rij = 1, если в графе вершина xj достижима из вершины xi; rij = 0 в противном случае.

Представление графа списками смежности

 Список смежности для вершины х – это множество смежных с ней вершин или концов дуг, исходящих из вершины х. На рис. 2 представлены два графа G1 и G2: ориентированный и неориентированный с шестью вершинами каждый и их матрицами смежности. Граф представляется числом |Х| списков смежности, по одному для каждой вершины (рис. 3). 

 Рисунок 2 – Графы ориентированный и неориентированный

 Рисунок 2 – Графы ориентированный и неориентированный

Ниже приводится пример задания графов G1 и G2 с помощью списков смежности. Такое представление графа удобно при решении ряда задач, например, при перечислении контуров в графе (алгоритм Джонсона). Предварительно в графе отыскиваются бикомпоненты

Рисунок 3 – Списки смежности графов

Рисунок 3 – Списки смежности графов

Эффективность алгоритма

Сложность программ и ее оценивание. В качестве оценок сложности часто используют общепринятые выражения, к которым можно относиться по разному. Дело в том, что теоретические оценки получаются при разных и многих допущениях, которые в свою очередь не оцениваются.

Традиционные соотношения, используемые в теории оценивания сложности объектов

Традиционные соотношения, используемые в теории оценивания сложности объектов

Понятие эффективности связывают чаще всего с затратами времени на получение решения (работы над задачей) и памяти компьютера. Большая роль отводится также решаемой задаче, с которой связывается некоторое число (или совокупность чисел), называемое размерностью задачи. По существу, это мера количества входных данных. Для задач, связанных с графами под размерностью задачи рассматривают число вершин, или число дуг в орграфе, пара число вершин – число дуг и др.

Время, затрачиваемое алгоритмом на получение результата, в зависимости от размерности задачи, называют временной сложностью или трудоемкостью алгоритма. Асимптотической временной сложностью (трудоемкостью) алгоритма называют предельное значение сложности при неограниченном увеличении размерности.

Размер памяти, минимально необходимый для решения задачи алгоритмом, называется емкостной сложностью или сложностью по объему памяти. Асимптотической емкостной сложностью по аналогии с асимптотической временной сложностью называют предельно минимальное значение памяти необходимое для получения результатов.

При обработке алгоритмом входов размерностью n за время сn2, где с – некоторая постоянная, определяемая реализацией алгоритма, то говорят, что временная сложность этого алгоритма есть О(n2).

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

Здесь цикломатическая сложность является одной, но важной компонентой общей сложности (не затрагивая проблему в целом) программ. Речь у нас пойдет о цикломатической сложности.

Определение. Цикломатическим числом l(G) графа G c n вершинами и m дугами называется величина  

l(G) = m(G) – n(G) + k(G), где k– число компонент связности. Характеристика l(G) определена только для неориентированного графа. Для связного графа k  = 1, l(G) = m – n + 1.

Теорема 3. В сильно связном графе цикломатическое число равно числу линейно независимых контуров.

Рисунок 4

Рисунок 4

Пример. Изображение управляющего графа G приведено на рис. 4. В графе G выявлено 5 независимых контуров (цикломатическое число графа l(G) = m – n +1): [s, v1, v4, t, s], [v1, v4, v1], [s, v1, v4, s], [s, v2, t, s], [s, v3, v2, t, s]. При этом путь [s, v1, v4, s, v1, v4, v1, v4, v1, v4, t] может быть представлен линейной комбинацией [s, v1, v4, t, s] + 2[v1, v4, v1] + [s, v1, v4, t, s]. Вычисление числа всех линейно независимых путей может служить оценкой сложности программы через цикломатическое число.

Определение. Цикломатической сложностью программы называется величина v(G) = l(G) + 2, где l(G) – цикломатическое число соответствующего управляющего графа. Величина v(G) зависит только от логической структуры управляющего графа.

 Цикломатической матрицей H = ||hij|| орграфа G называется прямоугольная (0, 1)–матрица размера c×n, где с – число контуров, а n – число вершин, а

Рисунок 5 –   Для графа с цикломатической матрицей (рис. 5а), матрица вложенности (рис.5б) и граф вложенности (рис. 5в)

Рисунок 5 –   Для графа с цикломатической матрицей (рис. 5а), матрица вложенности (рис.5б) и граф вложенности (рис. 5в)

Матрицей бикомпонент М(G) = R×RТ графа G c n вершинами называется квадратная матрица размера (порядка) n×n с элементами rij: rij = 1, если в графе вершина xj достижима из вершины xi; rij = 0 в противном случае.

Рисунок 6 –   Для графа (рис.6а) матрицы смежности и достижимости (рис. 6б)

Рисунок 6 –   Для графа (рис.6а) матрицы смежности и достижимости (рис. 6б)

Рисунок 7 –   Для графа (рис.6а) матрица бикомпонент и список бикомпонент

Рисунок 7 –   Для графа (рис.6а) матрица бикомпонент и список бикомпонент

Графы как модели программ, данных и процессов

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

Будем представлять программу (код) некоторой задачи текстом в некотором языке программирования. В тексте выделяются входы и выходы не только для кода в целом, но и для каждого отдельного оператора. Такие входы объединяются в множество В+и выходы – в множество В, причем В+ UВ=B, а В+ ∩ В = .

 Определение. Орграф G = (X, U) называется управляющим графом (р-графом, графом переходов), если выполнены следующие условия:

  • граф G не содержит параллельных дуг;

  • в графе G выделена одна вершина s – вход графа;

  • в графе G выделена хотя бы одна вершина t – выход графа;

  • каждая вершина x ϵ X графа G достижима из входа s;

  • из каждой вершины x ϵ X графа G достигает выход t.

Управляющий граф – основная модель программы, представляющая в виде орграфа систему управляющих связей в программе; в которой сохраняется членение программы  на операторы, а также информация о тождественности операторов и возможных передачах управления между операторами.

Поясним определение примером. Пусть задан небольшой текст (программа BUBBLE) в алголоподобном языке

Фрагмент текста программы

Фрагмент текста программы

Этот текст преобразуется в ориентированный граф G по определенным правилам. Каждый оператор языка программирования (машинной команды, строки или любого фрагмента, признаваемого единицей языка) представляется отдельной вершиной графа с номером. Две вершины являются смежными, если между соответствующими операторами есть передача управления. Каждая передача управления представляется дугой графа G.

Оператор, после исполнения которого производится передача управления, изображается началом дуги, а оператор, которому передается управление – концом дуги. Каждой дуге присваивается буквенное имя. Линейные участки (цепочки вершин) существенно увеличивают изображение графа, но такие фрагменты можно заменять и одной вершиной.

Рисунок 8 – Управляющий граф (рис.7a) программы BUBBLEA, редуцированный граф (рис.7b)

Рисунок 8 – Управляющий граф (рис.7a) программы BUBBLEA, редуцированный граф (рис.7b)

Каждая вершина графа G (рис. 7а)) соответствует одному оператору, а дугам – передачи управления.

Справа на рис. 7) приведен редуцированный граф G, в котором линейные участки управляющего графа G представлены одной вершиной. В управляющем графе G можно рассматривать пути различного уровня. Уровень отражает глубину вложенности оператора. Путь уровня 0 есть простой s – t путь; путь уровня 1 есть простой путь или контур, который начинается или заканчивается в вершинах путей уровня 0.

Путь уровня i есть простой путь или контур, который начинается или заканчивается в вершинах путей меньшего уровня, и у которого ни одна другая вершина или дуга не входит в путь меньшего уровня. Ниже в таблице приводится полный список путей i-го уровня, i = 0,1, 2, управляющего графа программы

Пути в графе разных уровней

Пути в графе разных уровней

Тестирование

Определение. Тестирование – это проверка правильности программы посредством множества контрольных примеров – тестов.

Определение. Тестом, проверяющим программу, называется тройка t = <x, μ(G), y >, где х Х – подмножество значений входных данных; μ(G) – это
s – t путь в управляющем графе G, соответствующий входным данным х;
y
Y – подмножество значений выходных данных при прохождении программой пути s – t.

Очевидно, что полное тестирование согласно определению, требует прохода программы по всем путям управляющего графа G. Это очень трудозатратное и времязатратное действие (мероприятие), которое фактически не реализуется. Заменой тотального тестирования является разработка и реализация различных стратегий.

Самая простая стратегия – проверить предписанное число операторов в программе. Для этого выявляется (если он существует) путь в управляющем графе, который проходит через предписанное множество вершин, причем желательно, чтобы такой путь был кратчайшим.

Достаточно общий случай предполагает построение тестирующих путей, покрывающих или все требуемые пути (заданные отрезки путей в управляющем графе), или все дуги, или все вершины управляющего графа

Определение. Орграф без петель I = (B, U) называется информационным графом, если его вершинами являются входы и выходы операторов программы, а дуга (х, у) принадлежит множеству дуг U тогда и только тогда, когда х ϵ В и у ϵ В +. Дуги информационного графа называются информационными парами, сохраняя традиционное название «дуга» для дуг управляющего графа.

 Из определения вытекает, что для полного тестирования программы желательно проверить все (s–t)-пути, но это невозможно даже для небольших программ, поэтому существует несколько различных стратегий тестирования. В первом случае задача тестирования сводится к проверке предписанного числа операторов в программе. Это требует построения кратчайшего пути в управляющем графе, который проходит через предписанное множество вершин (если такой путь существует).

В общем случае предполагается, что каждой вершине сопоставлен вес w >0, который можно интерпретировать как сложность оператора (или отдельного блока) программы, изображаемого данной вершиной. Отыскание тестирующих данных для тестирующего пути тем проще, чем меньше вершин будет в нем содержаться из множества K вершин, не подлежащих проверке. Это соответствует задаче отыскания (s–t) -пути с наибольшим весом при условии, что вершинам из множества K приписан небольшой отрицательный вес.

В общем случае тестирования программ требуется построить тестирующие пути, или все требуемые пути (заданные отрезки путей в управляющем графе), или все дуги, или все вершины управляющего графа. Эти задачи сводятся к построению различного вида покрытий графа путями.

Задача о контрольных точках. Большую задачу и программу трудно охватитить единым взглядом. Возникает необходимость при отладке больших программ создавать в текстах вспомогательные точки, в которых можно было бы получать промежуточные результаты и выводы о процессе отладки. Это позволит обнаруживать в ходе отладки программ ошибки в функционировании циклических частей программы..

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

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

Однако существует приближенное решение, при котором отыскивается множество дуг, принадлежащих как можно большему числу контуров, алгоритм его можно записать следующим образом. Пусть K – множество дуг, разрывающих все контуры. На вход алгоритма поступает множество простых контуров, заданных перечислением дуг, входящих в контуры.

Шаг 1. Построить матрицу H = ||hij|| , контуры-дуги которой определяются:
hij = 1, если дуга uj принадлежит контуру Сi, в противном случае, hij = 0.

Шаг 2. Включить в множество K те дуги, которым в матрице H соответствуют строки, содержащие только одну единицу (тем самым в множество K включаются все петли графа).

Шаг 3. Удалить из H строки и столбцы, соответствующие этим петлям.

Шаг 4. Пока Н не пусто цикл.

Шаг 5. Исключить из H все мажорируемые столбцы, то есть те, для которых найдется хотя бы один столбец, имеющий единицу в тех же строках, что и рассматриваемые.

Шаг 6. Включить в множество K дугу ur , соответствующую столбцу с наибольшим числом единиц.

Шаг 7. Вычеркнуть из H строки, соответствующие единицам в r-м столбце, и сам r-й столбец. Проверка условия H = Ø, если оно не выполняется, необходимо вернуться к шагу 4. Если условие выполнено, конец алгоритма, K – искомое множество дуг, принадлежащих как можно большему числу контуров

Заключение

Это третья статья о графах и их приложениях. Рассматриваются вопросы построения графа по заданному тексту программы, специфический взгляд на сложность. Не могу сказать, что предыдущие публикации по теме вызвали живой интерес и многочисленные отклики читателей. При этом я остаюсь убежденным в том, что мои статьи несут положительный образовательный заряд. Статья “Пути и графы” раскрывает алгоритм перечисления всех путей между парой вершин графа. Но если рассматривать все возможные пары вершин, то такая программа обеспечит перечисление всех путей в графе.

Возникал вопрос к автору: в чем оригинальность публикации? Ответ: в том, что вы не можете назвать других статей и авторов, где эта задача решается. Другой вопрос: для какой цели нужны все пути? Ответ: для многих, хотя бы для обнаружения закладок, не удаленных (забытых) контрольных точек… Один из отзывов: …думаю студенты будут вам благодарны.

В статье “Сети и графы” рассматривается задача классификации графов по основным признакам: вершины, ребра (дуги), распределение степеней вершин (РСВ), изоморфизм; построение (синтез) отдельных классов. Приводится пример формирования полного класса. По результатам анализа элементов класса и характеристике связности находится граф с наилучшей структурой в своем классе. Результаты для класса графов иллюстрируются в матричном и рисуночном представлении. Единственный комментатор навел критику.

 Литература

1. Авондо-Бодино Дж. Применение в экономике теории графов –М.: Прогресс,1966. –160с.
2. Харари Ф., Палмер 3. Харари Ф. Теория графов. –М.: Мир, 1973. – 300 с. 4. Евстигнеев В.А. Применение теории графов в программировании. – М.: Наука,1985.- 352 с. 5. Стечкин Б. С., Матиясевич Ю. В. Сито Эратосфена // Труды международной школы С. Б. Стечкина по теории функций. — Екатеринбург, 1999. – с. 148.
6. Трост Э. Простые числа. — М.: ГИФМЛ, 1959. — 136 с.
7. Касселс Дж. В. С. Введение в геометрию чисел. – М.: МИР, 1965. – 430 с.
8. Кнут Д. Искусство программирования. Т.2. Получисленные алгоритмы. – М.: Вильямс, 2000. 3-е издание. – 280 с.
9. Коблиц Н. Курс теории чисел и криптографии. — М.: Научное издательство ТВП, 2001.— 254 с.
10. Коваленко Д. В., Сидоров Д. П. Факторизация больших чисел распределенными вычислениями // Материалы научной конференции «XXX Огаревские чтения» (естественные и технические науки), Саранск, 2001. — С. 230-232.
11. Коваленко Д. В., Сидоров Д. П., Федосин С.А. Применение распределенных вычислительных систем для факторизации больших чисел // Тезисы международного семинара «Супервычисления и математическое моделирование», Саров, 2002. – С. 53-56.
12. Манин Ю. Н., Панчишкин А.А. Введение в современную теорию чисел. -М.: МЦНМО, 2013.-552 с.

∨ ∧ ∍ ∌ ∊ ∉ ∄ ∃ ∀ ∪ ∩ ≣ ≢ ≠ ≤ ≥ ⊆ ⊇ ⊃ ⊂ ≡ τ σ φ ω ψ χ υ ρ π ξ μ λ ζ η α β γ δ ε ρ ά ℓ ∅ ∞ ∩ ∛ ∜ ± ≠ ~ × ÷ ≤ ≥ ≈ ∀ ℃ °∈∋∃∅ Ω  

Добавить комментарий