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

Структуры и алгоритмы обработки данных. Часть 1. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Р.В. БАТИЩЕВ
СТРУКТУРЫ И АЛГОРИТМЫ
ОБРАБОТКИ ДАННЫХ
УЧЕБНОЕ ПОСОБИЕ
Липецк
Лип. гос. тех. ун-т
2014
УДК 004.4(07) Б 282
Рецензенты:
кафедра технологий обработки и защиты информации факультета
компьютерных наук Воронежского государственного университета;
канд. техн. наук, доц. Гончаров И.В.
Батищев Р.В.
Б282 Структуры и алгоритмы обработки данных. Часть 1 [Текст]: учеб._пос. /
Р.В. Батищев. - Липецк: Изд-во Липецкого государственного технического университета, 2014. – 89 с.
ISBN 5-88247-716-6
Учебное пособие предназначено для студентов, изучающих курс
"Структуры и алгоритмы обработки данных" и представляет собой первую часть
практического руководства к проведению лабораторных работ по дисциплине
"Структуры и алгоритмы обработки данных". В учебном пособии
рассматриваются вопросы внутримашинного представления данных и структур
разных типов, алгоритмы внутренней и внешней сортировки, организации и обработки динамических структур данных.
Пособие содержит теоретический материал с иллюстрациями алгоритмов
и примерами программ на языке программирования высокого уровня "Си".
Ил. 23. Библиогр. 8 назв.
Печатается по решению Редакционно-издательского совета.
ISBN 5-88247-716-6 © ФГБОУ ВПО "Липецкий государственный технический
университет", 2014
© Батищев Р.В., 2014
3
СОДЕРЖАНИЕ
ВВЕДЕНИЕ ...........................................................................................................
5
1. Типы данных и структуры данных .................................................................
7
1.1. Встроенные типы данных ..........................................................................
8
1.2. Уточняемые типы данных ........................................................................
12
1.3. Перечисляемые типы данных ..................................................................
13
1.4. Конструируемые типы данных ................................................................
14
1.4.1. Массивы ..................................................................................................
14
1.4.2. Записи ......................................................................................................
16
2.3. Обменная сортировка (сортировка перестановками) ............................
28
2.4. Метод Шелла .............................................................................................
30
2.5. Сортировка разделением (быстрая сортировка) ....................................
32
2.6. Сортировка двоичными включениями ....................................................
33
2.7. Сортировка со слиянием ...........................................................................
35
3. Алгоритмы внешней сортировки ....................................................................
37
3.1. Прямое слияние .........................................................................................
39
3.2. Естественное слияние ...............................................................................
40
3.3. Сбалансированное многопутевое слияние .............................................
42
4. Абстрактные типы данных ..............................................................................
44
4.1. Представление типа ..................................................................................
45
4.2. Реализация типа .........................................................................................
46
4.3. Инкапсуляция ............................................................................................
46
4.4. Наследование типов ..................................................................................
47
1.4.3. Множества ............................................................................................... 17
1.5. Указатели ................................................................................................... 17
1.6. Структуры данных .................................................................................... 21
2. Алгоритмы внутренней сортировки ............................................................... 24
2.1. Сортировка выбором ................................................................................. 26
2.2. Сортировка включением........................................................................... 27
4
4.5. Разновидности полиморфизма .................................................................
50
5. Работа с динамической памятью ....................................................................
51
5.1. Представление объектов в оперативной памяти, указатели .................
55
5.2. Динамические структуры .........................................................................
60
6. Линейные списковые структуры ....................................................................
65
6.1. Односвязный список .................................................................................
65
6.1.1. Создание элемента списка .....................................................................
66
6.1.2. Добавление узла .....................................................................................
67
6.1.3. Проход по списку ...................................................................................
68
6.1.4. Поиск узла в списке ...............................................................................
69
6.1.5. Алфавитно-частотный словарь .............................................................
70
6.1.6. Удаление узла .........................................................................................
71
6.2. Двусвязный список ...................................................................................
72
6.2.1. Операции с двусвязным списком .........................................................
73
6.3. Циклические списки .................................................................................
76
6.4. Стек, очередь, дек ......................................................................................
76
6.4.1. Стек ..........................................................................................................
76
6.4.2. Реализация стека с помощью массива .................................................
78
6.4.3. Обработка символьной строки с помощью стека ...............................
79
6.4.4. Реализация стека с помощью списка ...................................................
81
6.4.5. Системный стек в программах ..............................................................
82
6.4.6. Очередь ....................................................................................................
83
6.4.7. Реализация очереди с помощью массива .............................................
83
6.4.8. Реализация очереди с помощью списка ...............................................
85
6.4.9. Дек ............................................................................................................
86
7. Библиографический список .........................................................................
88
5
ВВЕДЕНИЕ
Как самые первые ЭВМ, так и современные компьютеры своей основной
задачей имеют обработку данных. Работа любой программы, в конечном итоге,
сводится к различного рода манипуляциям над числами, символами, информа-
ционными массивами и т.д. Они, в свою очередь, представляют собой некото-
рые структуры, хранимые в памяти ЭВМ.
Если рассматривать самый нижний уровень представления - физический,
то как программы, так и данные являются лишь множеством двоичных цифр.
Однако на более высоком уровне представления, используемом разработчика-
ми программного обеспечения, данные являют собой абстракции, уже далекие
от двоичного представления. Они принадлежат одному из определенных под-
множеств - типов данных, могут образовывать различного рода структуры, в
которых элементы способны иметь связи между собой. Понятия "тип данных" и
"структура данных" являются средствами, позволяющими повысить эффектив-
ность разработки программного обеспечения, давая возможность оперировать
более близкими человеку понятиями.
Любая программа, записанная на любом языке программирования, ис-
пользующая и изменяющая данные и структуры данных, представляет собой
один из способов записи алгоритма - последовательности действий, которую
нужно выполнить для получения результата. К настоящему времени разработа-
но огромное количество разнообразных алгоритмов для всех областей челове-
ческой деятельности, связанных с обработкой данных. Их знание и понимание
позволяет существенно облегчить и повысить эффективность решения задач
различного рода, связанных с организацией вычислений, управлением, плани-
рованием, прогнозированием и т.п.
Первая глава учебного пособия посвящена описанию существующих ти-
пов данных и структур, способам их представления в памяти ЭВМ, организа-
ции в программах.
6
Во второй главе рассмотрены некоторые популярные алгоритмы внут-
ренней сортировки (выбором, пузырьковая, Шелла, быстрая и т.д.), приведены
примеры и некоторые характеристики алгоритмов.
В третьей главе проиллюстрирован ряд алгоритмов внешней сортировки:
прямое слияние, естественное слияние и сбалансированное многопутевое слия­ние.
Четвертая глава вводит понятие абстрактных типов данных. Обозначены
вопросы, связанные с их представлением, реализацией, инкапсуляцией, насле-
дованием и полиморфизмом.
В пятой главе описаны правила организации и работы с динамической
памятью, вводится понятие указателей и динамических структур.
Шестая глава посвящена линейным списковым структурам: односвязный и двусвязный список, стек, дек, очередь. Показано их представление, способы их организации, возможные операции над ними.
Во всех главах теоретический материал подкреплен достаточным количе­ством иллюстраций и примеров.
7
1. Типы данных и структуры данных
Любая программа, предназначенная для реализации на ЭВМ, представля-
ет собой формальное описание алгоритма решения той или иной задачи. Дей-
ствия, выполняемые программой в соответствии с этим алгоритмом, направле-
ны на преобразование некоторых объектов, определяющих текущее состояние
процесса решения задачи. Такие внутренние объекты программы принято
называть данными. Для хранения всякого элемента данных выделяется необхо-
димое пространство в оперативной памяти ЭВМ, размер которого называется длиной этого элемента.
Важнейшей характеристикой любого элемента данных является его тип.
Понятие типа включает в себя такую информацию об элементе данных, как:
- допустимый набор значений, которые объект этого типа может при-
нимать в процессе работы программы;
- состав операций, которые разрешено выполнять над объектами данного
типа;
- способ представления элемента данных рассматриваемого типа в памяти
машины;
- правила выполнения всякой операции из допустимого для этого типа
набора операций.
Языки программирования высокого уровня, как правило, обеспечивают возможность представления и обработки данных следующих основных типов:
- целые числа различной длины со знаком и без;
- вещественные числа различной длины;
- символы.
Элементы данных, которые сохраняют неизменные значения на протяже-
нии всего времени работы программы, называют константами. Другие объекты,
являющиеся предметом изменения в ходе выполнения алгоритма, называются
переменными. С точки зрения языка программирования высокого уровня, вся-
8
кая переменная величина отождествляется с ее именем или идентификатором.
С позиции ЭВМ она рассматривается как изменяющееся во времени со­держимое некоторой области оперативной памяти.
1.1. Встроенные типы данных
Обычно в состав встроенных типов данных включаются такие типы, опе-
рации над значениями которых напрямую или, по крайней мере, достаточно эффективно поддерживаются командами компьютеров. К таким "машинным"
типам относятся целые числа разного размера, булевские значения и числа с
плавающей точкой одинарной и двойной точности. В более ранних компьюте-
рах часто поддерживалась десятичная арифметика с фиксированной точкой, но
в настоящее время прямая аппаратная поддержка такой арифметики отсутству-
ет практически во всех распространенных процессорах.
В соответствии с этим, в традиционный набор встроенных типов обычно
входят следующие:
1. Тип CHARACTER (или CHAR) в разных языках - это либо набор пе-
чатных символов из алфавита, зафиксированного в описании языка (для боль-
шинства языков англоязычного происхождения этот алфавит соответствует ко-
довому набору ASCII); либо произвольная комбинация нулей и единиц, разме-
щаемых в одном байте.
В первой интерпретации (свойственной языкам линии Паскаль) для зна-
чений типа CHAR определены только операции сравнения в соответствии с
принятым алфавитом. Например, при использовании ASCII выполняются соот-
ношения 0 < 1 < ...< 9 < A < B < ...< Z < a < b < ...< z; известно, что если значе­ние переменной x удовлетворяет условию 0 <= x <= 9, то это значение - цифра; если A <= x <= Z, то значение x - прописная буква; если a <= x <= z, то значение x - строчная буква и т.д. При использовании этой интерпретации арифметиче­ские операции над символьными значениями не допускаются.
9
Во второй интерпретации (свойственной языкам линии Си) литеральны-
ми константами типа CHAR по-прежнему могут быть печатные символы из
принятого в языке алфавита, но возможно использование и числовых констант,
задающих желаемое содержимое байта. В этом случае, как правило, над значе-
ниями типа CHAR возможно выполнение не только операций сравнения, но и
операций целочисленной арифметики.
В современных компьютерах, как правило, поддерживается целочислен-
ная байтовая арифметика, обеспечивающая как первую, так и вторую интерпре-
тацию типа CHAR.
2. Тип BOOLEAN в тех языках, где он явно поддерживается, содержит
два значения - TRUE (истина) и FALSE (ложь). Несмотря на то, что для хране-
ния значений этого типа теоретически достаточно одного бита, обычно в реали-
зациях переменные этого типа занимают один байт памяти. Для всех типов
данных, для которых определены операции сравнения, определены также и
правила, по которым эти операции сравнения вырабатывают булевские значе-
ния. Над булевскими значениями возможны операции конъюнкции, дизъюнк-
ции и отрицания.
В языках линии Си прямая поддержка булевского типа данных отсутству-
ет, но имеется логическая интерпретация значений целых типов. Значением
операции сравнения может быть "0" (FALSE) или "1" (TRUE). Значение целого
типа "0" интерпретируется как FALSE, а значения, отличные от нуля, - как
TRUE. В остальном все работает как в случае наличия явной поддержки булев-
ского типа.
3. Тип целых чисел в общем случае включает подмножество целых чи-
сел, определяемое числом разрядов, которое используется для внутреннего
представления значений. При определении типа целых чисел обычно стремятся
к тому, чтобы множество его значений было симметрично относительно нуля
(собственно, это стимулируется и стандартными свойствами машинной цело-
численной арифметики). Поэтому приходится тратить один бит на значение
10
знака числа и при использовании n бит для внутреннего представления целого
знаковый разряд
целая часть
.
дробная часть
соответствующий тип содержит значения в диапазоне от -2(n-1) до 2(n-1). В по-
давляющем большинстве современных процессоров отрицательные целые чис-
ла обычно представляют в дополнительном коде.
Числа с фиксированной точкой в памяти ЭВМ представляются следую-
щим образом:
Чаще всего точка фиксируется либо сразу за знаковым разрядом (число
всегда меньше единицы), либо за крайним правым разрядом (целые числа).
Пусть длина ячейки 16 разрядов (2 байта). Тогда для представления соб-
ственно числа отводится 15 разрядов, а максимальное целое положительное число (при точке фиксированной справа) имеет вид:
0111111111111111 = 214+213+..+21+20 = 215 - 1 = 32767
Отрицательные числа имеют вид
1111111111111111 = -1
1111111111111110 = -2
…………………………
1000000000000000 = -215 = -32768
Целые числа из этого диапазона представляются точно и операции над
ними (исключая деление) осуществляются точно, если результат не выходит за
границы допустимого диапазона.
В языках, ориентированных на 32-разрядные компьютеры, в частности, в
стандартных Си и Си++ для рационального использования памяти допускаются
модификации целого типа short integer (обычно 16-разрядные), integer (обычно то же самое, что и long integer) и long integer (обычно 32-разрядные), а также байтовые целые (char). При этом поддерживаются автоматические преобразо­вания значений типов меньшего размера к значениям типов большего размера.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]