русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Лекция № 7 Виды бинарных отношений


Дата добавления: 2014-05-29; просмотров: 1323; Нарушение авторских прав


Пример. Использование бинарного дерева для сортировки данных

Допустим дана последовательность чисел, например:

• 15 10 20 12 8 17 25 5 9

Вывести числа в порядке возрастания:

• 5 8 9 10 12 15 17 20 25

Построим бинарное дерево: первое число будет корнем дерева. Если второе число < 1-го, то оно станет корнем левого поддерева, а если > 1-го, то станет корнем правого поддерева. Каждое следующее число будет добавляться либо в левое поддерево, либо в правое.

Алгоритм:

1. Создание бинарного дерева в виде регулярной сети.

2. Обход дерева слева направо и вывод меток его вершин (чисел).

3. Удаление дерева (освобождение памяти).

Программа

#include <stdio.h>

#include <stdlib.h>

/* Описание бинарного дерева в виде регулярной сети */

// Тип вершины дерева (элемента сети)

struct TREE

{ float number; // число

struct TREE *left, *right; /* указатели на левое и правое поддеревья*/

};

// Прототипы функций

void insert (struct TREE *pt, float x);

void print_tree (struct TREE *pt);

void delete_tree (struct TREE *pt);

/*--------------------------------------*/

/* Главная функция */

/*--------------------------------------*/

void main()

{ struct TREE *pt; // указатель на корень дерева

float x; // очередное число

puts ("\nВведите числовую последовательность");

scanf("%f", &x);

// создание корня дерева

pt = (struct TREE *) malloc (sizeof(struct TREE));

pt->number=x;

pt->left=pt->right=NULL;

// ввод чисел и формирование дерева while (scanf("%f", &x) != EOF)

insert (pt,x);

// обход дерева и печать результата

puts ("Результат:");

print_tree (pt);

// удаление дерева

delete_tree (pt);

}

/*---------------------------------------------------------------------*/



/* Функция включения новой вершины в дерево */

/*---------------------------------------------------------------------*/



void insert (struct TREE *pt, float x)

// pt - указатель на корень дерева

// x – число - метка новой вершины

{ struct TREE *i, /* указатель на текущую вершину дерева */

*parent; /* указатель на вершину- родителя для новой вершины */

int dir; /* признак включения новой вершины

в левую или правую ветвь */

/* спуск по дереву и поиск вершины- родителя для новой вершины*/

i = pt;

while (i != NULL)

{ parent = i;

if (x < i->number) { // спуск влево

i = i->left; dir = 0; }

else { // спуск вправо

i = i->right; dir = 1; } }

/* создание новой вершины */

i = (struct TREE *) malloc (sizeof (struct TREE));

i->number = x;

i->left = i->right = NULL;

/* включение новой вершины в левую или правую ветвь родителя*/

if (dir == 0) parent->left = i;

else parent->right = i; }

/*---------------------------------------------------------------------*/



/* Рекурсивная функция обхода дерева слева */

/* направо и печати его вершин */

/*---------------------------------------------------------------------*/



void print_tree (struct TREE *pt)

/* pt - указатель на корень дерева (поддерева) */

{ if (pt)

{ print_tree (pt->left);

printf ("%f ", pt->number);

print_tree (pt->right);

}

}

/*-----------------------------------------------------------------*/

/* Рекурсивная функция обхода дерева снизу */

/* вверх и удаления его вершин */

/*-----------------------------------------------------------------*/

void delete_tree (struct TREE *pt)

// pt - указатель на корень дерева (поддерева)

{ if (pt)

{ delete_tree (pt->left);

delete_tree (pt->right);

free (pt);

}

}

 

 

Три способа обхода бинарного дерева

Прямой обход (обход сверху вниз):

1. Корень
2. Левое поддерево
3. Правое поддерево

Внутренний обход (обход слева направо):

1. Левое поддерево
2. Корень
3. Правое поддерево

Обратный обход (обход снизу вверх):

1. Левое поддерево
2. Правое поддерево
3. Корень

Дерево выражения и способы его обхода

 

Лекция № 7 Виды бинарных отношений

Цель:рассмотреть основные виды бинарных отношений (эквивалентность, отношение порядка, толерантность)

Бинарное отношение может иметь одновременно не­сколько свойств. Некоторые сочета­ния этих свойств определяют особенно интересные отношения, наиболее часто встречающиеся как на практике, так и в математических теориях.

1 Отношения эквивалентности

При поломке какой-нибудь де­тали автомобиля ее заменяют другим экземпляром той же детали. Различные экземпляры одной и той же детали неотличимы друг от друга; они, как говорят, эквивалентны (равноценны). Точно так же эквивалентны все монеты одного и того же достоинства и года вы­пуска, все костюмы одной и той же модели и размера, сделанные из одинакового материала, и т. д.

Не всегда эквивалентность сводится к простой одинаковости. Например, если требуется уплатить сумму в 1 руб., то бумажный и металлический рубли эквивалентны друг другу, равно как и 5 двадцатикопеечных монет, или 20 пятачков. В физике считаются эквивалентными взаимозаменяющие друг друга количества энергии (например, 1 ккал эквивалентна 4190 Дж и т.д.).

Выясним, какими общими свойствами обладает отношение вза­имозаменяемости объектов. Во-первых, ясно, что каждый объект может сам себя заменить. Это значит, что для всех х должно выпол­няться отношение xRx, т. е. отношение взаимозаменяемости долж­но быть рефлексивным. Во-вторых, если х взаимозаменяемо с у, то и у взаимозаменяемо с х. Иными словами, если xRy, то и yRx, а потому R симметрично. Наконец, если х взаимозаменяемо с у, а у взаимозаменяемо с z, то х взаимозаменяемо с z. Иными словами, из xRy и yRz следует xRz, т. е. R транзитивно.

Итак, отношение взаимозаменяемости должно обладать свойст­вами рефлексивности, симметричности и транзитивности. Эти свой­ства характеризуют взаимозаменяемость, и потому мы вводим сле­дующее определение:

Отношением эквивалентности в множестве X называется любое рефлексивное, симметричное и транзитивное отношение R.

Приведем примеры таких отношений.

Пример 1. Отношение равенства геометрических фигур рефлексивно (каждая фигура сама себе равна), симметрично (если фигура х равна фигуре у, то и фигура у равна фигуре х) и транзитивно (если фигура х равна фигуре у, а фигура у – фигуре z, то х и z равна). Значит, отношение равенства – эквивалентность в множестве геометрических фигур.

Пример 2. Отношение подобия геометрических фигур также является отношением эквивалентности.

Пример 3. Отношение параллельности прямых также обладает свойствами рефлексивности, симметричности и транзитивности, а потому является отношением эквивалентности в множестве прямых.

Пример 4. Отношение равносильности двух уравнений рефлексивно (каждое уравнение равносильно самому себе), симметрично (если одно уравнение равносильно другому, то и второе равносильно первому) и транзитивно. Значит, оно является эквивалентностью в множестве уравнений.

Пример 5. Отношение равенства дробей тоже является эквивалент­ностью. В самом деле, дроби и равны в том и только в том случае, когда ad = bс. Легко проверяется, что (наше равенство принимает вид: аb = аb) и что из = следует = (из ad = be следует cb = da). Докажем транзитивность этого отно­шения. Пусть = и = . Это значит, что ad = bc и сf = de. Но тогда adf = bcf и bcf = bde, а потому adf = bde. Отсюда получаем, что af = be, а это и значит = .

Отношение «жить в одном доме» является эквивалентностью в множестве людей (оно рефлексивно, симметрично и транзитивно), а отношение «жить на одной улице» эквивалентностью не является. Дело в том, что человек у может жить в угловом доме на пересече­нии двух улиц, а х и z – на этих улицах. Тогда х и у живут на одной улице, равно как у и z, но х и z живут на разных улицах. Не является эквивалентностью и отношение «служить в одном полку» в множестве военнослужащих. Оно симметрично и транзитивно, но не рефлексивно – есть военнослужащие, не принадлежащие ни­какому полку (например, моряки), и о них нельзя сказать, что они служат в одном полку сами с собой.

Множество всех учащихся данной школы разбито на классы 1А, 1Б, ..., 10Б. С этим разбиением свя­зано отношение «учиться в одном классе», являющееся эквива­лентностью.

Непересекающиеся множества, на которые разбивается множество М отношением эквивалентности, называются классами эквивалентности. Другими словами, классом эквивалентности, порожденным элементом х, называется множество всех элементов из М, вступающих с х в отношение эквивалентности. Множество всех различных классов эквивалентности называется фактор-множеством множества М по отношению к эквивалентности R и обозначается М \ R. Например, множество всех рациональных чисел Q можно разбить на классы эквивалентности, для которых – рациональная дробь, где

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



<== предыдущая лекция | следующая лекция ==>
Лекция №7 Создание и обход бинарного дерева | Отношения порядка


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.005 сек.