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

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

Покупка
Основная коллекция
Артикул: 695816.01.99
Доступ онлайн
299 ₽
В корзину
В учебном пособии рассматриваются базовые структуры данных и важнейшие алгоритмы, используемые при разработке системного и прикладного программного обеспечения. Излагаются наиболее эффективные алгоритмы сортировки и поиска данных, рассматриваются комбинаторные задачи и методы их решения (метод ветвей и границ, динамическое программирование, эвристические алгоритмы). Подчеркивается важность оценки эффективности алгоритмов при проектировании программ. Дается представление о теории вычислительной сложности и о проблемах, связанных с понятием NP-полноты задач. Предназначено для студентов, обучающихся по направлениям подготовки бакалавров 02.03.03 «Математическое обеспечение и администрирование информационных систем» и 09.03.04 «Программная инженерия».
Дроздов, С. Н. Структуры и алгоритмы обработки данных: Учебное пособие / Дроздов С.Н. - Таганрог:Южный федеральный университет, 2016. - 228 с.: ISBN 978-5-9275-2242-2. - Текст : электронный. - URL: https://znanium.com/catalog/product/991928 (дата обращения: 25.04.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Таганрог

Издательство Южного федерального университета

2016

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ

РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное автономное образовательное 

учреждение высшего образования

«ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»

Инженерно-технологическая академия

С.Н. Дроздов

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

Учебное пособие

УДК 004.021(075.8)
ББК 32.973я73

Д754

Печатается по решению редакционно-издательского совета

Южного федерального университета

Рецензенты:

профессор кафедры систем автоматизации проектирования Института 

компьютерных технологий и информационной безопасности ЮФУ 

Е.В. Нужнов;

директор направления ООО AT Consulting, кандидат технических наук 

Д.П. Калачев.

Дроздов, С.Н.

Д754
Структуры и алгоритмы обработки данных : учебное пособие / 

С.Н. Дроздов;
Южный
федеральный
университет.
–

Таганрог : Издательство Южного федерального университета, 2016. 
– 228 с. 

ISBN 978-5-9275-2242-2

В учебном пособии рассматриваются базовые структуры данных и 

важнейшие алгоритмы, используемые при разработке системного и 
прикладного программного обеспечения. Излагаются наиболее эффективные 
алгоритмы сортировки и поиска данных, рассматриваются комбинаторные 
задачи и методы их решения (метод ветвей и границ, динамическое 
программирование, эвристические алгоритмы). Подчеркивается важность 
оценки эффективности алгоритмов при проектировании программ. Дается 
представление о теории вычислительной сложности и о проблемах, 
связанных с понятием NP-полноты задач.

Предназначено 
для 
студентов, 
обучающихся 
по 
направлениям 

подготовки 
бакалавров 
02.03.03 
«Математическое 
обеспечение 
и 

администрирование информационных систем» и 09.03.04 «Программная 
инженерия».

ISBN 978-5-9275-2242-2
УДК 004.021(075.8)

ББК 32.973я73

 Южный федеральный университет, 2016
 Дроздов С.Н., 2016

СОДЕРЖАНИЕ

1. ВВЕДЕНИЕ..................................................................................................7

1.1. Предмет и задачи курса .......................................................................7
1.2. Рекомендации по литературе ..............................................................7
1.3. Понятие типа данных...........................................................................8
Контрольные вопросы...............................................................................10

2. ПРОСТЫЕ ТИПЫ ДАННЫХ ..................................................................10

2.1. Числовые типы данных......................................................................10
2.2. Логический тип данных.....................................................................13
2.3. Другие простые типы.........................................................................16

2.3.1. Символьный тип ..................................................................................16
2.3.2. Перечисляемые типы данных.............................................................17
2.3.3. Ограниченные типы данных...............................................................18

Контрольные вопросы...............................................................................18

3. СТРУКТУРНЫЕ ТИПЫ ДАННЫХ........................................................19

3.1. Способы представления структурных данных ...............................19
3.2. Записи ..................................................................................................21
3.3. Массивы...............................................................................................23
3.4. Строки..................................................................................................24
3.5. Множества...........................................................................................26
3.6. Стеки....................................................................................................28
3.7. Очереди................................................................................................34
3.8. Приоритетные очереди ......................................................................40
3.9. Линейные списки................................................................................44
3.10. Деревья ..............................................................................................48

3.10.1. Основные определения .....................................................................48
3.10.2. Бинарные деревья и их представление............................................49
3.10.3. Операции с деревьями.......................................................................50
3.10.4. Устранение рекурсии при операциях с деревьями ........................56

3.11. Последовательные контейнеры ......................................................60

3.11.1. Контейнеры в библиотеке STL.........................................................60
3.11.2. Массивы..............................................................................................61
3.11.3. Списки.................................................................................................62
3.11.4. Дек.......................................................................................................63
3.11.5. Стек и очередь....................................................................................65
3.11.6. Приоритетная очередь.......................................................................65

Контрольные вопросы...............................................................................66

4. СОРТИРОВКА И ПОИСК .......................................................................67

4.1. Задачи поиска в информатике...........................................................67
4.2. Задача поиска в таблице ....................................................................68
4.3. Понятие об оценке эффективности алгоритмов и программ ........70
4.4. Линейный поиск .................................................................................74
4.5. Бинарный поиск..................................................................................77
4.6. Задачи сортировки таблиц и массивов.............................................79
4.7. Простые алгоритмы сортировки.......................................................81

4.7.1. Алгоритм пузырька (BubbleSort) .......................................................81
4.7.2. Алгоритм выбора (SelectionSort)........................................................82
4.7.3. Алгоритм вставок (InsertionSort)........................................................82
4.7.4. Общая характеристика простых алгоритмов....................................83

4.8. Алгоритм Шелла (ShellSort)..............................................................84
4.9. Алгоритм быстрой сортировки (QuickSort).....................................85
4.10. Алгоритм пирамидальной сортировки (HeapSort)........................89
4.11. Алгоритмы сортировки слиянием (MergeSort) .............................94
4.12. Задача внешней сортировки............................................................96
4.13. Сравнение алгоритмов сортировки ................................................99
Контрольные вопросы.............................................................................100

5. ПОИСК СО ВСТАВКОЙ .......................................................................102

5.1. Постановка задачи............................................................................102
5.2. Бинарные деревья поиска................................................................104
5.3. АВЛ-деревья .....................................................................................109
5.4. Страничные деревья поиска............................................................113
5.5. B-деревья...........................................................................................117
5.6. Использование B-деревьев в базах данных...................................122
5.7. Ассоциативные контейнеры на базе деревьев поиска..................123

5.7.1. Структуры данных.............................................................................123
5.7.2. Множества..........................................................................................124
5.7.3. Отображения ......................................................................................125

Контрольные вопросы.............................................................................125

6. СПЕЦИАЛЬНЫЕ МЕТОДЫ СОРТИРОВКИ И ПОИСКА................126

6.1. Поразрядная сортировка..................................................................127
6.2. Поиск в словаре и боры ...................................................................132
6.3. Определение порядковых статистик..............................................134

Контрольные вопросы.............................................................................136

7. ХЕШИРОВАНИЕ....................................................................................137

7.1. Основные понятия хеширования....................................................137
7.2. Способы построения хеш-функций................................................140

7.2.1. Общие требования к хеш-функциям ...............................................140
7.2.2. Алгоритм деления..............................................................................141
7.2.3. Алгоритм середины квадрата...........................................................142
7.2.4. Алгоритм умножения........................................................................144
7.2.5. Хеширование строковых ключей.....................................................145

7.3. Методы разрешения коллизий........................................................147

7.3.1. Алгоритм линейных проб.................................................................148
7.3.2. Алгоритм квадратичных проб..........................................................148
7.3.3. Алгоритм двойного хеширования....................................................149
7.3.4. Алгоритм списков в динамической памяти....................................149
7.3.5. Алгоритм Уильямса...........................................................................150

7.4. Условия эффективности хеширования ..........................................150
7.5. Другие применения хеширования ..................................................152

7.5.1. Проверка принадлежности к множеству.........................................152
7.5.2. Проверка целостности сообщений и текстовых файлов ...............153
7.5.3. Криптографическое хеширование ...................................................154

7.6. Ассоциативные контейнеры на базе хеширования.......................155
Контрольные вопросы.............................................................................156

8. МЕТОДЫ РЕШЕНИЯ КОМБИНАТОРНЫХ ЗАДАЧ ........................157

8.1. Понятие комбинаторной задачи .....................................................157
8.2. Примеры комбинаторных задач......................................................158
8.3. Организация исчерпывающего перебора с возвратами ...............162
8.4. Сокращение перебора ......................................................................166
8.5. Полный перебор с перечислением планов ....................................168
8.6. Метод ветвей и границ.....................................................................170

8.6.1. Общее понятие о методе ветвей и границ.......................................170
8.6.2. Метод ветвей и границ для задачи о коммивояжере .....................173

8.7. Метод --отсечений для позиционных игр с полной 

информацией .......................................................................................180

8.8. Метод динамического программирования ....................................184

8.8.1. Задача о двух армиях и рекуррентные вычисления.......................184
8.8.2. Общее понятие о методе динамического программирования ......187

8.8.3. Метод динамического программирования для задачи о 

рюкзаке ...............................................................................................190

8.8.4. Метод динамического программирования для задачи  о 

наибольшей общей подпоследовательности ..................................194

8.9. Приближенные и эвристические методы решения задач 

комбинаторной оптимизации ............................................................196
8.9.1. Точные,  приближенные и эвристические алгоритмы...................196
8.9.2. «Жадные» алгоритмы........................................................................198
8.9.3. Генетические алгоритмы ..................................................................200
8.9.4. О доказательствах и контрпримерах ...............................................201

Контрольные вопросы.............................................................................202

9. ЭЛЕМЕНТЫ ТЕОРИИ СЛОЖНОСТИ ВЫЧИСЛЕНИЙ ...................203

9.1. Основные понятия и проблемы теории сложности 

вычислений..........................................................................................203

9.2. Полиномиальная сводимость задач................................................207
9.3. Недетерминированные машины Тьюринга и NP-задачи.............207
9.4. NP-полные и NP-трудные задачи....................................................211
9.5. Теорема Кука ....................................................................................212

9.5.1. Постановка задачи.............................................................................212
9.5.2. Формулировка теоремы ....................................................................213
9.5.3. Доказательство теоремы ...................................................................213

9.6. Примеры NP-полных задач .............................................................216

9.6.1. Задача «3-Выполнимость» (задача «3-ВЫП»)................................216
9.6.2. Задача о вершинном покрытии графа (задача ВП) ........................218
9.6.3. Другие NP-полные задачи ................................................................220

9.7. Псевдополиномиальные задачи......................................................221
9.8. Практическое значение результатов теории сложности 

вычислений..........................................................................................223

Контрольные вопросы.............................................................................225

ЗАКЛЮЧЕНИЕ ...........................................................................................226
БИБЛИОГРАФИЧЕСКИЙ СПИСОК .......................................................227

1. ВВЕДЕНИЕ

1.1. Предмет и задачи курса
Предметом изучения в данном
курсе
являются базовые 

структуры данных и алгоритмы обработки данных, составляющие 
«золотой фонд» современного программирования и являющиеся 
обязательной компонентой знаний каждого квалифицированного 
программиста.

В качестве основных задач изучения курса можно выделить 

следующие:

- знание основных, наиболее важных структур данных и 

алгоритмов, умение применять их в практике программирования;

- знание принципов и критериев оценки эффективности 

алгоритмов, понимание важности предварительного анализа при 
решении конкретных задач и выбора наиболее эффективных 
алгоритмов решения.

Практическим 
итогом 
изучения 
курса 
должно 
стать 

обогащение арсенала программиста рядом высокоэффективных 
средств, 
позволяющих 
значительно 
повысить 
качество 

разрабатываемых программ.

1.2. Рекомендации по литературе
Классическим 
источником 
по 
базовым 
алгоритмам 
и 

структурам данных является книга Н. Вирта [1]. Впоследствии 
автор несколько раз переписывал эту книгу, делая существенные 
дополнения и переводя примеры программ на очередной 
изобретенный им язык программирования. В частности, книга [2] 
содержит важный новый материал.

Очень хороша по подбору материала и по качеству изложения 

книга [3].

Книга [4] представляет собой огромную по объему, но вполне 

доступную по изложению монографию, часть материалов которой 
трудно найти в других источниках.

Классическая
серия
книг
Д. Кнута 
«Искусство 

программирования» 
содержит 
описания 
очень 
большого 

количества алгоритмов и связанных с ними структур данных, при 
этом значительное
внимание
уделено оценке эффективности 

алгоритмов. Для освоения данного курса наибольшее значение 
имеет том 3 «Сортировка и поиск» [5].

В книге [6] хорошо изложены основы теории вычислительной 

сложности и приведен огромный список известных на момент 
публикации NP-полных задач.

Много информации по алгоритмам и структурам данных 

можно найти в Интернете. Определения и краткие описания 
многих терминов можно найти в Википедии [7], хотя этот 
полезный ресурс нельзя считать исчерпывающим или полностью 
достоверным. Среди других русскоязычных ресурсов можно 
назвать [8], а также значительно более продвинутый по 
содержанию 
и 
сложности 
сайт 
[9].
Весьма 
полезно 
для 

начинающего 
программиста 
регулярное 
посещение 
сайта 

Хабрахабр [10], который содержит постоянно пополняемую 
пользователями коллекцию интересных материалов, относящихся 
как к теме данного пособия, так и к другим разделам информатики 
и программирования.

1.3. Понятие типа данных
В большинстве современных языков программирования 

требуется, чтобы каждая используемая переменная или константа 
относилась к определенному типу данных, либо встроенному в 
язык, либо описанному самим программистом с использованием 
правил языка.

Согласно современному подходу к проектированию программ, 

тип данных определяется двумя множествами:

- множеством значений, которые могут принимать величины 

данного типа;

- множеством операций, которые можно выполнять над этими 

величинами.

В качестве примера того, почему множество операций 

является обязательной частью определения типа, рассмотрим два 
типа данных, которые условно назовем «Время дня» и «Интервал 
времени». Можно договориться, что значениями каждого из типов 
могут быть пары целых чисел «часы : минуты». Тем не менее, 
интуитивно ясно, что эти типы представляют разные по смыслу 
вещи, и это сказывается на наборе допустимых операций. 
Например, можно сложить два интервала времени, но совершенно 
бессмысленно складывать два времени дня: сумма «10:20 + 8:30»

не имеет смысла. Зато вполне осмысленна разность двух времен 
дня, но при этом разность будет уже относиться к типу «Интервал 
времени».

Выбор используемых типов данных является важнейшим 

элементом грамотного проектирования программы, а в некоторых 
случаях 
фактически 
предопределяет 
выбор 
используемых 

алгоритмов.

Различают простые и структурные типы
данных. Тип 

называется простым, если значение данных этого типа нельзя 
разложить на более мелкие осмысленные элементы. К простым 
типам относятся, например,
числовые и логические данные. 

Примерами структурных данных могут служить любые массивы, 
состоящие из отдельных элементов, или записи, состоящие из 
полей.

При 
выборе 
типа 
данных 
следует 
исходить 
не 
из 

ограниченного набора типов, предоставляемого используемым 
языком программирования, а из потребностей решаемой задачи и 
используемых алгоритмов. Если даже требуемый тип данных 
отсутствует в конкретном языке, его всегда можно реализовать 
самостоятельно, 
используя 
имеющиеся 
языковые 
средства. 

Современные языки программирования предоставляют для этого 
достаточные возможности.

Для того чтобы тип данных можно было использовать в 

программах, его определение должно включать две составляющие 
части: интерфейс и реализацию (представление).

Интерфейс типа данных содержит, как было указано выше, 

описание множества возможных значений и множества операций
над ними, с указанием сигнатуры, т.е. количества и типа 
операндов и результата операции. Знание интерфейса позволяет 
использовать тип данных при разработке программ.

Реализация типа данных включает в себя описание структур,

используемых для представления данных, и программные модули, 
выполняющие все операции, перечисленные в интерфейсе.

Нередко возникает ситуация, когда одному и тому же 

интерфейсу может соответствовать несколько принципиально 
разных реализаций. В таких случаях решение о выборе реализации 
принимается, исходя из сравнительной эффективности различных 

структур данных и алгоритмов выполнения операций для 
конкретной рассматриваемой задачи.

Получившая широкое распространение технология объектно
ориентированного программирования (ООП) включает в качестве
одного из основных своих компонентов механизм инкапсуляции, 
т.е. описания типа данных
(класса)
вместе с функциями

(методами), применимыми к данным этого класса.

Некоторым неудобством понятия класса является то, что 

определение класса должно включать определение полей данных 
объектов этого
класса. Это ограничивает гибкость выбора 

реализации методов класса для конкретных задач. В таких языках 
программирования, как Java, C# и ряд других, наряду с понятием 
класса, успешно используется понятие интерфейса (interface) как 
описания набора функций для типа данных. Интерфейс включает 
только имена функций, типы их аргументов и значений, но не 
содержит 
ни 
описания 
конкретных 
структур 
данных, 
ни 

реализации функций. То и другое должно выбираться при 
разработке 
конкретного 
класса, 
реализующего 
указанный 

интерфейс.

Контрольные вопросы
1. Могут ли два разных типа данных иметь одинаковое 

множество значений?

2. Могут ли два разных типа данных иметь одинаковое 

множество операций?

3. Какие типы данных относятся к простым?
4. Что такое интерфейс и реализация типа данных?
5. Что такое сигнатура операции?
6. Что такое инкапсуляция данных?
7. Что такое интерфейс в языках Java, C#?
8. Чем понятие интерфейса отличается от понятия класса?

2. ПРОСТЫЕ ТИПЫ ДАННЫХ

2.1. Числовые типы данных
На вопрос: «Какие существуют числовые типы данных?» часто 

следует немедленный ответ: «Целый и вещественный». Такая точка 
зрения 
основана 
на 
знакомстве 
с 
популярными 
языками 

программирования (C, Pascal и др.), которые содержат именно эти 

два типа. Однако если посмотреть на вещи «не с конца, а с начала», 
т.е. не ограничиваться тем, что предлагают в готовом виде языки, а 
исходить 
из 
требований 
реальных 
задач, 
то 
естественно 

рассмотреть те типы чисел, которые рассматриваются в математике 
(ибо числа – объекты математические).

К числовым типам данных относят обычно целочисленный, 

вещественный, комплексный и рациональный типы. Кроме того, 
каждый из перечисленных типов может быть многократной 
точности.

Имеется одно принципиальное отличие числовых типов 

данных от соответствующих им математических понятий. Отличие 
заключается в том, что в математике каждый из типов чисел имеет 
бесконечную мощность, а это
в принципе невозможно для 

числовых типов в программировании.

Ко всем числовым типам применимы арифметические 

операции ‘+’, ‘–’, ‘*’, ‘/’, операции сравнения ‘<’, ‘’, ‘=’, ‘<>’, ‘’, 
‘>’ (для комплексных – только ‘=’ и ‘<>’), а также преобразования 
в другие типы, в частности – преобразование в строковый тип для 
выдачи результатов.

Целочисленный тип данных характеризуется ограниченным 

диапазоном значений. Поскольку для хранения целых чисел в 
памяти ЭВМ практически всегда используется двоичный код, то 
этот диапазон обычно составляет от –2m-1 до 2m-1–1 для чисел со 
знаком или от 0 до 2m–1 для чисел без знака (здесь m – разрядность 
представления чисел).

Все операции с целыми числами дают либо точный (т.е. не 

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

отрицательный результат сложения двух положительных чисел –
верный признак переполнения.

К вещественным типам данных относят два существенно 

различных типа.

Вещественный тип с фиксированной точкой – это, в 

сущности, замаскированный целочисленный тип, у которого 
несколько младших разрядов считаются дробными. Например, для 
работы с денежными суммами удобно использовать тип, хранящий 

суммы в рублях, но с двумя десятичными знаками после точки для 
копеек. На самом деле, такой тип будет хранить целочисленные 
суммы в копейках, но показывать эти суммы будет в рублях. Для 
сложения 
и 
вычитания 
чисел 
с 
фиксированной 
точкой 

используются те же команды, что и для целых чисел, а умножение 
и деление отличаются от целочисленных необходимостью сдвига 
результата вправо.

Вещественный тип с плавающей точкой
использует 

представление чисел в виде мантиссы и характеристики. За счет 
этого 
диапазон 
представляемых 
чисел 
весьма 
велик, 
но 

расплачиваться 
за 
это 
приходится 
ограничением 
точности 

представления, которая определяется разрядностью мантиссы.

Вообще, 
результаты 
арифметических 
операций 
над 

вещественными
числами
–
всегда 
приближенные 
за 
счет 

погрешности округления. Если для целых чисел 2  2 – достоверно 
4, то для вещественных нельзя быть полностью уверенным, что 
2,0  2,0 = 4,0. Тем более, такое известное тождество, как sin2(x) + 
cos2(x) = 1, практически никогда не будет иметь места для 
вещественных чисел, кроме x = 0. В связи с этим, хотя для 
вещественных типов допускаются сравнения на равенство ‘=’ и 
‘<>’, в хорошей практике программирования эти операции не 
используются. Вместо ‘if x = y’ используют более осторожную 
запись ‘if Abs(x-y) < EPS’, где значение константы EPS
подбирается, исходя из особенностей конкретной задачи.

Комплексный тип широко применяется при решении задач 

электротехники и радиотехники. Безусловно, все арифметические 
операции над комплексными числами нетрудно промоделировать в 
виде функций над парами вещественных чисел, представляющих 
комплексные числа в виде действительной и мнимой частей (или 
же в виде модуля и аргумента числа). Так обычно и поступают. Но 
можно заметить, что «древний» язык Fortran, в котором был 
предусмотрен встроенный комплексный тип данных, очень долго 
оставался 
популярным 
среди 
инженеров, 
несмотря 
на 

многочисленные недостатки этого языка.

Рациональный 
тип
встречается
главным 
образом
в 

математических задачах. Число этого типа представляется парой 
целых чисел (числитель и знаменатель), а операции реализуются с 
помощью функций, выполняющих операции с простыми дробями. 

В отличие от вещественного типа, операции с рациональными 
числами выполняются точно (или дают ошибку переполнения).

Для 
всех 
названных 
выше 
типов 
можно 
построить 

соответствующие
«длинные»
типы, т.е. типы
повышенной 

точности (или расширенного диапазона). Такие возможности 
достигаются за счет замены одиночных целых или вещественных 
чисел на массивы или списки чисел, представляющие очень 
большое число или очень длинную мантиссу «по кусочкам». Если 
используются 
списки 
(см. 
подразд. 3.9), 
то 
можно
даже

потребовать, чтобы числа могли принимать произвольно большие 
значения 
и/или 
представляться 
со 
сколь 
угодно 
высокой 

точностью. Теоретическим ограничением здесь служит только 
общий объем памяти, доступной программе. На практике 
приходится также учитывать ограничение по времени выполнения, 
поскольку 
операции 
с 
«длинными» 
числами
реализуются 

достаточно трудоемко, с использованием циклов.

2.2. Логический тип данных
Логические (булевские) величины могут принимать одно из 

двух значений, которые могут обозначаться по-разному: Да / Нет, 
Истина / Ложь, True / False, 1 / 0. Для хранения логического 
значения достаточно использовать один бит. Однако это далеко не 
всегда удобно. Попытка упаковать несколько битовых значений в 
один байт может привести к замедлению операций из-за 
необходимости доступа к конкретному биту. Поэтому для 
хранения логических переменных чаще используется байт как 
минимальная адресуемая единица памяти.

Другое дело – большие массивы логических значений. Если в 

задаче требуется хранить массив из
миллиарда логических 

значений, т.е.
большой смысл в том, чтобы хранить их в 

упакованном виде, по одному биту на логическое значение, даже 
если это усложнит доступ к ним.

Для логических величин определены операции булевой 

алгебры AND, OR, NOT, а также обычно XOR
–
операция 

исключающего ИЛИ (другое название – «сложение по модулю 2»). 
В некоторых языках допускаются также операции сравнения, 
которые можно в данном случае трактовать как некоторые булевы 
функции.
Например, операция ‘’
соответствует логической 

операции импликации.

Известны два совершенно разных способа вычисления 

логических выражений, которые называются вычислениями по 
полной схеме и по краткой схеме. Рассмотрим эти способы на 
примере несложного выражения: ‘
&
&
x
a
b
c
d


’.

При вычислении по полной схеме будут всегда выполняться 

все указанные в выражении операции. Сперва будет вычислена и 
сохранена 
конъюнкция 
‘ &
a
b’, 
затем 
‘
&
c
d ’
и, 
наконец, 

дизъюнкция.

Вычисление по краткой схеме удобнее проиллюстрировать 

следующей схемой, показанной на рис. 2.1.

a
b
c
d

x = 1

x = 0
0

1

1

0

1

0

1
0

Рис. 2.1. Вычисление булевского выражения по краткой схеме

На самом деле, при таком вычислении никакие булевские 

операции вообще не используются. Вместо них для вычисления 
выражения 
используются 
проверки, 
условные 
переходы 
и 

присваивания значений 0 или 1. Нетрудно показать, что при 
программировании булевой формулы по краткой схеме можно 
выполнять проверки значений переменных в том же порядке, в 
котором эти переменные встречаются в формуле, а условия и 
адреса переходов определяются использованными в формуле 
операциями AND, OR, NOT и скобками.

Зададим простой вопрос: может ли результат вычисления 

логического 
выражения 
зависеть 
от 
выбранного 
способа 

вычисления? Очевидным ответом будет «нет». Поскольку оба 
способа правильно вычисляют логические выражения, они не 
могут дать разных результатов.

Теперь сформулируем вопрос немного иначе. Может ли 

результат работы программы зависеть от того, какая схема 
вычисления логических выражений используется?

Как ни удивительно, в этом случае ответом будет «да».
Рассмотрим следующий фрагмент программы на языке Pascal, 

содержащий очень простой цикл суммирования положительных
элементов, расположенных в начале массива из 100 элементов.

Доступ онлайн
299 ₽
В корзину