Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Алгоритмы обработки данных

Покупка
Артикул: 778813.01.99
В настоящем пособии рассмотрены две группы алгоритмов: алгоритмы сортировки и алгоритмы на строках. Среди алгоритмов сортировки выделены простые обменные методы, имеющие полиномиальную временную сложность, методы с линейно-логарифмической и линейной оценками времени. Представлено описание классических алгоритмов быстрого поиска образца в тексте с использованием вспомогательных структур, приведены алгоритмы их построения. Рассмотрены алгоритмы вычисления редакционного расстояния между строками.
Ландовский, В. В. Алгоритмы обработки данных : учебное пособие / В. В. Ландовский. - Новосибирск : Изд-во НГТУ, 2018. - 67 с. - ISBN 978-5-7782-3645-5. - Текст : электронный. - URL: https://znanium.com/catalog/product/1869248 (дата обращения: 28.03.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Министерство образования и науки Российской Федерации 

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ 

 
 
 
 
 
 
В.В. ЛАНДОВСКИЙ 
 
 
 
 
 
 
АЛГОРИТМЫ ОБРАБОТКИ  
ДАННЫХ 
 
Утверждено Редакционно-издательским советом университета  
в качестве учебного пособия 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
НОВОСИБИРСК 
2018 

 

УДК 004.424.5.021 
         Л 222 
 

Рецензенты: 

канд. техн. наук, доцент В.А. Астапчук, 
старший преподаватель С.А. Менжулин 
 
 
 
Работа подготовлена на кафедре автоматизированных систем 
управления для студентов III курса АВТФ направления 09.03.01 – 
«Информатика и вычислительная техника» 
 
 
 
Ландовский В.В. 
Л 222   
Алгоритмы обработки данных: учебное пособие / В.В. Ландовский. – Новосибирск: Изд-во НГТУ, 2018. – 67 с. 

ISBN 978-5-7782-3645-5 

В настоящем пособии рассмотрены две группы алгоритмов: алгоритмы сортировки и алгоритмы на строках. Среди алгоритмов сортировки выделены простые обменные методы, имеющие полиномиальную временную сложность, методы с линейно-логарифмической и 
линейной оценками времени. Представлено описание классических 
алгоритмов быстрого поиска образца в тексте с использованием 
вспомогательных структур, приведены алгоритмы их построения. 
Рассмотрены алгоритмы вычисления редакционного расстояния между строками. 
 
 
 
УДК 004.424.5.021 
 
 
ISBN 978-5-7782-3645-5  
 
 
 
 
 
 
© Ландовский В.В., 2018 
© Новосибирский государственный 
    технический университет, 2018 

 

ВМЕСТО ПРЕДИСЛОВИЯ 

В настоящее время незнание фундаментальных алгоритмов становится нормой среди разработчиков программ. Это неудивительно, так 
как пробелы в базовом образовании компенсируются, с одной стороны, обилием легкодоступных учебных материалов, а с другой – возможностями применения готовых библиотечных рецептов. Нет ничего 
дурного в том, что специалист (в особенности начинающий) заглядывает в поисках информации в первый попавшийся интернет-источник. 
Использование макросредств без их глубокого изучения тоже может 
быть оправданно, если единственными критериями являются скорость 
написания и корректность работы программы. Но если потребуется 
обеспечить достаточную скорость обработки данных, то возможны 
проблемы. В зависимости от таланта и временны´ х рамок один с нуля 
изобретет велосипед, другой наконец-то изучит то, что пропустил в 
школе. И только тот, кто заранее уделил достаточно времени изучению 
основополагающих концепций и приобрел достаточную широту знаний, способен сразу выбрать правильный путь решения задачи. 
Темпы развития компьютерной техники и программного обеспечения в последнее время требуют от специалистов постоянной, почти 
непрерывной актуализации своих знаний. Может показаться, что обучение, не связанное с решением реальных задач, – непозволительная 
роскошь. Однако среди многообразия современных материалов, посвященных отдельным языкам, средствам разработки и конкретным 
прикладным решениям, теряются общие, нестареющие подходы к решению большого класса задач. Меняется главным образом форма: всё 
более дружественные интерфейсы, всё более высокоуровневые средства, высокие скорости обработки и наглядные способы отображения 
информации. Содержание же остается прежним; идеи, которые вот-вот 
отпразднуют вековой юбилей, не теряют своей актуальности. Это позволяет сделать вывод, что незнание фундамента лишает человека возможности занимать твердую позицию и делает его заложником чужих 

коммерческих интересов, связанных с развитием тех или иных программных средств. И, напротив, наличие базовых знаний позволяет 
уверенно адаптироваться к изменениям, быстро осваивать новые технологии. 
В дополнение к сказанному уместно будет процитировать фрагмент из книги одного из ведущих исследователей и преподавателей в 
области информатики Н. Вирта: «Программирование – это искусство 
конструирования. Как можно научить конструкторской, изобретательской деятельности? Есть такой метод: выделить простейшие строительные блоки из многих уже существующих программ и дать их систематическое описание. Но программирование представляет собой 
обширную и разнообразную деятельность, часто требующую сложной 
умственной работы. Ошибочно считать, что ее можно свести к использованию готовых рецептов. В качестве метода обучения нам остается 
тщательный выбор и рассмотрение характерных примеров. Конечно, 
не следует считать, что изучение примеров всем одинаково полезно. 
При этом подходе многое зависит от сообразительности и интуиции 
обучающегося» [1]. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

1. АЛГОРИТМЫ СОРТИРОВКИ 

Сортировка – широкое понятие, в общем случае под сортировкой 
понимают упорядочение множества объектов по одному или нескольким признакам. Во всяком случае отнесение изделий к той или иной 
категории качества согласно некоторому набору критериев называют 
именно сортировкой.  
Если говорить о сортировке в контексте программирования, то 
первое, что приходит на ум, – это упорядочение элементов массива по 
их значениям. Однако следует помнить, что в общем случае сортируемые объекты могут иметь сложную внутреннюю структуру, и признак, 
по которому производится упорядочение, может быть составным. Этот 
признак (совокупность признаков), как правило, называют ключевым 
полем или ключом. На множестве значений ключа должно существовать отношение линейного порядка. В большинстве случаев количество операций, реализующих данное отношение, не зависит от числа 
сортируемых объектов, однако можно привести примеры такой зависимости (см. разд. 2.4.1). Структура данных, используемая для доступа 
к объектам, может существенно влиять на асимптотику алгоритмов 
сортировки. При выборе алгоритма следует обращать внимание на 
время доступа к объекту при обращении по номеру. 
Важной характеристикой алгоритма сортировки является устойчивость, она заключается в сохранении относительного порядка объектов с одинаковыми значениями ключа. 

1.1. ПРОСТЫЕ МЕТОДЫ 

В этом разделе рассмотрены простые алгоритмы, в которых процесс сортировки представляет собой последовательность обменов. 
К числу преимуществ этих методов следует отнести минимальный 
объем дополнительной памяти, небольшие константы в оценках времени и, разумеется, простоту реализации. Основной недостаток – 
асимптотика времени выполнения O(n2), где n – количество сортируемых элементов. 

1.1.1. СОРТИРОВКА ПУЗЫРЬКОМ 

Для понимания этого алгоритма полезно изобразить последовательность сортируемых элементов сверху вниз. Разделим последовательность на две части: упорядоченную и неупорядоченную, первая 
располагается сверху, и до начала работы алгоритма она отсутствует.  

i 
0 
1 
2 
3 
4 
– 

4 
4 
1 
1 
1 
1 
1 

6 
6 
4 
2 
2 
2 
2 

3 
3 
6 
4 
3 
3 
3 

1 
1 
3 
6 
4 
4 
4 

5 
5 
2 
3 
6 
5 
5 

2 
2 
5 
5 
5 
6 
6 

2 

1 

1 

1 

2 

2 

2 

3 

3 

5 

 
Рис. 1.1. Пример сортировки пузырьком 

Начало 

i = 0, n – 2 

A[j].key < 
A[j – 1]. key 

tmp = A[j] 
A[j] = A[j – 1] 
A[j – 1] = tmp 

Конец 

A[i], i = 0,…, n – 1 – исходное 
неупорядоченное множество 

j = n – 1, i + 1 

Да 

Нет 

 
Рис. 1.2. Алгоритм сортировки пузырьком 

Элементы перемещаются в неупорядоченной части путем последовательных обменов с соседними. На каждой итерации элемент с 
наиболее «легким» ключом поднимается на верхнюю границу неупорядоченной части, а размер (глубина) упорядоченной части увеличивается на единицу. Очевидно, что количество таких итераций должно 
быть на единицу меньше количества элементов, так как неупорядоченная часть, состоящая из одного элемента, упорядочена. На рис. 1.1 показан пример работы алгоритма. Столбцы соответствуют состояниям 
массива до сортировки, на каждой итерации и после сортировки, граница упорядоченной части обозначена двойной чертой. Стрелками показано перемещение элементов. Подробный алгоритм представлен на 
рис. 1.2.  
Очевидным усовершенствованием будет добавление выхода из 
внешнего цикла при условии, что в процессе выполнения внутреннего 
цикла не было ни одного обмена. 
Если просматривать неупорядоченную часть как в обратном направлении (перемещая локальный минимум), так и в прямом направлении 
(перемещая локальный максимум), то это будет соответствовать алгоритму сортировки «перемешиванием» (шейкерной сортировке). 

1.1.2. СОРТИРОВКА ВСТАВКАМИ 

Отличие этого метода от предыдущего заключается в том, что элементы перемещаются в упорядоченной части. На каждой итерации 
очередной элемент, находящийся на верхней границе неупорядоченной части, помещается на нужную позицию в отсортированной части 
(вставляется). Очевидно, что уже на первой итерации необходимо 
наличие неупорядоченной части, для этого первым добавляют фиктивный элемент c минимально возможным значением ключа. Пример сортировки вставками показан на рис. 1.3, на рис. 1.4 изображена блоксхема алгоритма. 
Внешний цикл сортировки вставками обязан дойти до конца, а 
внутренний может заканчиваться в произвольный момент. 

1.1.3. СОРТИРОВКА ВЫБОРОМ 

Два предыдущих метода меняли местами только соседние элементы. Эта особенность обеспечивает одинаковую асимптотику как для 
структур данных с последовательным доступом (списков), так и для 

структур с произвольным доступом (массивов). При этом количество 
обменов выглядит необоснованно высоким. Сортировка выбором на 
каждой итерации помещает очередной элемент на подходящее место и 
меняет его местами с тем элементом, который прежде занимал это место. Иначе говоря, на i-й итерации из A[i]…A[n – 1] выбирается элемент с наименьшим ключом и меняется местами с A[i]. 

i 
1 
2 
3 
4 
5 
– 

– – – – – – – 

4 
4 
4 
3 
1 
1 
1 

6 
6 
6 
4 
3 
3 
2 

3 
3 
3 
6 
4 
4 
3 

1 
1 
1 
1 
6 
5 
4 

5 
5 
5 
5 
5 
6 
5 

2 
2 
2 
2 
2 
2 
6 

1 

3 

3 

1 

1 

5 

2 

2 

2 

2 

 
Рис. 1.3. Пример сортировки вставками 

Начало 

i = 1, n – 1 

A[j].key < 
A[j – 1]. key 

tmp = A[j] 
A[j] = A[j – 1] 
A[j – 1] = tmp 
j = j – 1 

Конец 

A[i], i = 1,…, n – исходное 
неупорядоченное множество 

Да 

Нет 

A[0].key = –  

j = i 

 
Рис. 1.4. Алгоритм сортировки вставками 

На рис. 1.5 показан пример работы сортировки выбором; позиция, 
на которую выбирается элемент, обведена двойной чертой. Блок-схема 
алгоритма изображена на рис. 1.6. Данный алгоритм, так же как и 
предыдущие два, нетрудно адаптировать для сортировки множества, 
реализованного на базе связного списка. Это объясняется тем, что обращение к элементам осуществляется последовательно. 
 
i 
0 
1 
2 
3 
5 

4 
4 
1 
1 
1 
1 

6 
6 
6 
2 
2 
2 

3 
3 
3 
3 
3 
3 

1 
1 
4 
4 
4 
4 

5 
5 
5 
5 
5 
5 

2 
2 
2 
6 
6 
6 

2 

1 

 
Рис. 1.5. Пример сортировки выбором 

Начало 

i = 0, n – 2 

A[j].key < 
A[j – 1]. key 

tmp = A[i] 
A[i] = A[mi] 
A[mi] = tmp 

Конец 

A[i], i = 0,…,n – 1 – исходное 
неупорядоченное множество 

да 

Нет 

mi = i 
m = A[i].key 

j = i + 1, n – 1 

mi = j 
m = A[j].key 

 
Рис. 1.6. Алгоритм сортировки выбором 

Следует отметить, что время выполнения такого алгоритма есть 
(n2), так как на каждой итерации обязательно просматривается вся 
неупорядоченная часть. 

1.2. СОРТИРОВКА ШЕЛЛА 

Метод Шелла [2], предложенный еще в 1959 г., считается усовершенствованием сортировки вставками. Ключевая идея заключается в 
сравнении и перемещении элементов, находящихся на значительном 
удалении друг от друга. Похожий подход применительно к пузырьковой сортировке используется в методе сортировки «расческой», который был опубликован значительно позже. 
В алгоритме, представленном на рис. 1.7, переменная m определяет 
расстояние между сравниваемыми элементами. На первом шаге внешнего цикла сортируются элементы, образующие пары, количество таких пар n/2. На последнем шаге сортируются соседние элементы, что 
можно считать обычной сортировкой вставками, т. е. с каждым новым 
значением j очередной элемент занимает свое место в отсортированной 
части. Однако с учетом работы, проделанной при больших значениях m, 
высока вероятность того, что элементы уже находятся на своих местах 
либо недалеко от этих мест.  

Начало 

m = n/2, n/4, ..., 1 

A[i].key > 

A[i + m].key 

tmp = A[i] 
A[i] = A[i + m] 
A[i + m] = tmp 

Конец 

A[i], i = 0,…, n – 1 – исходное 
неупорядоченное множество 

Да 

Нет 

j = 0, n – m 

i = j, j – m, ..., 0 

 

Рис. 1.7. Алгоритм сортировки Шелла 

Очевидно, что внешний цикл всегда имеет log2(n) итераций. Так 
как m уменьшается, число итераций цикла, в котором изменяется j, линейно по n. Максимальное количество итераций на третьем уровне 
(в цикле по переменной i) с уменьшением m растет экспоненциально и