Граф зависимостей

Материал из testwiki
Версия от 06:50, 16 августа 2023; imported>Isnullxbh (Добавил пропущенный предлог.)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

Граф зависи́мостей — ориентированный граф, отображающий соотношение множества элементов некоторой совокупности в соответствии с выбранным транзитивным отношением над ней.

Этот граф часто применяется в информатике и цифровой электронике, в частности, по графу зависимостей определяется порядок вычислений или его недостатки, согласованные с данными зависимостями в графе.

Определение

Пусть дано множество объектов S и отношение транзитивности R=S×S где (a,b)R, моделирующее зависимость «для вычисления a нужно сначала вычислить b», тогда граф зависимостей — это граф G=(S,T) где TR и R является транзитивным замыканием T.

Например, некоторый калькулятор поддерживает запись константы в некоторую переменную и сложение двух переменных с записью результата в некоторую третью переменную. Пусть дано несколько выражений, например, A=B+C;B=5+D;C=4;D=2. Тогда S=A,B,C,D и R=(A,B),(A,C),(B,D). Можно явно вывести все отношения: A зависит от B и C, потому что две переменные можно складывать тогда и только тогда, когда известны значения обеих переменных. Таким образом, B и C должны быть вычислены перед A. Однако, значение D известно сразу, потому что это числовая константа.

Обнаружение невозможных вычислений

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

В примере на основе калькулятора, вычислительная система A=B;B=D+C;C=D+A;D=12 содержит циклическую зависимость. B должно быть вычислено до A, C должно быть вычислено до B, A должно быть вычислено до C.

Определение порядка вычислений

Корректный порядок вычислений — это нумерация n:SN объектов, которая упорядочивает узлы графа зависимостей так, что имеет место равенство: n(a)<n(b)(a,b)R, где a,bS. Это означает, что если нумераций определяется, что a вычисляется перед b, то a не может зависеть от b. Более того, может существовать более одного корректного порядка вычислений. По сути, корректная нумерация является топологической сортировкой, и любая топологическая сортировка является корректной нумерацией. На самом деле, любой алгоритм, производящий корректную топологическую сортировку, одновременно определяет корректный порядок вычисления.

Для системы (в примере с калькулятором) A=B+C;B=5+D;C=4;D=2 корректный порядок: (D,C,B,A), однако, (C,D,B,A) также является корректным порядком вычислений.

Примеры

Граф зависимостей используется в:

  • Планирование инструкций. Граф зависимостей вычисляется для операндов ассемблера или промежуточных инструкций и используется для определения оптимального порядка инструкций.
  • Удаление мёртвого кода.

Графы зависимости это один из вопросов:

  • Теории ограничений. Исходные данные перерабатываются в результирующие в ходе нескольких зависимых этапов.
  • Планирования. Набор взаимосвязанных теоретических проблем в области компьютерных наук.

См. также

Примечания

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

Литература

Ссылки

  1. Например, в утилитах make