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

Алгоритмы и структуры данных. Учебное пособие по направлению подготовки 09.03.02 «Информационные системы и технологии»

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
________________________
Федеральное государственное бюджетное
образовательное учреждение высшего образования
«Пензенский государственный университет
архитектуры и строительства»
(ПГУАС)
Чиркина, И.С. Пышкина
АЛГОРИТМЫ И СТРУКТУРЫ ДАННЫХ
Рекомендовано Редсоветом университета
в качестве учебного пособия
по направлению подготовки 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≤im.
Здесь показан простой массив размером 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]