Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмы и структуры данных. Учебное пособие по направлению подготовки 09.03.02 «Информационные системы и технологии»
.pdf
добавление элемента в левый конец дека;
добавление элемента в правый конец дека;
извлечение элемента из левого конца дека;
извлечение элемента из правого конца дека;
проверка пустоты дека;
очистка дека.
Красно-черные деревья
Бинарные деревья работают лучше всего, когда они сбалансированы,
когда длина пути от корня до любого из листьев находится в определенных
пределах, связанных с числом вершин. Красно-черные деревья являются
одним из способов балансировки деревьев. Название происходит от стандартной раскраски узлов таких деревьев в красный и
черный цвета. Цвета
вершин используются при балансировке дерева.
Красно-черное дерево ( Red-Black-Tree, RB-Tree ) – это бинарное дерево
со следующими свойствами (рис. 14):
каждая вершина должна быть окрашена либо в черный, либо в крас-
ный цвет;
корень дерева должен быть черным;
листья дерева должны быть черными и объявляться как NIL-вершины
(NIL-узлы, то есть "виртуальные" узлы, наследники узлов, которые обычно
называют листьями; на них "указывают" NULL указатели);
каждый красный узел должен иметь черного предка;
на всех ветвях дерева, ведущих от его корня к листьям, число черных
вершин одинаково.
Рис. 14. Красно-черное дерево
Количество черных вершин на ветви от корня до листа называется
черной высотой дерева. Перечисленные свойства гарантируют, что самая
длинная ветвь от корня к листу не более чем вдвое длиннее любой другой
ветви от корня к листу.
21

Над красно-черными деревьями можно выполнять все те же основные
операции, что и над бинарными деревьями.
Итоги:
1. Особенности указателей в языке С++ позволяют строить динамичес-
кие структуры памяти на основе статически объявленных переменных или
на смеси статических и динамических переменных.
2. Циклический (кольцевой) список является структурой данных,
представляющей собой
последовательность элементов, последний элемент
которой содержит указатель на первый элемент списка, а первый (в случае
двунаправленного списка) – на последний.
3. Основными операциями с циклическим списком являются: создание
списка; печать (просмотр) списка; вставка элемента в список; удаление
элемента из списка; поиск элемента в списке; проверка пустоты списка;
удаление списка.
4. Дек
является структурой данных, представляющей собой последовательность элементов, в которой можно добавлять и удалять в произвольном порядке элементы с двух сторон. Первый и последний элементы
дека соответствуют входу и выходу дека.
5. Частные случаи дека – это ограниченные деки.
6. Основными операциями с деком являются: создание дека; печать
(просмотр) дека;
добавление элемента в левый конец дека; добавление
элемента в правый конец дека; извлечение элемента из левого конца дека;
извлечение элемента из правого конца дека; проверка пустоты дека; очистка дека.
7. Красно-черные деревья являются одним из
способов балансировки деревьев, что определяется
свойствами данной структуры.
8. Над красно-черными деревьями можно
выполнять все те же основные операции, что и над
бинарными деревьями.
9. При вставке/удалении элемента необходима
поддержка баланса дерева через проверку и перекрашивание узлов при необходимости.
Бор
Бор, также именуемый «префиксное дерево» –
это древовидная структура данных, которая
особенно эффективна при решении задач на строки.
Она обеспечивает быстрое извлечение данных и
чаще всего применяется для поиска слов в словаре,
Рис. 15. Бор
автозавершений в поисковике и даже для IP-маршрутизации.
22

Вот как три слова «top» (верх), «thus» (следовательно), and «their» (их)
хранятся в бору:
Слова располагаются в направлении сверху вниз, и зеленые узлы «p»,
«s» и «r» завершают, соответственно, слова «top», «thus» и «their».
Хеш-таблица
Хеширование – это процесс, применяемый для уникальной идентификации объектов и сохранения каждого объекта по заранее вычисленному
индексу, именуемому его «ключом». Таким образом, объект хранится в
виде «ключ-значение», а коллекция таких объектов называется «словарь».
Каждый объект можно искать по его ключу. Существуют разные структуры данных, построенные по принципу хеширования, но чаще всего из
таких структур применяется хеш-таблица.
Как правило, хеш-таблицы реализуются при помощи массивов.
Производительность хеширующей структуры
данных зависит от следующих трех факторов:
Хеш-функция
Размер хеш-таблицы
Метод обработки коллизий
На рис.16 показано, как хеш отображается на
массив. Индекс этого массива вычисляется при помощи хеш-функции.
Рис. 16. Отображение
хеш на массив
1.3. Информация и ее представление в памяти ЭВМ
Базовой единицей информации является бит, который может принимать одно из двух взаимоисключающих значений. Для представления двух
возможных состояний некоторого бита используются двоичные цифры –
нуль и единица [слово «бит» (английское bit) есть сокращение от английских слов «двоичная цифра» (binary digit)]. Более крупной единицей информации является байт. Группы смежных битов объединяются в поле
Поле, состоящее из 8 битов называется байтом, причем левый двоичный
разряд имеет наибольший вес и считается старшим разрядом, а правый
разряд – наименьший вес (младшим разрядом). Нумерация разрядов байтов
осуществляется слева направо и начинается с нуля. Кроме 8 информационных битов байт может содержать дополнительный контрольный бит
четности.
Группа смежных байтов образуют поле
байтов, характеризующееся
длиной поля – числом входящих в него байтов и адресом поля – адресом
старшего, самого левого, байта в поле, т.е. байта с наименьшим адресом. В
.
23

общем случае поле байтов может иметь произвольную длину и адрес. Для
некоторых частных видов полей имеются специальные названия:
– полуслово (для поля, имеющего длину 2 байта),
– слово (4 байта) и
– двойное слово (8 байт).
Возможно также четверное слово, состоящее из двух двойных слов.
Размер слова может определяться разрядностью системы. В 32-разрядной
системе
слово будет состоять из 4-х байт, а полуслово – из 2-х и, таким
образом, не будет совпадать с байтом.
Поле байтов длиной 1024 байт имеет специальное обозначение –
1 Кбайт, кроме того поле длиной 10241024 байт обозначается через
1 Мбайт, а поле длиной 102410241024 через 1Гбайт. Следует обратить
внимание на то, что хотя здесь
используются традиционные десятичные
приставки «кило», «мега» и «гига» (а также, возможно, «тера»), они имеют
значения не степеней числа 10 (10
10
степеней числа 2 (2
(кибибайт), 220=210210 (мебибайт) и 230 = 210210210
3
, 106 и
109
соответственно), а значения
(гибибайт)). Такое использование десятичных приставок в двоичной
системе счисления иногда приводит к неоднозначному толкованию
значений данных. Например, емкость накопителей на жестких дисках
может быть обозначена именно в десятичной системе счисления, и тогда
объем в 10 Гбайт будет означать 10.000.000.000 байт, а не 10.737.418.240
байт. Как видно, разница составляет более 700 миллионов байт!
Контрольные вопросы
1. Что означает понятие «структуры данных»?
2. По каким признакам классифицируются структуры данных?
3. На каких уровнях рассматриваются структуры данных?
4. Поясните различие между уровнями структур данных.
5. Как структуры данных различаются по сложности? Приведите при-
меры структур данных различной степени сложности.
6. Какие структуры данных обладают линейной архитектурой?
7. Как структуры данных различаются
по архитектуре? Приведите
примеры структур данных различных архитектур.
8. Какие структуры данных обладают прямоугольной архитектурой?
9. Что может означать термин «динамическая структура данных»?
10. Что означает термин «связная структура данных»?
11. Какие структуры данных являются связными?
12. Как структуры данных различаются по месту размещения в памяти?
13. К каким структурам данных относятся файлы?
14. Пусть имеется 32-разрядная вычислительная система, в которой
действительное число занимает двойное машинное слово. Сколько байт занимает в памяти массив, содержащий 2K действительных чисел
(1K = 1024)?
24

2. ПОНЯТИЕ АЛГОРИТМА
2.1. Этапы решения задач на ПК
Процесс решения любой задачи на компьютере содержит ряд этапов:
1. Постановку задачи,
2. Выбор метода решения,
3. Разработку алгоритма,
4. Составление программы,
5. Отладку программы,
6. Анализ результатов.
Постановка задачи – процесс формулирования задачи с указанием
входной и
Выбор метода решения – процесс построения математической модели
задачи,
ваются в виде
Разработка алгоритма или алгоритмизация – процесс построения
алгоритма
Составление программы – процесс записи составленного алгоритма
на одном
Отладка программы – процесс исправления синтаксических и семан-
тических
работоспособности на
программы.
Анализ результатов – это процесс изучения результатов работы программы и
Если результаты сильно
уточняют математическую модель
ем задачи полученный с помощью программы
Процесс решения практически любой задачи сложен уже потому, что
он всегда
ния первые два этапа в
так как во многих случаях точная корректная формулировка задачи, построение адекватной математической модели
ность в поиске метода решения задачи, который, в конечном
дит к составлению алгоритма. При этом следует отметить, что какихнибудь однозначных рекомендаций для выполнения первого этапа не
существует.
Истоки алгоритмизации лежат в сугубо теоретической области современной
ция является набором
выходной информации и ее цели.
в которой связи между входными и выходными данными записы-
математических соотношений.
решения задачи выбранным методом.
из языков программирования.
(смысловых) ошибок в тексте программы, а также проверка ее
контрольном примере, то есть, тестирование
их сопоставления с предполагаемыми (если таковые имеются).
разнятся, то возвращаются ко второму этапу и
задачи, если – нет, считают решени-
результат.
включает извечную проблему: как ее решать? С этой точки зре-
конкретной ситуации могут оказаться решающими,
составляют основную труд-
счете, и приво-
математики – теории алгоритмов, однако, сама алгоритмиза-
определенных практических приемов.
25

В подавляющем большинстве случаев результат деятельности человека
прямо зависит от того, насколько четко он прогнозирует алгоритмическую
сущность
своих действий, а именно:
Что делать в каждый момент?
В какой последовательности делать?
Каким должен быть результат деятельности? и т.д.
Все это определяет особый аспект логики мышления и поведения
человека,
характеризующий умение составлять и использовать различные
алгоритмы. Понятие алгоритма и исполнителя числа, алгоритм нахождения НОД
двух чисел и т.д.
В настоящее время понятие алгоритма применяется практически во
всех областях человеческой деятельности, например, такие фразы, как
алгоритм
выхода из лабиринта
речи телекомментаторов, и в
управления классом, алгоритм шахматной игры, алгоритм поиска
встречаются и в печатных изданиях, и в устной
специальной литературе.
С понятием алгоритма непосредственно связано понятие исполните-
алгоритма, так как любой алгоритм составляется в расчете на конк-
ля
ретного
исполнителя.
Исполнитель алгоритма – это некоторая абстрактная или реальная
(техническая, биологическая или биотехническая) система, способная
выполнить
действия, предписываемые алгоритмом.
Им может быть:
Человек;
Группа людей;
Робот;
Программа;
Компьютер.
Важнейшим свойством любого исполнителя является то, что он может
выполнять некоторые команды, например:
Исполнитель человек – «включить ПК», «сравнить число с 0», «сло-
жить числа»; «извлечь корень»;
Исполнитель собака – «встать», «лечь», «искать», «фу»;
Исполнитель компьютер – «загрузить файл», «скопировать файл»,
«перезагрузить систему», «завершить работу».
Совокупность команд, которые может выполнить исполнитель,
называется системой команд исполнителя (СКИ).
В зависимости от задачи, для решения которой составляется алгоритм,
указания
командами, поэтому
алгоритма еще называют директивами, шагами, операторами,
интуитивное понятие алгоритма можно сформули-
ровать и так:
26

Под алгоритмом понимается последовательность упорядоченных,
корректных
жен выполнить
Алгоритм должен быть составлен таким образом, чтобы исполнитель, точно
Это накладывает на указания алгоритма ряд требований, которые
называются свойствами алгоритма.
1. Дискретность ( прерывность).
Алгоритм должен являться упорядоченной совокупностью отделенных
друг от
что предполагает,
нении разделяются ненулевым
алгоритма часто подчеркивается нумерацией
2. Определенность (детерминированность).
Алгоритм не может содержать указаний, смысл которых может
восприниматься
бодно принимаемых решений,
няемое разными исполнителями, должно давать
3. Понятность.
Алгоритм содержит только те указания (команды), которые входят в
СКИ
исполнителя этого алгоритма.
4. Массовость.
Алгоритм должен быть применим для решения не одной задачи, а для
целого
печивает возможность
ных для одной задачи. Если же
ритм в силу свойства определенности будет
же результат и само построение алгоритма в этом случае
задачи
вникая в
смысла.
5. Результативность ( конечность)
При точном исполнении всех указаний алгоритма результат решения
6. Формальность
Все указания алгоритма исполнитель должен выполнять формально, не
указаний (команд, операторов, шагов, директив), которые дол-
исполнитель для достижения поставленной цели.
Свойства алгоритмов
следуя его указаниям, должен получить результат.
друга указаний, образующих дискретную (прерывную) структуру,
что два любые последовательные указания при испол-
промежутком времени. Дискретность
указаний.
исполнителем неоднозначно или требовать от него сво-
то есть, одно и то же указание, выпол-
один и тот же результат.
класса задач одного типа. В простейшем случае массовость обес-
использования различных наборов исходных дан-
исходные данные уникальны, то алго-
давать всегда один и тот
теряет смысл.
должен быть получен за конечное число шагов.
смысл того, что он делает и даже, возможно, не понимая этого
Контрольные вопросы
1. В какой науке содержится точное определение алгоритма?
2. Приведено ли оно в этом разделе?
27

3. Как формулируется «интуитивное понятие» алгоритма?
4. Какова история его появления?
5. Где в настоящее время используется понятие алгоритма?
6. Что или кто называется исполнителем алгоритма?
7. Что или кто может быть исполнителем алгоритма?
8. Что такое СКИ?
9. Как по-другому можно назвать указания алгоритма?
11. Как еще можно
12. Сколькими свойствами должен обладать алгоритм?
13. Что понимается под дискретностью алгоритма? Как по-другому
называется дискретность?
14. Что понимается под определенностью алгоритма? Как по-другому
называется определенность?
15. Что понимается под понятностью алгоритма?
16. Что понимается под массовостью алгоритма?
17. Что понимается под результативностью алгоритма? Как
называется результативность?
18. Что понимается под формальностью алгоритма?
сформулировать понятие алгоритма?
по-другому
28

3. СПОСОБЫ ЗАПИСИ АЛГОРИТМОВ
В настоящее время существуем много языков для записи алгоритмов,
называются алгоритмическими.
они
Алгоритмический язык – это совокупность символов и правил их
написания,
Выбор языка в каждом конкретном случае зависит от двух факторов:
1. На какого исполнителя – человека или автоматическое устройство
рассчитан
2. Какие команды входят в систему команд исполнителя (СКИ).
Для записи алгоритмов, рассчитанных на исполнение автоматическими
специальные
теля – человека. Такие записи не полностью формализованы, так как
для людей важны
ких алгоритмов используют
устройствами, нужна полная формализация, для этого используют
Рассмотрим способы записи алгоритма, рассчитанные на исполни-
используемых для записи алгоритмов.
алгоритм.
алгоритмические языки (Паскаль, СИ, Бейсик).
понятность и наглядность, поэтому для записи та-
естественный или графический язык.
3.1. Словесная форма записи алгоритмов
В словесной форме указания (команды) алгоритма записываются в ви-
пронумерованных предложений на каком-либо языке – русском, англий-
де
ском,
который
больший натуральный
лагается, что исполнителю алгоритма
перейти к шагу
к ш. 1.
нителя
свойством
арабском, японском и т.д.
Пример 1. Записать в словесной форме известный алгоритм Евклида,
относится к математическим алгоритмам и позволяет найти наи-
делитель (НОД) двух натуральных чисел. Предпо-
эти числа заданы.
1. Сравнить числа по величине и перейти к шагу 2.
2. Если они равны, то НОД положить равным первому из чисел и
5, иначе (т.е., если числа не равны), перейти к шагу 3.
3. Определить большее из чисел и перейти к шагу 4.
4. Заменить большее число на разность большего и меньшего и перейти
5. Записать значение НОД и перейти к шагу 6.
6. Закончить процесс.
Рассмотрим свойства этого алгоритма
1. Он дискретен,
2. Все указания имеют однозначный смысл и не требуют от испол-
решений, не предусмотренных алгоритмом, значит, он обладает
определенности.
3. Алгоритм понятен исполнителю, который умеет:
сравнивать два числа;
так как состоит из 6 отдельных указаний (шагов).
29

определять большее из двух чисел;
находить разность двух чисел.
Значит, алгоритм обладает свойством понятности.
4. Алгоритм позволяет найти НОД для любых двух натуральных чисел,
значит,
он обладает свойством массовости.
5. Для любой пары чисел алгоритм позволяет найти НОД за конеч-
ное число
указаний (шагов), поэтому он результативен.
6. Алгоритм может выполнить исполнитель, умеющий выполнять
команды,
такое НОД, значит,
перечисленные в свойстве 3, но, который может и не знать, что
алгоритм обладает свойством формальности.
Пример 2. Имеются три контейнера – черный, белый и полосатый. В
полосатом
весный алгоритм,
контейнере находятся белые и черные шары. Составить сло-
позволяющий разложить шары по контейнерам, соответ-
ствующим цвету шаров.
1. Достать шар из полосатого контейнера и перейти к шагу 2.
2. Если он белый, перейти к шагу 3, иначе перейти к шагу 4.
3. Опустить шар в белый контейнер и перейти к шагу 5.
4. Опустить шар в черный контейнер и перейти к шагу 5.
Если в полосатом контейнере еще есть шары, то перейти к шагу 1,
5.
иначе
перейти к шагу 6.
6. Закончить процесс.
Рассмотрим свойства этого алгоритма
1. Он дискретен, так как состоит из 6 отдельных указаний (шагов).
2. Все указания имеют однозначный смысл и не требуют от испол-
нителя
свойством
решений, не предусмотренных алгоритмом, значит, он обладает
определенности.
3. Алгоритм понятен исполнителю, который умеет различать черный
и белый
свойством
цвета, понимает значение термина полосатый, значит, он обладает
понятности.
4. Алгоритм позволяет разложить по контейнерам любое количество
шаров,
значит, он обладает свойством массовости.
5. Для любого количества шаров алгоритм позволяет разложить их за
конечное число шагов, поэтому он результативен.
6. Алгоритм формален, так как не требует от исполнителя никаких
знаний и
размышлений по поводу производимых действий.
3.2. Запись алгоритма в виде формулы
Математические формулы вместе с правилами их написания пред-
ставляют
собой своеобразный алгоритмический язык.
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
