Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
30
Добавлен:
01.05.2014
Размер:
125.44 Кб
Скачать

Курсовая работа по дисциплине «Комбинаторные алгоритмы»

Диаметр множества

Содержание

1. Введение 1

1.1. Постановка задачи 1

1.2. Основные понятия 1

2. Теоретические материалы 1

2.1. Описание задачи и методов ее решения 1

2.2. Описание алгоритма 2

2.3. Оценка сложности алгоритма 2

3. Примеры работы алгоритма 2

4. Описание программы 3

4.1. Функции программы 3

4.2. Структура программы 4

4.3. Исходные тексты 4

1. Введение

1.1. Постановка задачи

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

1.2. Основные понятия

Для описания работы системы необходимо ввести некоторые понятия.

Множество точек – множество точек на плоскости М = {р1, р2,…,рn},

где рi – точка на плоскости с координатами (xi,yi),

где i –индекс точки множества,

n – количество точек в множестве;

Диаметр множества – максимальное расстояние между двумя точками множества

D = maxМ[d(pi,pj)],

где точки pi, pjM, а d(pi,pj) – расстояние между двумя точками на плоскости, d(pi,pj) = ((xj - xi)2 + (yj - yi)2);

Выпуклая оболочка – такое подмножество, которое включает в себя все точки множества, являясь при этом минимальным. Для всех точек множества при этом должно выполняться условие: если 2 точки лежат в выпуклой оболочке, то и отрезок, их соединяющий, лежит в выпуклой оболочке.

2. Теоретические материалы

2.1. Описание задачи и методов ее решения

Задача нахождения диаметра множества может решаться несколькими способами. Тривиально можно решить задачу при помощи перебора всех пар точек, при этом время решения составляет O(n2). Однако имеются способы, позволяющие решить задачу нахождения диаметра множества за время O(n log2n). Заметим тот факт, что диаметр множества равен диаметру его выпуклой оболочки (очевидно). Для построения диаметра множества нужно:

  • построить для множества выпуклую оболочку (известны методы, позволяющие сделать это за время O(n log2n) – например, метод Киркпатрика-Сайделя);

  • нужно рассматривать противолежащие пары выпуклой оболочки (то есть такие пары точек, через которые можно провести опорные прямые – прямые, которые не пересекают выпуклую оболочку);

  • среди противолежащих пар выбрать максимальную.

2.2. Описание алгоритма

Алгоритм нахождения диаметра множества:

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

  2. Сначала находятся две крайние по оси абсцисс точки выпуклой оболочки. Если есть несколько «левых» точек, то среди них берется точка с максимальной ординатой. Если есть несколько «правых» точек, то среди них берется точка с минимальной ординатой. Эти точки выбираются в качестве текущих (P и Q).

  3. Повторяется последовательность действий, приведенная ниже, пока точка Q не окажется самой левой, а точка P – самой правой.

  • в качестве «претендента» на роль диаметра рассматривается пара [P,Q];

  • рассматриваются углы наклона прямых:

<P,next(P)> и <next(Q),Q>

next(A) - следующая после A по часовой стрелке вершина выпуклой оболочки

  • если угол1<угла2, то P=next(P)

  • если угол1>угла2, то Q=next(Q)

  • если угол1=углу2, то:

  • в качестве «претендентов» на роль диаметра рассматриваются пары [next(P),Q] и [P,next(Q)]

  • P=next(P) и Q=next(Q)

Соседние файлы в папке doc