Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмы и структуры данных. Учебное пособие по направлению подготовки 09.03.02 «Информационные системы и технологии»
.pdf
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
________________________
Федеральное государственное бюджетное
образовательное учреждение высшего образования
«Пензенский государственный университет
архитектуры и строительства»
(ПГУАС)
Т.А. Глебова, М.А.
Чиркина, И.С. Пышкина
АЛГОРИТМЫ И СТРУКТУРЫ ДАННЫХ
Рекомендовано Редсоветом университета
в качестве учебного пособия
по направлению подготовки 09.03.02
«Информационные системы и технологии»
Пенза 2024
1

УДК 621.001.57(075.8)
ББК К1–1с31я73-2
Г53
Рецензенты: генеральный директор ООО «Креомас-
тер» С.Н. Даянов;
доктор химических наук, профессор
А.Н. Кошев (ПГУАС)
Г53
Глебова Т.А.
Алгоритмы и структуры данных: учеб. пособие по направлению подготовки 09.03.02 «Информационные системы и технологии» / Т.А. Глебова, М.А. Чиркина, И
.С. Пышкина. – Пенза:
ПГУАС, 2024. – 120 с.
Рассматриваются основные структуры данных, в том числе связанные типы
(списки, деревья, графы) и сложные контейнерные типы (массивы, стеки и очереди), а
также особенности управления подобными типами в компьютерной программе.
Применительно к анализу фундаментальных абстракций данных анализируются
наиболее важные для проектной практики алгоритмы сортировки, поиска, обработки
древовидных структур, алгоритмы лексического и
изложении сделан упор на практическую сторону применения этих методов. В пособие
включены необходимые материалы для самостоятельного изучения алгоритмов и
структур данных, литература для более глубокого изучения каждой темы. Материал
способствует формированию знаний и практических навыков в области построения
алгоритмов.
Учебное пособие подготовлено на кафедре «Информационносистемы» и предназначено для студентов высших учебных заведений, обучающихся по
направлению подготовки 09.03.02 «Информационные системы и технологии».
синтаксического анализа и др. В
вычислительные
© Пензенский государственный университет
архитектуры и строительства, 2024
2

ПРЕДИСЛОВИЕ
Независимо от объема и сложности разрабатываемого программного
обеспечения, важным фактором, обеспечивающим надежность и гибкость
конструируемых программ, является умение определить основные абстракции данных, используемых в проекте, и разработать или выбрать
подходящие алгоритмы для эффективной обработки таких данных. Основная задача освоения дисциплины состоит не в изучении всего многообразия алгоритмов, а
основу для дальнейшего самообразования, квалифицированной разработки
и использования алгоритмов в соответствии с запросами практики. В
рамках курса рассматривается развитие базовых структур (стеки, очереди,
хеш-таблицы) и примеры организации кода, ориентированного на
обработку таких структур.
Структуры данных – необходимые компоненты любой программы или
программного комплекса. Поэтому
частности, методов представления данных на логическом и машинном
уровнях, а также допустимых операций над различными структурами,
необходимо для глубокого изучения и уяснения таких разделов, как
автоматизированные системы управления, языки программирования,
операционные системы, а также технологии программирования, управления данными и базы данных, искусственного интеллекта и
Выбор структур данных является одним из важных этапов разработки
программ и от правильности этого выбора зависит эффективность
программы, трудоемкость ее написания и время решения программой тех
задач, ради которых она создавалась. Это же справедливо и для алгоритмов обработки данных и их структур. Появление в составе современных
языков
мер, векторов, списков, различных видов деревьев, карт и т.п. не отменяет
необходимости знания высококвалифицированными специалистами
тонкостей использования этих структур данных и алгоритмов их
обработки. Учебное пособие по дисциплине «Алгоритмы и структуры
данных» направлено на то, чтобы помочь студентам полнее усвоить соответствующий лекционный
торных работ по этой дисциплине и заложить основы дальнейшего более
глубокого изучения конкретных алгоритмов обработки данных и вопросов
практического применения специфических структур данных.
программирования библиотек и классов структур данных, напри-
в обсуждении общих идей, создающих понятийную
знание теории структур данных и, в
т.д.
курс, подготовиться к выполнению лабора-
3

1. ПОНЯТИЕ ОБ АЛГОРИТМАХ И СТРУКТУРАХ ДАННЫХ
1.1. Основные определения
В теории алгоритмов были введены различные формальные определения алгоритма. Варианты словесного определения алгоритма принадлежат
российским ученым А.Н. Колмогорову и А.А. Маркову:
Определение (Колмогоров): Алгоритм – это всякая система вычисле-
ний, выполняемых по строго определенным правилам, которая после какого-либо числа шагов заведомо приводит к решению поставленной задачи.
Определение (Марков): Алгоритм – это точное предписание, опреде-
ляющее вычислительный процесс, идущий от варьируемых исходных
данных к искомому результату.
Различные определения алгоритма, в явной или неявной форме,
требуют выполнения следующих требований:
алгоритм должен содержать конечное количество элементарно выпол-
нимых предписаний, т.е. удовлетворять требованию конечности записи;
алгоритм должен выполнять конечное количество шагов при ре-
шении задачи, т.е. удовлетворять требованию конечности действий;
алгоритм должен быть единым для всех допустимых исходных
данных, т.е. удовлетворять требованию универсальности;
алгоритм должен приводить к правильному по отношению к по-
ставленной задаче решению, т.е. удовлетворять требованию правильности.
Утверждение Н. Вирта гласит: «Хорошая программа – это единство
продуманного алгоритма и эффективных структур данных».
Когда употребляют термин «программа», подразумевают не только
последовательность операторов некоторого языка программирования, но и
набор различных информационных объектов, над которыми выполняют те
или иные действия операторы программы. Такие информационные
объекты про граммы называют данными.
В соответствии с международным стандартом ISO, в наиболее общем
виде данные –
какой-либо другой информации в формализованном виде, приемлемом для
обработки, интерпретации, общения или передачи как человеком, так и
техническими средствами, при помощи некоторых процессов или алгоритмов.
Данные – непременный атрибут любой программы. Ими могут быть
отдельные биты, последовательности независимых битов, числа в разных
формах
представления (с фиксированной или плавающей точкой, обычной
или удвоенной точностью и т.д.), байты и группы независимых байтов,
представляющие символы в различных системах кодирования, массивы
чисел, информация хранимая в памяти вычислительной машины в форме
это представлений фактов, понятий, инструкций, идей или
4

связанных списков, а также информация на устройствах внешней памяти,
организованная в виде отдельных файлов и систем взаимосвязанных
файлов. Все это иллюстрирует разный уровень сложности, или организованности данных. Характер этой организованности и является одним из
воплощений понятия «структура данных».
Под СТРУКТУРОЙ ДАННЫХ в общем случае понимают множество
элементов данных и множество связей между ними. Такое определение
охватывает все возможные подходы к структуризации данных, но в каждой
конкретной задаче используются те или иные его аспекты. Поэтому
вводится дополнительная классификация структур данных, направления
которой соответствуют различным аспектам их рассмотрения. Прежде чем
приступать к изучению конкретных структур данных, дадим их общую
классификацию по нескольким признакам.
Понятие "ФИЗИЧЕСКАЯ СТРУКТУРА ДАННЫХ" отражает способ
физического представления данных в памяти машины и называется еще
структурой хранения, внутренней структурой или структурой памяти.
Рассмотрение структуры данных без учета ее представления в
машинной памяти называется абстрактной или ЛОГИЧЕСКОЙ структурой.
В общем случае между логической и соответствующей ей физической
структурами существует различие, степень которого зависит от самой
структуры и особенностей той среды, в которой она должна быть отражена. Вследствие этого различия существуют процедуры, осуществляющие отображение логической структуры в физическую и, наоборот,
физической структуры в логическую. Эти процедуры обеспечивают, кроме
того, доступ к физическим структурам и выполнение над ними
операций, причем каждая операция рассматривается применительно к
логической или физической структуре данных.
Различаются ПРОСТЫЕ (базовые, примитивные) структуры (типы)
данных и ИНТЕГРИРОВАННЫЕ (структурированные, композитные,
сложные). Простыми называются такие структуры данных, которые не
могут быть расчленены на составные части, большие, чем биты. С точки
зрения физической структуры важным является то обстоятельство, что в
данной машинной архитектуре, в данной системе программирования мы
всегда можем заранее сказать, каков будет размер данного простого типа и
какова структура его размещения в памяти. С логической точки зрения
простые данные являются неделимыми единицами. Интегрированными
называются такие структуры данных, составными частями которых
являются другие структуры данных – простые или в свою очередь
интегрированные. Интегрированные структуры данных конструируются
программистом с использованием средств интеграции данных, предоставляемых языками программирования.
различных
5

В зависимости от отсутствия или наличия явно заданных связей между
элементами данных следует различать НЕСВЯЗНЫЕ структуры (векторы,
массивы, строки, стеки, очереди) и СВЯЗНЫЕ структуры (связные списки).
Важно помнить, что любая структура данных размещается в памяти
ЭВМ (в первую очередь, в оперативной памяти), занимает некоторое,
возможно весьма большое, количество ячеек этой памяти и характеризуется начальным адресом своего размещения. Для описания этой ситуации
используется понятие «место в памяти».
Алгоритмы
группы – алгоритмы обработки собственно данных, например, подавление
шумов, преобразование Фурье, цифровая фильтрация и т.п. Это именно те
алгоритмы, для реализации которых и создаются программы, поэтому
такие алгоритмы можно назвать основными. Вторая группа – это алгоритмы обработки именно структур данных – пополнение,
дочение (сортировка), просмотр (прохождение) и т.п. Они занимают
подчиненное положение по отношению к основным алгоритмам, поэтому
могут быть названы вспомогательными, но для собственно структур
данных такие алгоритмы являются первостепенными.
обработки данных и их структур можно разделить на две
поиск, упоря-
1.2. Классификация структур данных
Структуры данных можно классифицировать по нескольким различным признакам. Рассмотрим два варианта классификации. По одному их
них структуры данных разделяются на достаточно большое количество категорий. Рассмотрим эти категории с примерами, соответствующими каждой из них.
Наиболее простым и понятным критерием классификации является
сложность структур данных.
По уровню сложности структуры данных
1. Простые структуры – обычные переменные или константы стандартных для языков программирования типов, а также динамические переменные этих же типов.
2. Наборы однотипных данных – массивы одномерные (или векторы),
двумерные (матрицы) и многомерные.
3. Составные структуры, отличные от массивов – записи и объекты
классов и им подобные структуры.
4. Динамические структуры
деревья, графы.
С точки зрения архитектуры можно выделить:
1. Линейные структуры – одномерные массивы (или векторы), линейные списки, линейные очереди, стеки.
с внутренними связями – связные списки,
разделяются на:
6

2. Прямоугольные структуры – двумерные (матрицы) и многомерные
массивы.
3. Кольцевые структуры – кольцевые списки, кольцевые очереди, неко-
торые реализации графов.
4. Ветвящиеся структуры – деревья различных видов, некоторые реали-
зации графов.
5. Сетевые структуры – графы.
По способу создания структуры данных можно разделить на
1. Обычные – переменные стандартных типов, обычные (т.е. не дина-
мические)
2. Динамические (создаваемые и разрушаемые с помощью специаль-
ных операций или процедур динамического выделения и освобождения
памяти) – динамические массивы, динамические переменные, связные
списки, деревья.
В зависимости от наличия или отсутствия связей между элементами
структуры данных различают:
1. Несвязные структуры – векторы, массивы, строки, стеки, очереди.
2. Связные – списки,
В зависимости от постоянства во время работы программы различают:
1. Статические (неизменяющиеся) структуры – переменные различных
типов, записи, массивы, в том числе динамические, а также списки, деревья и графы в тех случаях, когда они являются фиксированными и могут
быть построены на основе, например, массива.
2. Динамические (изменяющиеся) – списки, деревья, очереди
общем случае графы.
Термин «динамические» употребляется в разных смыслах, и структуры, динамические по способу создания, могут быть статическими по
своему поведению. Структуры, динамические по поведению, как правило,
оказываются динамическими и по способу создания. Также следует обратить внимание на то, что термин «статические» используется и в некоторых языках программирования, например, в Си и Си++, и там его смысл
в значительной степени отличается от подразумеваемого в приведенной
классификации.
По месту размещения в памяти ЭВМ:
1. Существующие в оперативной памяти (или внутренние) – ими могут
быть все ранее рассмотренные примеры структур данных. Кроме того,
такие структуры могут размещаться:
– в регистрах
ных типов, размер которых не превышает разрядности процессора;
– в стеке – локальные (в некоторых языках принято обозначение «авто-
матические») – любые не статические и не динамические структуры;
массивы, записи и т.п.
деревья, графы.
, стеки, в
процессора – регистровые, обычно переменные стандарт-
7

– в свободной (динамически выделяемой) памяти – глобальные, локаль-
ные статические (для языков Си и Си++) и все динамические структуры.
2. Хранящиеся на внешних носителях (внешних запоминающих
устройствах) – файлы и системы файлов.
Структуры данных позволяют хранить необходимые наборы данных в
памяти ЭВМ. Неотъемлемой частью любой такой структуры является
набор операций, который позволяет
нящимися в структуре. Таковыми обычно являются операции чтения и
записи, предоставляющие доступ к хранимым данным. Следует отметить,
что обе операции обычно реализуются на уровне ЭВМ, поэтому в дальнейшем будем предполагать, что их трудоемкость не зависит от того,
каким типом данных оперирует рассматриваемая структура.
Наиболее распространенные структуры данных:
1. Массивы.
2. Стеки.
3. Очереди.
4. Связные списки.
5. Деревья.
6. Графы.
7. Боры (в сущности, это тоже деревья, но их целесообразно рассмот-
реть отдельно).
8. Хеш-таблицы.
Под элементарными структурами данных будем понимать структуры
данных, которые либо предоставляются непосредственно ЭВМ, либо моделируются средствами ЭВМ с использованием типов данных, доступных на
уровне ЭВМ. Таким образом, элементарной структурой данных можно
назвать любую базовую структуру данных ЭВМ. К ним относятся такие,
как массив и связный список. Необходимо
атомарными структурами данных, так как не предполагается их моделирование путем использования других элементарных структур данных.
Хотя такая возможность и существует с точки зрения ЭВМ, построенная
реализация не даст ощутимый выигрыш перед системной структурой данных, поскольку она заведомо ведет к снижению эффективности некоторых
базовых операций, таких, как вставка и удаление элемента.
из
Массивы
Массив – линейная, однородная, элементарная структура данных, представляющая собой непрерывную упорядоченную последовательность
ячеек памяти и предназначенная для хранения данных одного и того же типа. Массив – это простейшая и наиболее распространенная структура дан-
ных. Другие структуры данных, например, стеки и очереди, производны от
массивов.
эффективно управлять данными, хра-
отметить, что их можно считать
8

Доступ к элементам массива осуществляется по индексу либо по
набору индексов, где под индексом будем понимать некоторое целочислен-
ное значение. В общем виде массив представляет собой многомерный
параллелепипед, в котором величины измерений могут быть различны.
Массив A c m измерениями будем называть m-мерным и обозначать через
A[n
,…nm], где ni – число элементов, которое может быть записано на
1,n2
уровне i 1≤i≤m.
Здесь показан простой массив размером 4, содержащий элементы (1, 2,
3 и 4).
Рис. 1. Массив
Каждому элементу данных присваивается положительное числовое
значение, именуемое индексом и соответствующее положению этого
элемента в массиве. В большинстве языков программирования элементы в
массиве нумеруются с 0. Существуют массивы двух типов:
Одномерные (такие, как показанный выше).
Многомерные (массивы, в которые вложены другие массивы).
Простейшие операции с массивами:
Insert – вставляем элемент на позицию с заданным индексом.
Get – возвращаем элемент, занимающий позицию с заданным индек-
сом.
Delete – удаляем элемент с заданным индексом.
Size – Получаем общее количество элементов в массиве.
Стеки
Стек (англ. stack – стопка) – это структура данных, в которой новый
элемент всегда записывается в ее начало (вершину) и очередной читаемый
элемент также всегда выбирается из ее начала. В стеках используется
метод доступа к элементам LIFO "последним пришел – первым вышел").
Стек можно сравнить с высокой стопкой книг. Если вам нужна какая-то
книга, лежащая около центра стопки, вам сначала придется снять все
книги, лежащие выше. Именно так работает принцип LIFO.
Стек – это список, у которого доступен один элемент (одна позиция).
Этот элемент называется вершиной стека. Взять элемент можно только из
вершины стека, добавить элемент можно только в вершину стека. Например, если записаны в стек числа 1, 2, 3, то при последующем извлечении
получим 3,2,1.
Так выглядит стек, содержащий три элемента данных (1, 2 и 3), где 3
находится сверху – поэтому будет убран первым:
9

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