Наша задача :

 1.Найти отображение АСД -> СДХ;

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

1. Отображения на вектор.

 Будем предполагать что мы имеем дело с неотсортированными структурами. Подробно что означает условие сортированности мы рассмотрим в разделе IV "Сортировка."

1.1. Строка

 Отображение строки на вектор строится так:

1. Возьмем антитранзитиное отношение R' такое что его транзитивное замыкание дает R (для этого достаточно рассмотреть отношение линейного порядка R без условия 2 - условия транзитивности :

 если (a, b) и (b, c) принадлежат R, то (a, c) тоже принадлежит R;

Ясно что R' задает отношение соседства, т.е. (a,b) принадл. R' если и только если

 Не существ. c: c принадл. M , (a,c)принадл.R' и (c,b)принадл.R'

2.Возьмем минимальный элемент в строке (он существует в силу свойства отношения линейного порядка R); пусть это a;

3.Элементу a сопоставим первый компонент вектора: I(a)=1;

4.Паре (b,c)принадл.R' сопоставим I(c)=I(b)+1.

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

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

Рассмотрим сложность операций поиска, вставки, удаления и замены. Операции вставки, удаления и замены содержат операцию поиска как составную часть.

 Предполагаем что частота встречаемости всех элементов в строке одна и та же. Тогда в среднем (когда мы имеем дело с множеством строк,а не с одной, двумя) нам придется просомтреть половину строки, чтобы найти нужный символ: (1/N)+(1/N)2+(1/N)3+...+(1/N)N= (N+1)/2 = ~N/2

Отсюда следует сложность поиска (количество операций сравнения) пропорциональна половине длины строки.

 Для операции вставки сложность проворциональна длине строки. Действительно, нам надо N/2 сравнений, чтобы найти место для вставки, а затем N/2 сдвигов вправо, чтобы освободить место для нового элемента.

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

 Нетрудно подсчитать сложность операции замены - N/2+1.

Основной вывод состоит в том, что при отображении строки на вектор все операции со строкой имеют линейную сложность, пропорциональную длине строки.

1.2. Граф (дерево)

 Отображение графа на вектор строится через метрицу смежности или матрицу инцидентностей. В Pascal, где есть двумерные массивы такое представление графа очевидно. (См. представление лабиринта в задаче об Ариадне и Тезее.) При отображении на вектор возможно два подхода: отображение по строкам или по столбцам.

 Здесь мы рассмотрим случай отображения по строкам. Случай отображения по столбцам полностью аналогичный. При отображении по строкам элементу матрицы A[i,j] сопоставляется элемент вектора V[k], где

 k=(i-1)n + j, где n - длина строки.

Теперь оценим сложность операции поиска. Нам придется просмотреть в среднем половину строк - N/2, и половину элементов в каждой строке - N/2 при условии что часто встречаемости всех элементов одинакова. Таким образом сложность операции поиска пропорциональна N^2 /4 или N^2 при больших N.

 Однако при оперции удаления нам не надо сдвигать все элементы как в случае со строкой. Однако, операция вставки трубет изменения размерности матрицы смежности по каждому измерению с N на N+1. Для этого нам придется выполнить (N+1) операций присваивания, чтобы заполнить новую строку в векторе, плюс N+1 сдвигов строк, чтобы добавить к каждой старой строке по новому элементу, соответствующему N+1 столбцу. Количество операций сдвига определяется следующим соотношением:

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

 N^2/4 + N^3/2 = N^2(N+2)/2.

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

 Для k-ичного дерева можно предложить специальный способ отображения на вектор. Компоненту V[0] сопоставляем корню дерева; компоненты V[1]...V[k] сопоставляем потомкам корня, затем с V[k+1] по V[2k] размещаем потомков V[1], с V[2k+1] - V[3k] - потомков V[2] и т.д. В общем случае потомки i-ой вершины, расположенной на j ярусе, будет размещаться в компонентах вектора

 с V[k(k^j -1)/(k-1)+ (i-1)k] компонента

 по V[k(k^j -1)/(k-1)+ ik] компонент.

Оценим сложность операции поиска при таком отображении дерева на вектор. Учитывая, что высота k-ичного дерева из N вершин равна

 H = log (N(k-1)+1) - 1 ~log(k) N

получаем что число листьев в таком дереве ~ N^2. Отсюда, при условии равновстречаемости элементов в дереве, нам надо просмотреть в среднем половину путей (их число равно чмслу листьев в дереве) длины H каждый. Эти рассуждения дают нам величину

 ~ Nlog(k) N.

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


Информация о работе «Отображение АСД на СДХ»
Раздел: Информатика, программирование
Количество знаков с пробелами: 16353
Количество таблиц: 0
Количество изображений: 2

Похожие работы

Скачать
10916
0
0

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

0 комментариев


Наверх