Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_и_Пр_Бизнес_лекции.doc
Скачиваний:
84
Добавлен:
10.05.2015
Размер:
1.21 Mб
Скачать

Основные достоинства в-дерева:

  1. В дереве полезное использование пространства внешней памяти свыше 50%. За счет выделения под дерево памяти с запасом необходимость балансировки дерева по высоте возникает не очень часто.

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

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

10.3. Графы

10.3.1. Определения

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

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

Взвешенный орграф – это орграф, дуги которого имеют значения (вес). Взвешенный орграф изображен на рис. 5.

Рис. 5. Взвешенный орграф

Для представления ориентированного графа в программе используются различные структуры данных [3, 4]. Выбор способа представления графа зависит от операций, которые будут выполняться над вершинами и дугами графа. Любой из способов должен описывать данные графа:

  • количество вершин;

  • метки вершин;

  • связи вершин (наличие дуг между вершинами);

  • веса дуг, для взвешенного графа.

Наиболее часто используются следующие представления графа:

  • матрица смежности;

  • списки смежности.

10.3.2. Реализация графа с помощью списков смежности

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

  • количество вершин – целым числом (n);

  • метки вершин, связи вершин и веса дуг – массивом из n структур, каждая из которых имеет 2 поля: метку вершины и указатель на список смежности.

Список смежности для i-вершины – это список всех вершин графа, смежных с вершиной i с указанием веса дуг от i вершины до смежных с ней. На рис. 6 приведены списки смежности для вершин графа, изображенного на рис. 5.

1: 2 (7), 3 (9)

3: 6 (2)

4: 2 (15), 3 (11), 5 (6)

6: 1 (14), 5 (9)

Рис. 6. Списки смежности для вершин графа

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

struct element

{

int name; //метка смежной вершины, может быть и другого типа

int value; //вес дуги к смежной вершине

element *next; //указатель на следующий элемент списка

};

Тип вершины графа – это структура:

struct vertex

{

int name; //метка вершины

element *next; //указатель на начало списка смежности

};

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

  • создание массива из n вершин графа и пустых списков смежности;

  • добавление дуги;

  • вывод графа в виде списка смежных вершин каждой вершины;

  • получение номера вершины по ее метке.

Метки вершин графа заданы символами.

#include <iostream.h>

#include <conio.h>

struct element //тип элемента списка смежности

{

char name; //метка смежной вершины

int value; //значение дуги к смежной вершине

element *next; //указатель на следующий элемент

};

struct vertex //тип вершины графа

{

char name; //метка вершины

element *next; //указатель на начало списка смежности

};

//Создание массива вершин v[n] спустыми списками смежности

void create (vertex v[ ],int n);

//Добавление дуги между вершинами char1 и char2 с весом х

void add(vertex v, char name1,char name2, int x);

//Вывод графа

void output(vertex v,int n);

//Получение индекса вершины по ее метке

int get_v(vertex v[ ], int n, char name);

сonst int size=10; //максимальное количество вершин графа

void main()

{

vertex v[size]; //массив вершин

int n; //количество вершин

int m; //количество дуг

int x; //вес дуги

char name1,name2; //метки вершин

cout<<”n? “; cin>>n;

create (v,n);

//Ввод дуг

cout<<”m? “; cin>>m;

for (int i=0; i<m; i++)

{

cout<<”name1? “; cin>>name1;

cout<<”name2? “; cin>>name2;

cout<<”x? “; cin>>x;

add(v,name1,name2, x);

}

output(v,n); //вывод графа

getch();

}

void create (vertex v[ ], int n)

{

char name;

for (int i=0; i<n; i++)

{

cout<<”name? “; cin>>name;

v[i].name=name;

v[i].next=0;

}

}

void add(vertex v, char name1, char name2, int x)

{

int i,j;

element*p;

p=new element;

p->name=name2;

p->value=x;

i=get_v(v,n,name1);

if(i==-1)

{cout<<”error”<<endl; return;}

p->next=v[i]->next;

}

void output(vertex v, int n)

{

element*p; //указатель на элемент списка смежности

for (int i=0; i<n; i++) //цикл по спискам смежности

{

cout<v[i].name<<' ';

p=v[i].next;

while (p!=0) //цикл по i-списку смежности

{

cout<<p->name<<’ ‘<<p->value<<” “; //вывод метки вершины

p=p->next;

}

cout<<endl; //вывод i-списка с новой строки

}

cout<<endl;

}

int get_v(vertex v[ ], int n, char name)

{

for (int i=0;i<n; i++)

if (v[i].name==name)

return i; //возвращение индекса вершины

return -1;

}