Автор работы: Пользователь скрыл имя, 17 Июня 2012 в 21:23, курс лекций
Раздел 1. Булева алгебра
Тема 1.1. Понятие системы исчисления по любому основанию, двоичная система.
Раздел 2. Алгебра множеств
Тема 2.1 Основные определения теории множеств. Примеры
Определение Гамильтоновой цепью называется замкнутый маршрут, если он содержит все вершины графа и через каждую проходит по одному разу.
Известен
ряд достаточных условий
Определение Граф называется гамильтоново связным, если любые две его вершины соединены гамильтоновой цепью.
Известная задача о коммивояжере состоит в том, чтобы найти в графе, ребрами которого приписаны неотрицательные числа (веса ребер), гамильтонов цикл, имеющий наименьшую сумму весов ребер. До сих пор неизвестен алгоритм решения этой задачи, отличный от перебора всех возможных вариантов. Равно как не доказана невозможность существование такого алгоритма.
Это отношение эквивалентности на множестве графов.
Определение Изоморфным отображением одного неориентированного графа на другой называется взаимооднозначное отображение вершин и ребер одного графа – соответственно на вершины и ребра другого графа, при котором сохраняется отношение инцидентности.
Графы {U1…U6}{V1…V6} – неизоморфны, а Графы {U1…U6}{W1…W6} – изоморфны.
Обычно изоморфные графы не различают. Число попарно неизоморфных графов с данным числом вершин и ребер конечно. Подобным же образом определяется изоморфизм ориентированных графов. Установление отношения изоморфности является важной проблемой теории графов. Для некоторых классов графов существуют эффективные алгоритмы, позволяющие установить изоморфизм.
Определение: Деревом называется связный, ориентированный граф без петель и кратных ребер, не содержащий в себе циклов, удовлетворяющий следующим условиям:
Деревья являются простейшим видом связных графов. Любое дерево с n вершинами содержит n-1 ребер. Число различных деревьев, которые можно построить на n вершинах равно
Определение Дерево с одной выделенной вершиной называется корневым деревом.
Определение
Ориентированный граф, состоящий из нескольких
деревьев, называется лесом.
Определение: Пусть G=(Х, Г) – граф, являющийся лесом. Если дуга (v,w) принадлежит Г, то v называется отцом узла w, а w – сыном узла v.
Определение: Если есть путь из v в w, то v называется предком узла w, а w – потомком узла v.
Определение: Узел без потомков называется листом.
Определение: Узел v и его потомки вместе образуют поддерево леса G, и узел v называется корнем этого поддерева.
Определение: Глубина узла v в дереве – это длина пути из корня в v.
Определение: Высота узла в дереве – это длина самого длинного пути из этого узла в какой-нибудь лист.
Определение: Высотой дерева называется высота его корня.
Глубина узла b, в данном примере, = 1, а его высота = 2. Высота дерева = 3.
Определение: Упорядоченным деревом называется дерево, в котором множество сыновей каждого узла упорядоченно. При изображении упорядоченного дерева, как правило, считается, что множество сыновей каждого узла упорядоченно слева направо.
Определение: Бинарным деревом называется такое упорядоченное дерево, что
Обратите внимание, что бинарное дерево не является частным случаем дерева, это совершенно иное, хотя и тесно связанное понятие.
Например:
Указанные бинарные деревья различны между собой ( в первом случае корень имеет пустое правое поддерево, а во втором левое поддерево пусто), хотя как деревья они изоморфны, и мы можем рассматривать их как одно дерево.
Определение: Бинарное дерево называется полным, если для некоторого целого числа K каждый узел, глубины меньшей k имеет как левого, так и правого сына, и каждый узел глубины k является листом.
Полное дерево глубины k имеет
узлов.
Очень часто используются алгоритмы, которые проходят дерево (посещают каждый его узел) в некотором порядке. Известно несколько способов сделать это. Мы рассмотрим три широко известных способа: прохождение дерева в прямом порядке, обратном порядке и внутреннем.
Будем считать, что Т – дерево с корнем r и сыновьями {v1 . . . vk} при k >=0. При k = 0 это дерево состоит из единственного узла r.
Пример
Посетить в обратном порядке поддеревья с корнями v1 . . . vk в указанной последовательности.
Посетить корень r
Посетить во внутреннем порядке левое поддерево корня (если оно существует).
Посетить корень
Посетить во внутреннем порядке правое поддерево корня (если оно существует).
Прежде чем дать описание одного из этих алгоритмов на некотором формальном языке программирования, поговорим о способах задания и хранения деревьев и бинарных деревьев. Очень многие объекты представимы в виде деревьев.
Например: сложная нумерация глав лекций – типичный информационный объект, сохраняемый и обрабатываемый в виде дерева.
1. Теория графов
1.1. Основные определения теории графа
1.2. Операции над графами
1.2.1. Одноместные операции
1.2.2. Двуместные операции
1.3. Отношения
1.3.1. Отношение порядка
1.3.2. Отношение эквивалентности
1.5. Понятие обхода графа
1.5.1. Эйлеров цикл
1.5.2. Гамильтонов цикл
Подобная
система нумерации часто
Введем интуитивное понятие
Например
Бинарные деревья, как правило, хранятся посредством двух массивов ЛЕВЫЙСЫН и ПРАВЫЙСЫН, где номер элемента массива – это номер узла, а значение этого элемента – номер левого или правого узла – сына. Если элемент - сын отсутствует, то значение равно 0.
Пример
Теперь опишем алгоритм нумерации узлов двоичного дерева в соответствии с внутренним порядком. Для этого будем пользоваться неким подобием языка программирования, специально предназначенного для прозрачного и понятного описания алгоритмов.
Вход: Двоичное дерево, представленное массивами ЛЕВЫЙСЫН и ПРАВЫЙСЫН.
Выход: Массив, называемый НОМЕР, такой, что НОМЕР[i] – номер i – того узла во внутреннем порядке.
Метод: Будем использовать глобальную переменную СЧЕТ, значение которой – номер очередного узла в соответствии с внутренним порядком. Начальное значение переменной СЧЕТ = 1.
Программа выглядит так:
begin
СЧЕТ ¬ 1
ВНУТРПОРЯДОК(КОРЕНЬ)
End
Procedure ВНУТРПОРЯДОК(УЗЕЛ)
Begin
1. if ЛЕВЫЙСЫН[УЗЕЛ]¹0 then
ВНУТРПОРЯДОК(
2. НОМЕР[УЗЕЛ] ¬ СЧЕТ;
4. if ПРАВЫЙСЫН[УЗЕЛ]¹0 then
ВНУТРПОРЯДОК(
End
Такая
процедура, которая явно или неявно
вызывает сама себя, называется рекурсивной.
Применение рекурсии часто дает возможность
давать более прозрачное и сжатое описание
алгоритма, чем это же можно было бы сделать,
не используя рекурсию. Если бы приведенный
алгоритм не был записан рекурсивно, надо
было бы строить явный механизм для прохождения
дерева. Двигаться вниз по дереву нетрудно,
но чтобы обеспечить возможность вернуться
к предку, надо запомнить всех предков
в стеке, а операторы работы со стеком
усложнили бы алгоритм, лишив его наглядности.