Алгоритмы и структуры данных Лектор – заведующий кафедрой

Скачать презентацию Алгоритмы и структуры данных Лектор – заведующий кафедрой Скачать презентацию Алгоритмы и структуры данных Лектор – заведующий кафедрой

aisd_lektsii_(1).ppt

  • Размер: 2.8 Мб
  • Автор: Альберт Хаустов
  • Количество слайдов: 229

Описание презентации Алгоритмы и структуры данных Лектор – заведующий кафедрой по слайдам

Алгоритмы и структуры данных Лектор – заведующий кафедрой компьютерных технологий и систем Куб. ГАУ,Алгоритмы и структуры данных Лектор – заведующий кафедрой компьютерных технологий и систем Куб. ГАУ, заслуженный деятель науки РФ, доктор технических наук, профессор Лойко Валерий Иванович

ЛИТЕРАТУРА Основная 1.  Лойко В. И.  Структуры и алгоритмы обработки данных. УчебноеЛИТЕРАТУРА Основная 1. Лойко В. И. Структуры и алгоритмы обработки данных. Учебное пособие. Краснодар: Кубанский государственный аграрный университет, 2000. 2. Лойко В. И. , Лаптев С. В. Структуры и алгоритмы обработки данных. Учебное пособие. Краснодар: Кубанский государственный аграрный университет, 2013. 3. Лойко В. И. , Лаптев С. В. Алгоритмы и структуры данных: Интернет портал. Краснодар: Куб. ГАУ, 2016. 4. Вирт Н. Алгоритмы и структуры данных. — М. : Мир, 2001. 5. Ленгсам Й, Огенстайн М, Тененбаум А. Структуры данных для персональных ЭВМ. — М. : Мир, 1989. Дополнительная 1. Хусаинов Б. С. Структуры и алгоритмы обработки данных. Примеры на языке Си (+CD). Учеб. пособие. — М. : Финансы и Статистика, 2004. 2. Райли Д. Абстракция и структуры данных. Вводный курс. М. : Мир, 1993. 3. Ахо А. В. , Хопкрофт Д. Э. , Ульман Д. Д. Структуры данных и алгоритмы. — М. — Санкт-Петербург — Киев: Вильямс, 2001. 4. Кондратьева С. Д. Введение в структуры данных. – М. Изд. МГТУ, 2000. – 376 с.

Структуры данных - это совокупность элементов данных и отношений между ними.  При этомСтруктуры данных — это совокупность элементов данных и отношений между ними. При этом под элементами данных может подразумеваться как простое данное, так и структура данных. Под отношениями между данными понимают функциональные связи между ними и указатели на то, где находятся эти данные.

   Элемент структуры данных S: =(D, R) , где S - структура Элемент структуры данных S: =(D, R) , где S — структура данных, D – данные, R — отношения.

Структуры данных классифицируются:  1. По связанности данных в структуре - если данные вСтруктуры данных классифицируются: 1. По связанности данных в структуре — если данные в структуре связаны очень слабо, то такие структуры называются несвязанными (вектор, массив, строки, стеки) — если данные в структуре связаны, то такие структуры называются связанными (связанные списки) 2. По изменчивости структуры в процессе выполнения программы — статические структуры — структуры, неменяющиеся до конца выполнения программы (записи, массивы, строки, векторы) — полустатические структуры (стеки, деки, очереди) — динамические структуры — происходит полное изменение при выполнении программы 3. По упорядоченности структуры — линейные (векторы, массивы, стеки, деки, записи) — нелинейные (многосвязные списки, древовидные структуры, графы) Наиболее важной характеристикой является изменчивость структуры в процессе выполнения программы

СТАТИЧЕСКИЕ СТРУКТУРЫ Вектор (одномерный массив)  - это чисто линейная упорядоченная структура, где отношениеСТАТИЧЕСКИЕ СТРУКТУРЫ Вектор (одномерный массив) — это чисто линейная упорядоченная структура, где отношение между ее элементами есть строго выраженная последовательность элементов структуры

Массив – – структура, в которой элементами являются векторы (элементы которого тоже являются элементамиМассив – – структура, в которой элементами являются векторы (элементы которого тоже являются элементами массива)

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

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

Логическая структура иерархической записи  1 -ый уровень Студент = запись 2 -ой уровеньЛогическая структура иерархической записи 1 -ый уровень Студент = запись 2 -ой уровень Номер 2 -ой уровень Имя = запись 3 -ий уровень Фамилия 3 -ий уровень Имя 3 -ий уровень Отчество 2 -ой уровень Анкетные данные = запись 3 -ий уровень Место рождения 3 -ий уровень Год рождения 3 -ий уровень Родители = запись 4 -ый уровень Мать 4 -ый уровень Отец 2 -ой уровень Факультет 2 -ой уровень Группа 2 -ой уровень Оценки = запись 3 -ий уровень Английский 3 -ий уровень Физика

Основные операции над записями: Прочтение содержимого поля записи. Занесение информации в поле записи. ВсеОсновные операции над записями: Прочтение содержимого поля записи. Занесение информации в поле записи. Все операции, которые разрешаются над полем записи, соответствующего типа.

Таблица - это конечный набор записей Таблица — это конечный набор записей

Основные операции с таблицами: Поиск записи по заданному ключу.  Занесение новой записи вОсновные операции с таблицами: Поиск записи по заданному ключу. Занесение новой записи в таблицу.

Списки - это набор определенным образом связанных элементов данных, которые в общем случае могутСписки — это набор определенным образом связанных элементов данных, которые в общем случае могут быть разного типа : E 1 , E 2 , . . . . , E n , . . . n > 1 и не зафиксировано. Количество элементов списка может меняться в процессе выполнения программы. Различают 2 вида списков: несвязные и связные (несвязанные и связанные). В несвязных списках связь между элементами данных выражена неявно (векторы, записи). В связных списках в элемент данных заносится указатель связи с последующим или предыдущим элементом списка.

 • ПОЛУСТАТИЧЕСКИЕ СТРУКТУРЫ К полустатическим  структурам данных относят,  в принципе, • ПОЛУСТАТИЧЕСКИЕ СТРУКТУРЫ К полустатическим структурам данных относят, в принципе, динамические структуры (такие как стеки , очереди и деки ), реализованные на статических векторах (одномерных массивах).

Структура вида LIFO ( Last Input First Output - последним пришел, первым ушел ),Структура вида LIFO ( Last Input First Output — последним пришел, первым ушел ), при которой на обработку первым выбирается тот элемент, который поступил в нее последним, называется стеком.

Операции, производимые над стеками: 1. Занесение элемента в стек. Push ( S , xОперации, производимые над стеками: 1. Занесение элемента в стек. Push ( S , x ), где S — идентификатор стека, x — заносимый элемент. 2. Выборка элемента из стека. Pop ( S ) 3. Определение пустоты стека. Empty ( S ) 4. Прочтение элемента без его выборки из стека. Stack. Top ( S ) 5. Определение переполнения стека (для полустатических структур) Full(S)

i = указатель вершины Push ( S , x ) i = i+1 i = указатель вершины Push ( S , x ) i = i+1 S(i) = x return Full(S) if i = max. S then “ переполнение ” Stop return endif Pop ( S ) x = S(i) i = i -1 return Empty ( S ) if i = 0 then “ пусто ” Stop return endif Stack. Top ( S ) x = S(i) return

Push ( S , i ) if i = max. S then “ переполнениеPush ( S , i ) if i = max. S then “ переполнение ” Stop return endif i = i+1 S(i) = x return

Pop ( S ) if i = 0 then “ пусто ” Stop returnPop ( S ) if i = 0 then “ пусто ” Stop return endif x = S(i) i = i -1 return

Empty ( S ) if i = 0 then empty = true else emptyEmpty ( S ) if i = 0 then empty = true else empty = false endif return Pop ( S ) Empty ( S ) if empty = true then “ пусто ” Stop return endif x = S(i) i = i -1 return

Очередь  – это структура вида FIFO ( First In First Out  -Очередь – это структура вида FIFO ( First In First Out — первым пришел, первым ушел). Очередь открыта с обеих сторон, но элементы могут вставляться только в конец очереди, а удаляться только из начала очереди, т. е. удаляется первый помещаемый в очередь элемент, после чего ранее второй элемент становится первым. По этой причине очередь часто называют списком, организованным по принципу «первый размещенный первым удаляется» в противоположность принципу стековой организации — «последний размещенный первым удаляется» . Для очереди вводят два указателя: один — на начало очереди ( F ), второй- на ее конец ( R ).

Операции, производимые над очередью Операция insert  ( q , x )  -Операции, производимые над очередью Операция insert ( q , x ) — помещает элемент х в конец очереди q. Операция remove ( q ) удаляет элемент из начала очереди q и присваивает его значение внешней переменной. Операция, empty (q) — вводится с целью предотвращения возможности выборки из пустой очереди. Операция full ( q ) — вводится с целью предотвращения возможности переполнения одномерного массива, на котором реализуется полустатическая очередь.

Пример работы  c  очередью при использовани и стандартных процедур max. Q =Пример работы c очередью при использовани и стандартных процедур max. Q = 5 R = 0, F = 1 Условие пустоты очереди R < F (0 < 1) Произведем вставку элементов A , B и C в очередь : Insert (q, A); Insert (q, B); Insert (q, C);

Убираем элементы A и B из очереди : Remove  (q); Убираем элементы A и B из очереди : Remove (q);

Empty (q)  if R  F then empty = true else empty =Empty (q) if R < F then empty = true else empty = false endif return Insert (q, x) Full (q) if full = true then ‘ переполнение ’ stop return endif R = R + 1 q(R) = x return Remove (q) Empty (q) if empty = true then ‘ пусто ’ stop return endif x = q(F) F = F + 1 return. Full (q) if R = max. Q then full = true else full = false endif return Алгоритмы основных операций с очередью

Убираем элементы С, D  и  E из очереди : Remove  (q);Убираем элементы С, D и E из очереди : Remove (q); Remove (q). Добавляем элементы D и E : Insert (q, D); Insert (q, E);

Возникла абсурдная ситуация,  при которой очередь является пустой ( R  F )Возникла абсурдная ситуация, при которой очередь является пустой ( R < F ) , однако новый элемент разместить в ней нельзя, так как R = max. Q.

Одним из решений возникшей проблемы может быть модификация операции Remove  ( q )Одним из решений возникшей проблемы может быть модификация операции Remove ( q ) таким образом, что при удалении очередного элемента вся очередь смещается к началу массива. Переменная F больше не требуется, поскольку первый элемент массива всегда является началом очереди. Пустая очередь представлена очередью, для которой значение R равно нулю.

Произведем вставку элементов A ,  B  и C  в очередь :Произведем вставку элементов A , B и C в очередь : Insert (q, A); Insert (q, B); Insert (q, C);

Убираем элемент A из очереди : Remove  (q) Убираем элемент A из очереди : Remove (q)

Операция remove  ( q )  может быть в этом случае реализована следующимОперация remove ( q ) может быть в этом случае реализована следующим образом : Remove ( q ) x = q(1) for i =1 to R-1 q(i) = q(i — 1) next i R =R-1 return

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

Предположим,  что очередь содержит три элемента - в позициях 3, 4 и 5Предположим, что очередь содержит три элемента — в позициях 3, 4 и 5 пятиэлементного массива. Хотя массив и не заполнен, последний элемент очереди занят.

Если теперь делается попытка поместить в очередь элемент G , то он будет записанЕсли теперь делается попытка поместить в очередь элемент G , то он будет записан в первую позицию массива. Первый элемент очереди есть q (3), за которым следуют элементы q (4), q (5) и q (1). К сожалению, условие R < F больше не годится для проверки очереди на пустоту.

Одним из способов решения этой проблемы является введение соглашения,  при котором значение FОдним из способов решения этой проблемы является введение соглашения, при котором значение F есть индекс элемента массива, немедленно предшествующего (по кольцу) первому элементу очереди , а не индекс самого первого элемента. В этом случае, поскольку R содержит индекс последнего элемента очереди, условие F = R подразумевает, что очередь пуста.

Перед началом работы с кольцевой очередью в F  и R  устанавливается значениеПеред началом работы с кольцевой очередью в F и R устанавливается значение последнего индекса массива max. Q , а не 1 и 0. Поскольку R = F , то очередь изначально пуста.

Основные операции с кольцевой очередью 1.  Вставка элемента q в очередь x Insert(q,Основные операции с кольцевой очередью 1. Вставка элемента q в очередь x Insert(q, x) ; 2. Извлечение элемента из очереди x Remove ( q ) ; 3. Проверка очереди на пустоту Empty ( q ) ; 4. Проверка очереди на переполнение Full(q).

Операция  Empty ( q ) if F = R then empty = trueОперация Empty ( q ) if F = R then empty = true else empty = false endif return Операция Remove ( q ) empty (q) if empty = true then “ пусто ” stop endif if F = max. Q then F =1 else F = F+1 endif x = q(F) return Проверка на «пустоту» в операции Remove производится сразу же после входа в подпрограмму, до момента обновления значения F, а з начение F должно быть модифицировано до момента извлечения элемента.

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

Если произвести следующую вставку,  то массив становится целиком заполненным,  и попытка произвестиЕсли произвести следующую вставку, то массив становится целиком заполненным, и попытка произвести еще одну вставку приводит к переполнению. Это регистрируется тем фактом, что F = R , то есть это соотношение как раз и указывает на переполнение. Очевидно, что при такой реализации нет возможности сделать различие между пустой и заполненной очередью.

Одно из решений состоит в том, чтобы пожертвовать одним элементом массива и позволить очередиОдно из решений состоит в том, чтобы пожертвовать одним элементом массива и позволить очереди расти додо объема, на единицу меньшего максимального. . Предыдущий рисунок иллюстрирует именно это соглашение. Попытка разместить в очереди еще один элемент приведет к переполнению. Проверка на переполнение в подпрограмме insert производится после установления нового значения для RR , в то время как проверка на «пустоту» в подпрограмме remove производится сразу же после входа в подпрограмму, додо момента обновления значения FF.

Подпрограмма Insert ( q, x ) может быть записана следующим образом: if R =Подпрограмма Insert ( q, x ) может быть записана следующим образом: if R = max. Q then R = 1 else R = R+1 endif ‘ проверка на переполнение ’ if R = F then print «переполнение очереди» stop endif q (R) = x return Проверка на переполнение в подпрограмме производится после установления нового значения для RR. .

Дек. Дек  Происходит от английского DEQ  - Double Ended Queue  (очередьДек. Дек Происходит от английского DEQ — Double Ended Queue (очередь с двумя концами). Дек можно рассматривать как два стека, соединенных нижними границами. Операции над деками: Insert ( d, x ) — вставка элемента. Remove(d) — извлечение элемента из дека. Empty(d) — проверка на пустоту. Full(d) — проверка на переполнение.

Контрольные вопросы 1. К каким структурам данных относятся очереди и стеки ? 2. КаковоКонтрольные вопросы 1. К каким структурам данных относятся очереди и стеки ? 2. Каково правило выборки элемента из стека ? 3. Какая операция читает верхний элемент стека без его удаления ? 4. Какую дисциплину обслуживания принято называть FIFO, а какую — LIFO ? 5. Признак переполнения кольцевой очереди ? 6. Признак пустой очереди ? 7. Что называется списком? 8. Перечислите виды списков. 9. Назовите элементы и указатели очереди. 10. Как организуется кольцевая очередь? 11. Какова особенность деков?

Динамические  структуры данных  Динамические структуры данных

Динамические структуры данных имеют две особенности:  1. Заранее не определено количество элементов вДинамические структуры данных имеют две особенности: 1. Заранее не определено количество элементов в структуре. 2. Элементы динамических структур физически не имеют жесткой линейной упорядоченности. Они могут быть разбросаны по памяти.

P 1  и P 2  это указатели,  содержащие адреса элементов, P 1 и P 2 это указатели, содержащие адреса элементов, с которыми связаны соответствующие элементы структуры.

Связные  списки С точки зрения логического представления различают линейные и нелинейные списки. Связные списки С точки зрения логического представления различают линейные и нелинейные списки. К линейным спискам относятся односвязные и двусвязные списки. К нелинейным — многосвязные. Элемент списка в общем случае представляет собой информационное поле и одно или несколько полей указателей.

Односвязные списки Элемент односвязного списка содержит, как минимум,  два поля:  информационное полеОдносвязные списки Элемент односвязного списка содержит, как минимум, два поля: информационное поле ( info ) и поле указателя ( ptr ).

Особенностью указателя  является то,  что он дает только адрес последующего  элементаОсобенностью указателя является то, что он дает только адрес последующего элемента списка. Поле указателя последнего элемента в списке является пустым ( NIL ). LST — указатель на начало списка. Список может быть пустым, тогда LST будет равен NIL. Доступ к элементу списка осуществляется только от его начала, то есть обратной связи в этом списке нет.

ТЕРМИНОЛОГИЯ • p - указатель • node(p) – узел, на который ссылается указатель pТЕРМИНОЛОГИЯ • p — указатель • node(p) – узел, на который ссылается указатель p [ при этом неважно в какое место изображения элемента (узла) списка он направлен на рисунке ] • ptr(p) – ссылка на последующий элемент узла node(p) • ptr(p)) – ссылка последующего для node(p) узла на последующий для него элемент

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

Двусвязный список  • Двусвязный список характеризуется тем,  что у любого элемента естьДвусвязный список • Двусвязный список характеризуется тем, что у любого элемента есть два указателя. • Один указывает на предыдущий (левый) элемент ( L ), другой указывает на последующий (правый) элемент ( R ).

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

Кольцевой двусвязный  список  • Двусвязные списки получают следующим образом: в качестве значенияКольцевой двусвязный список • Двусвязные списки получают следующим образом: в качестве значения поля R последнего элемента принимают ссылку на первый элемент, а в качестве значения поля L первого элемента — ссылку на последний элемент.

Простейшие операции над односвязными списками • Вставка элемента в начало односвязного списка • Простейшие операции над односвязными списками • Вставка элемента в начало односвязного списка • Удаление элемента из начала односвязного списка

Вставка в начало списка P=Get. Node Info(P)= x Ptr(P) = Lst = P returnВставка в начало списка P=Get. Node Info(P)= x Ptr(P) = Lst = P return

Удаление из начала списка P = Lst x =Info(P) Lst = Ptr(P) Free. Node(PУдаление из начала списка P = Lst x =Info(P) Lst = Ptr(P) Free. Node(P ) return

Реализация стеков с  помощью  односвязных  списков  Стековые операции, применимые кРеализация стеков с помощью односвязных списков Стековые операции, применимые к спискам 1. Чтобы добавить элемент в стек, надо в алгоритме вставки в начало списка заменить указатель Lst на указатель S (операция Push(S, xx )) ). P = Get. Node Info(P) = x Ptr(P) = S S = P return

Проверка стека на пустоту Empty(S) if S = Nil then print “ Стек Проверка стека на пустоту Empty(S) if S = Nil then print “ Стек пуст ” Stop endif return

Выборка элемента из стека POP(S) Empty(S) P = S X = Info(P) S =Выборка элемента из стека POP(S) Empty(S) P = S X = Info(P) S = Ptr(P) Free. Node(P) return

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

Проверка очереди на пустоту  Empty(Q)  If F = nil then print “Проверка очереди на пустоту Empty(Q) If F = nil then print “ Очередь пуста ” S top endif return

Операция удаления из очереди  Remove(Q) Операция удаления из очереди должна происходить из ееОперация удаления из очереди Remove(Q) Операция удаления из очереди должна происходить из ее начала. If F = nil then print “ Очередь пуста ” S top endif P = F F = Ptr(P) X = Info(P) Free. Node(P) return Get. Node

Операция вставки в очередь  Insert(Q, x) Операция вставки в очередь должна осуществляться кОперация вставки в очередь Insert(Q, x) Операция вставки в очередь должна осуществляться к ее концу. P = Get. Node Info(P) = x Ptr(P) = Nil Ptr(R)= P R = P return

Контрольные  вопросы 1. Какие динамические структуры Вам известны? 2. В чем отличительная особенностьКонтрольные вопросы 1. Какие динамические структуры Вам известны? 2. В чем отличительная особенность динамических объектов? 3. Какой тип данных представлен для работы с динамическими объектами? 4. Как связаны элементы в динамической структуре ? 5. Назовите основные особенности односвязного списка. 6. В чем отличие линейных списков от кольцевых ? 7. Зачем были введены двусвязные списки ? 8. В чем разница в операциях, производимых над односвязными и двусвязными списками ? 9. Какой список является более удобным в обращении, односвязный или двусвязный ? 10. Что такое указатель? 11. Какие стековые операции можно производить над списками? 12. Какие операции, производимые над очередью, можно производить над списками ?

Организация операций Getnode, Freenode и утилизация освободившихся элементов Для более эффективного использования памяти компьютераОрганизация операций Getnode, Freenode и утилизация освободившихся элементов Для более эффективного использования памяти компьютера при работе его со списками, создается свободный список, имеющий тот же формат полей, что и у функциональных списков. Как правило, свободный список создается в памяти машины как стек. Создание нового элемента (операция Get. Node ) эквивалентно выборке элемента из свободного стека, а операция Free. Node — добавлению в свободный стек освободившегося элемента.

Пустой список по типу стека с указателем начала списка - Avail  Операция Пустой список по типу стека с указателем начала списка — Avail Операция P = Get. Node Для реализации операции Get. Node необходимо указателю сгенерированного элемента присвоить значение указателя начала свободного списка, а указатель начала свободного списка перенести к следующему элементу. Перед этим надо проверить, есть ли элементы в списке. Пустота свободного списка ( Avail = n il ), эквивалентна переполнению функционального списка.

If Avail = Nil then Print “ Переполнение ”  Stop else P =If Avail = Nil then Print “ Переполнение ” Stop else P = Avail = Ptr(Avail) e ndif return

Операция Free. Node (P)  При освобождении элемента из функционального списка, он заносится вОперация Free. Node (P) При освобождении элемента из функционального списка, он заносится в свободный список. Ptr(P) = Avail = P return

Метод счетчиков В каждый элемент многосвязного списка вставляется поле счетчика,  который считает количествоМетод счетчиков В каждый элемент многосвязного списка вставляется поле счетчика, который считает количество ссылок на данный элемент. Когда счетчик элемента оказывается в нулевом состоянии, а поля указателей элемента находятся в состоянии nil , этот элемент возвращается в пул свободных элементов. Утилизация освободившихся элементов в многосвязных списках

Метод маркера  (сборки мусора , то есть неиспользуемых элементов) Если с каким-то элементомМетод маркера (сборки мусора , то есть неиспользуемых элементов) Если с каким-то элементом установлена связь, то однобитовое поле элемента (маркер) устанавливается в “ 1”, иначе — в “ 0”. По сигналу переполнения отыскиваются элементы, у которых маркер установлен в ноль, т. е. включается программа сборки мусора, которая просматривает всю отведенную память и возвращает в список свободных элементов все элементы, не помеченные маркером.

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

Пример  Необходимо вставить элемент X  в существующий массив между 5 -м иПример Необходимо вставить элемент X в существующий массив между 5 -м и 6 -м элементами.

Для проведения данной операции в массиве нужно сместить “вниз” все элементы,  начиная сДля проведения данной операции в массиве нужно сместить “вниз” все элементы, начиная с X 6 — увеличить их индексы на единицу. В результате вставки получаем следующий массив :

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

Вставка и извлечение элементов из списка  • Сначала определяем элемент,  после которогоВставка и извлечение элементов из списка • Сначала определяем элемент, после которого необходимо провести операцию вставки или удаления. • Вставка производится с помощью процедуры Ins. After( P , x ) , а удаление — Del. After( P ). • При этом рабочий указатель P должен указывать на элемент, после которого необходимо произвести вставку или удаление.

Вставка  Ins. After( P ,  x ) • Пусть необходимо вставить новыйВставка Ins. After( P , x ) • Пусть необходимо вставить новый элемент с информационным полем x после элемента, на который указывает рабочий указатель P.

Ins. After( P , X) QXLst P Lst P nil Ins. After( P , X) QXLst P Lst P nil

Алгоритм Q = Get. Node i nfo(Q) = x  ptr(Q) = ptr(P) pАлгоритм Q = Get. Node i nfo(Q) = x ptr(Q) = ptr(P) p tr(P) = Q return

Удаление Del. After( P ) • Пусть необходимо удалить элемент списка, который следует послеУдаление Del. After( P ) • Пусть необходимо удалить элемент списка, который следует после элемента, на который указывает рабочий указатель P.

Del. After( PP )) Lst nil. P Q Del. After( PP )) Lst nil. P Q

Алгоритм Del. After( P ) Q = ptr(P) X = info(Q) ptr(P) = ptr(Q)Алгоритм Del. After( P ) Q = ptr(P) X = info(Q) ptr(P) = ptr(Q) Free. Node(Q) return

Просмотр односвязного списка при вставке и удалении • Обозначим через P - рабочий указательПросмотр односвязного списка при вставке и удалении • Обозначим через P — рабочий указатель ; в начале процедуры P = Lst. • Введем также указатель Q , который отстает на один элемент от P ; в начале процедуры Q = nil. • Когда указатель P получит значение nil , цикл просмотра заканчивается.

Анимация просмотра односвязного списка при вставке и удалении Lst nil. PQ Q PQ PАнимация просмотра односвязного списка при вставке и удалении Lst nil. PQ Q PQ P

Алгоритм просмотра односвязного списка при вставке и удалении Q =Nil P = Lst whileАлгоритм просмотра односвязного списка при вставке и удалении Q =Nil P = Lst while (P nil) do Q = P P = ptr(P) endwhile return

Примеры типичных операций над списками  Задача 1 • Требуется просмотреть список и удалитьПримеры типичных операций над списками Задача 1 • Требуется просмотреть список и удалить элементы, у которых информационные поля равны 4.

Обозначим P - рабочий указатель ;  в начале процедуры P = Lst. Обозначим P — рабочий указатель ; в начале процедуры P = Lst. Введем также указатель Q , который отстает на один элемент от P. Когда указатель P найдет заданный элемент, последний будет находиться относительно элемента с указателем Q как последующий элемент.

Анимация решения задачи 1 Lst nil. PQ 4 48 21 P Q P Анимация решения задачи 1 Lst nil. PQ 4 48 21 P Q P

Алгоритм x = 4 Q = nil P = Lst while P  nilАлгоритм x = 4 Q = nil P = Lst while P nil do if info(P) = x then if Q = nil then Pop(Lst) P = Lst else Del. After(Q) endif else Q = P P = Ptr(P) endif endwhile return

Задача 2 • Дан упорядоченный по возрастанию i nfo - полей список. Необходимо вставитьЗадача 2 • Дан упорядоченный по возрастанию i nfo — полей список. Необходимо вставить в этот список элемент со значением X , не нарушив упорядоченности списка. • Пусть X = 16 • Начальные условия: Q = Nil, P = Lst

Анимация решения задачи 2 Lst nil. PQ 4 98 21 X  info(P) =Анимация решения задачи 2 Lst nil. PQ 4 98 21 X > info(P) = = ? ? Да ! Q PQ PНет ! 16 S Q

Алгоритм X = 16 Q =Nil P = Lst while (P  nil) andАлгоритм X = 16 Q =Nil P = Lst while (P nil) and (X > info(P)) do Q = P P = Ptr(P) endwhile if Q = nil then Push(Lst, X) endif Ins. After(Q, X) return

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

 • В заголовок списка часто помещают динамическую переменную,  содержащую количество элементов в • В заголовок списка часто помещают динамическую переменную, содержащую количество элементов в списке (не считая самого заголовка).

Если список пуст, то остается только заголовок списка.  Удобно занести в информационное полеЕсли список пуст, то остается только заголовок списка. Удобно занести в информационное поле заголовка значение указателя конца списка. Тогда, если список используется как очередь, то F = Lst , а R = Info(Lst ). Информационное поле заголовка можно использовать для хранения рабочего указателя при просмотре списка P = Info(Lst). Другими словами, заголовок — это дескриптор (описатель) структуры данных.

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

Можно выделить три отличительных признака нелинейной структуры:  •   1) Любой элементМожно выделить три отличительных признака нелинейной структуры: • 1) Любой элемент структуры может ссылаться на любое число других элементов структуры, то есть может иметь любое число полей -указателей. • 2) На данный элемент структуры может ссылаться любое число других элементов этой структуры. • 3) Ссылки могут иметь вес, то есть подразумевается иерархия ссылок.

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

 • Входной сигнал в систему это X.  •  Реакцией на входной • Входной сигнал в систему это X. • Реакцией на входной сигнал является выработка выходного сигнала Y и переход в соответствующее состояние. • Граф состояния дискретной системы можно представит в виде комбинации одного двусвязного и трех односвязных списков, которые вместе составляют нелинейный двусвязный список. При этом в информационных полях должна записываться информация о состояниях системы и ребрах. Указатели элементов должны формировать логические ребра системы.

Реализация графа в виде нелинейного списка Реализация графа в виде нелинейного списка

Контрольные вопросы 1. Для чего предназначены операции Getnode и Freenode? 2. Какие методы утилизацииКонтрольные вопросы 1. Для чего предназначены операции Getnode и Freenode? 2. Какие методы утилизации вы знаете ? 3. Перечислите элементы заголовков в списках. 4. Зависит ли время, затраченное на вставку элемента в односвязный список, от количества элементов в списке ? 5. Где процесс вставки и удаления эффективнее, в списке или в массиве ? 6. Как можно производить просмотр односвязного списка? 7. Что означает AVAIL? 8. Какой недостаток односвязных списков по сравнению с массивом? 9. Какие структуры являются нелинейными ? 10. Каковы признаки отличия нелинейных структур? 11. Как можно создать нелинейную связную структуру? 12. Что такое граф состояния ?

Рекурсивные структуры  данных  • Рекурсивная структуры данных - структура данных,  элементыРекурсивные структуры данных • Рекурсивная структуры данных — структура данных, элементы которой являются такими же структурами данных

Деревья  • Дерево - нелинейная связанная структура данных.  • Дерево характеризуется следующимиДеревья • Дерево — нелинейная связанная структура данных. • Дерево характеризуется следующими признаками: — дерево имеет один элемент, на который нет ссылок от других элементов. Этот элемент называется корнем дерева; — в дереве можно обратиться к любому элементу путем прохождения конечного числа ссылок (указателей); — каждый элемент дерева связан только с одним предыдущим элементом.

 • Любой узел дерева может быть промежуточным  либо терминальным  ( листом • Любой узел дерева может быть промежуточным либо терминальным ( листом ). На рисунке промежуточными являются элементы M 1, M 2 ; листьями — A, B, C, D, E. Характерной особенностью терминального узла является отсутствие ветвей. • Высота дерева — это количество уровней дерева. У дерева на рисунке высота равна двум.

 • Количество ветвей,  растущих из узла дерева, называется степенью исхода  узла • Количество ветвей, растущих из узла дерева, называется степенью исхода узла (на рисунке для M 1 степень исхода 2, для М 2 — 3). • Для описание связей между узлами дерева применяют также следующую терминологию: М 1 — “ отец ” для элементов А и В — “ сыновья ” узла М 1.

 • Деревья могут классифицироваться по степени исхода : 1) если максимальная степень исхода • Деревья могут классифицироваться по степени исхода : 1) если максимальная степень исхода равна m , то это — m-арное дерево; 2) если степень исхода равна либо 0 , либо m , то это — полное m-арное дерево; 3) если максимальная степень исхода равна 2 , то это — бинарное дерево; 4) если степень исхода равна либо 0 , либо 2 , то это — полное бинарное дерево.

Представление деревьев  • Наиболее удобно деревья представлять в памяти ЭВМ в виде связанныхПредставление деревьев • Наиболее удобно деревья представлять в памяти ЭВМ в виде связанных списков. Элемент списка должен содержать информационные поля, в которых могут содержаться значение ключа узла и другая хранимая информация, а также поля-указатели, число которых равно степени исхода.

Представление дерева в виде нелинейного списка Представление дерева в виде нелинейного списка

Бинарные деревья  • Согласно представлению деревьев в памяти ЭВМ каждый элемент бинарного дереваБинарные деревья • Согласно представлению деревьев в памяти ЭВМ каждый элемент бинарного дерева является записью, содержащей четыре поля. Значения этих полей — соответственно ключ записи, текст записи, ссылка на элемент влево – вниз и ссылка на элемент вправо – вниз.

Формат элемента бинарного дерева Формат элемента бинарного дерева

Процедура создания элемента бинарного дерева V = Make. Tree  (key, rec)  pПроцедура создания элемента бинарного дерева V = Make. Tree (key, rec) p = getnode r (p) = rec k (p) = key v = p left ( v ) = nil right (v) = nil return

Упорядоченное бинарное дерево • В упорядоченном бинарном дереве левый сын имеет ключ меньший ,Упорядоченное бинарное дерево • В упорядоченном бинарном дереве левый сын имеет ключ меньший , чем у отца, а значение ключа правого сына больше значения ключа отца. • Например, построим бинарное дерево из следующих элементов: 50, 46, 61, 48, 29, 55, 79.

 • Получено идеально сбалансированное дерево - дерево,  в котором левое и правое • Получено идеально сбалансированное дерево — дерево, в котором левое и правое поддеревья имеют количество уровней, отличающихся не более чем на единицу.

Сведение m-арного дерева к бинарному  • Неформальный алгоритм: 1. В любом узле дереваСведение m-арного дерева к бинарному • Неформальный алгоритм: 1. В любом узле дерева отсекаются все ветви, кроме крайней левой , соответствующей старшим сыновьям. 2. Соединяются горизонтальными линиями все сыновья одного родителя. 3. Старшим (левым) сыном в любом узле полученной структуры будет узел, находящийся под данным узлом (если он есть).

Графическое пояснение алгоритма Графическое пояснение алгоритма

Реализация полученного бинарного дерева с помощью нелинейного двусвязного списка Реализация полученного бинарного дерева с помощью нелинейного двусвязного списка

Основные операции с деревьями  1. Обход дерева.    2. Удаление поддерева.Основные операции с деревьями 1. Обход дерева. 2. Удаление поддерева. 3. Вставка поддерева. Для выполнения обхода дерева необходимо выполнить три процедуры: 1. Обработка корня. 2. Обработка левой ветви. 3. Обработка правой ветви.

 • В зависимости от того, в какой последовательности выполняются эти три процедуры, различают • В зависимости от того, в какой последовательности выполняются эти три процедуры, различают три вида обхода. 1. Обход сверху вниз. Процедуры выполняются в последовательности 1 — 2 — 3. 2. Обход слева направо. Процедуры выполняются в последовательности 2 — 1 — 3. 3. Обход снизу вверх. Процедуры выполняются в последовательности 2 — 3 -1.

A B C D E F G A-B-C-E-D-F-G – сверху вниз C-B-D-E-F-A-G – слеваA B C D E F G A-B-C-E-D-F-G – сверху вниз C-B-D-E-F-A-G – слева направо C-D-F-E-B-G-A – снизу вверх. Направления обхода дерева

 • В зависимости от того, после какого по счету захода в узел он • В зависимости от того, после какого по счету захода в узел он подвергается обработке, реализуется один из трех видов обхода. • Если обработка идет после первого захода в узел, то это обход сверху вниз , • если после второго — то слева направо , • если после третьего — то снизу вверх.

Операция удаления поддерева  • Необходимо указать узел, к которому подсоединяется удаляемое поддерево иОперация удаления поддерева • Необходимо указать узел, к которому подсоединяется удаляемое поддерево и указатель корня этого поддерева. • Исключение поддерева состоит в том, что разрывается связь с удаляемым поддеревом, т. е. указатель элемента, связанного с узлом-корнем удаляемого поддерева, устанавливается в nil.

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

Создание дерева бинарного поиска • Пусть заданы элементы с ключами:  14,  18,Создание дерева бинарного поиска • Пусть заданы элементы с ключами: 14, 18, 6, 21, 1, 13, 15. • Построим упорядоченное бинарное дерево по этим ключам.

14 18 treeq p v p 14, 18 К алгоритму построения дерева 14 18 treeq p v p 14, 18 К алгоритму построения дерева

К алгоритму построения дерева К алгоритму построения дерева

Алгоритм создания дерева бинарного поиска  read (key, rec) tree = maketree(key , Алгоритм создания дерева бинарного поиска read (key, rec) tree = maketree(key , rec) while not eof do p = tree q = tree read (key, rec) v = maketree(key, rec) while p nil do q = p if key < k(p) then p = left(p) else p = right(p) endif endwhile if key < k(q) then left(q) = v else right(q) = v endif endwhile return

Рекурсивные алгоритмы обхода (прохождения) бинарных деревьев  1. Сверху вниз А, В, С. 2.Рекурсивные алгоритмы обхода (прохождения) бинарных деревьев 1. Сверху вниз А, В, С. 2. Слева направо или симметричное прохождение В, А, С. 3. Снизу вверх В, С, А. Наиболее часто применяется второй способ.

 ““ сверху  вниз ”” subroutine pretrave (tree) if tree  nil then ““ сверху вниз ”” subroutine pretrave (tree) if tree nil then print info(tree) pretrave(left(tree)) pretrave(right(tree)) endif return

 ““ симметричный ”” subroutine intrave (tree) if tree  nil then  intrave(left(tree)) ““ симметричный ”” subroutine intrave (tree) if tree nil then intrave(left(tree)) print info(tree) intrave(right(tree)) endif return

Пояснение рекурсии обхода бинарного дерева на примере процедуры intrave (tree) Пронумеруем строки алгоритма процедурыПояснение рекурсии обхода бинарного дерева на примере процедуры intrave (tree) Пронумеруем строки алгоритма процедуры 1. if tree nil 2. then intrave (left(tree)) 3. print info (tree) 4. intrave (right (tree)) 5. endif 6. return Обозначим указатели : t → tree; l → left; r → right.

Пояснение рекурсии обхода Пояснение рекурсии обхода

Поиск является одной из основных операций при обработке информации в ЭВМ. Ее назначение -Поиск является одной из основных операций при обработке информации в ЭВМ. Ее назначение — по заданному аргументу найти среди массива данных те данные, которые этому аргументу соответствуют.

Ключи данных Набор данных (любых) будем называть таблицей или файлом.  Любое данное (илиКлючи данных Набор данных (любых) будем называть таблицей или файлом. Любое данное (или элемент структуры) отличается каким-то признаком от других данных. Этот признак называется ключом. Ключ может быть первичным ( уникальным ) , т. е. в таблице существует только одна запись с этим ключом. Такой уникальный ключ называется первичным. Вторичный ключ в одной таблице может повторяться, но по нему тоже можно организовать поиск. Ключи данных могут быть собраны в одном месте (в другой таблице). Ключи, которые выделены из таблицы данных и организованы в свой файл, называются внешними ключами. Если ключ находится в записи, которую определяет, то он называется внутренним.

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

Последовательный поиск применяется в том случае, если неизвестна организация данных или данные неупорядочены. ТогдаПоследовательный поиск применяется в том случае, если неизвестна организация данных или данные неупорядочены. Тогда производится последовательный просмотр по всей таблице начиная от младшего адреса в оперативной памяти и заканчивая самым старшим. Пусть k — массив ключей. Для каждого k(i) существует r(i) – запись информации. Key — аргумент поиска. Ему может соответствовать информационная запись rec.

К последовательному поиску К последовательному поиску

Алгоритм последовательного поиска в массиве Переменная search хранит индекс найденного элемента.  for iАлгоритм последовательного поиска в массиве Переменная search хранит индекс найденного элемента. for i = 1 to n if k(i) = key then search = i return endif next i search = 0 return

 Если элемент в таблице не найден и необходимо произвести вставку, то последние два Если элемент в таблице не найден и необходимо произвести вставку, то последние два оператора заменяются на n = n + 1 k(n) = key r(n) = rec search = n return

Последовательный поиск в односвязном списке Если таблица данных задана в виде списка, то производитсяПоследовательный поиск в односвязном списке Если таблица данных задана в виде списка, то производится последовательный поиск в списке

Алгоритм поиска в списке q = nil p = table while (p  nil)Алгоритм поиска в списке q = nil p = table while (p nil) do if k(p) = key then search = p return endif q = p p = nxt(p) endwhile s = getnode k(s) = key r(s) = rec nxt(s) = nil if q = nil then table = s else nxt(q) = s endif search = s return

Эффективность последовательного поиска  Эффективность любого поиска может оцениваться по количеству сравнений С аргументаЭффективность последовательного поиска Эффективность любого поиска может оцениваться по количеству сравнений С аргумента поиска с ключами таблицы данных. Чем меньше количество сравнений, тем эффективнее алгоритм поиска. Эффективность последовательного поиска в массиве Cmin = 1 , Cmax = n. Если данные расположены равновероятно во всех ячейках массива, то C ср ≈ ( n + 1)/2. Эффективность последовательного поиска в списке — то же самое. Порядок эффективности последовательного поиска O ( n )

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

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

Таблицы индексно - последовательного поиска Таблицы индексно — последовательного поиска

Алгоритм индексно - последовательного поиска i = 1 while (i = m) and (kind(i)Алгоритм индексно — последовательного поиска i = 1 while (i <= m) and (kind(i) <= key) do i=i+1 endwhile if i = 1 then low = 1 else low = pind(i-1) endif if i = m+1 then hi = n else hi = pind(i)-1 endif for j = low to hi if key = k(j) then search = j return endif next j search = 0 return

Эффективность индексно-последовательног о поиска  Ecли считать равновероятным появление всех значений аргумента поиска, тоЭффективность индексно-последовательног о поиска Ecли считать равновероятным появление всех значений аргумента поиска, то эффективность индексно-последовательного поиска можно рассчитать следующим образом. Введем обозначения: n — размер основной таблицы; m — размер индексной таблицы; p — размер шага; m = n / p

Тогда C  = (m+ 1 )/ 2 + ( p + 1 )/Тогда C = (m+ 1 )/ 2 + ( p + 1 )/ 2 = (n/p+ 1 )/ 2 + ( p + 1 )/ 2 = = n/ 2 p + p / 2 + 1 Продифференцируем C по p и приравняем производную нулю : d C /dp = (d/dp) (n/ 2 p + p / 2 +1 ) = — n / 2 p 2 + 1 / 2 = 0 Отсюда p 2 = n ; pопт = Подставив р опт в выражение для C , получим следующее количество сравнений: C = + 1 Порядок эффективности индексно-последовательного поиска O ( ) n n n

Методы оптимизации поиска Будем считать, что искомый элемент в таблице существует.  Можно говоритьМетоды оптимизации поиска Будем считать, что искомый элемент в таблице существует. Можно говорить о некотором значении вероятности поиска того или иного элемента в таблице. Тогда вся таблица поиска может быть представлена как система с дискретными состояниями, а вероятность поиска i — го элемента — это вероятность p(i) i — го состояния системы. n i ip 1 1)(

 Количество сравнений при поиске в таблице, представленной как дискретная система, представляет собой значение Количество сравнений при поиске в таблице, представленной как дискретная система, представляет собой значение дискретной случайной величины, определяемой вероятностями состояний и номерами состояний системы. Z = C = 1 p( 1 ) + 2 p( 2 ) + 3 p( 3 ) +…+ np(n)

 Желательно, чтобы p (1)  ≥  p (2) ≥  p (3) Желательно, чтобы p (1) ≥ p (2) ≥ p (3) ≥ … ≥ p ( n ). Это минимизирует количество сравнений, то есть увеличивает эффективность. Так как последовательный поиск начинается с первого элемента, то на это место надо поставить элемент, к которому чаще всего обращаются (с наибольшей вероятностью поиска).

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

Алгоритм перестановки в начало q=  nil p  =  table while (pАлгоритм перестановки в начало q= nil p = table while (p nil) do if key = k(p) then search = p if q = nil then ‘перестановка не нужна’ return endif nxt(q) = nxt(p) = table = p return endif q = p p = nxt(p) endwhile search = 0 return

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

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

 • р - рабочий указатель • q - вспомогательный указатель, отстает на один • р — рабочий указатель • q — вспомогательный указатель, отстает на один шаг от р • s — вспомогательный указатель, отстает на два шага от р

Алгоритм метода транспозиции  s = nil q = nil p = table whileАлгоритм метода транспозиции s = nil q = nil p = table while (p nil) do if key = k(p) then ‘ нашли, транспонируем if q = nil then ‘ переставлять не надо return endif nxt(q) = nxt(p) = q if s = nil then table = p else nxt(s) = p search = p endif return endif s =q q = p p = nxt(p) endwhile search = nil return

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

Дерево оптимального поиска  Число сравнений, необходимых для поиска по дереву бинарного поиска (Дерево оптимального поиска Число сравнений, необходимых для поиска по дереву бинарного поиска ( бинарному дереву ), C = О (log n). Рассмотрим деревья бинарного поиска, приведенные на рисунках a и б. Оба дерева содержат три элемента — К 1 , К 2 , К 3 , где К 1 <К 2 <К 3.

 Число сравнений ключей, которые необходимо сделать для извлечения некоторой записи, равно номеру Число сравнений ключей, которые необходимо сделать для извлечения некоторой записи, равно номеру уровня этой записи в дереве бинарного поиска плюс 1. Предположим, что: P 1 — вероятность того, что аргумент поиска key = K 1 P 2 — вероятность того, что аргумент поиска key = K 2 P 3 — вероятность того, что аргумент поиска key = K 3 q 0 — вероятность того, что key key > K 1 q 2 — вероятность того, что K 3 > key > K 2 q 3 — вероятность того, что key > K 3 С а — число сравнений в дереве «а» С б — число сравнений в дереве «б»

 Ожидаемое число сравнений в некотором поиске есть сумма произведений вероятности того, что данный Ожидаемое число сравнений в некотором поиске есть сумма произведений вероятности того, что данный аргумент имеет некоторое заданное значение, на число сравнений, необходимых для извлечения этого значения, где сумма берется по всем возможным значениям аргумента поиска. Поэтому Са = 2 P 1+1 P 2+2 P 3+2 q 0+2 q 1+1 q 2+2 q 3 С б = 2 P 1+3 P 2+1 P 3+2 q 0+2 q 1+3 q 2+1 q

  Пусть заданы следующие вероятности значений ключей  P 1 = 0. 1 Пусть заданы следующие вероятности значений ключей P 1 = 0. 1 P 1 = 0. 1 P 2 = 0. 3 P 2 = 0. 1 P 3 = 0. 1 P 3 = 0. 3 q 0 = 0. 1 q 0 = 0. 1 q 1 = 0. 2 q 1 = 0. 1 q 2 = 0. 1 q 2 = 0. 1 q 3 = 0. 1 q 3 = 0. 2 Тогда Са = 1. 6 Са = 1. 8 С б = 2. 2 Сб = 1.

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

Бинарный поиск (метод деления пополам)  Метод используется только для отсортированных массивов.  ДопустимБинарный поиск (метод деления пополам) Метод используется только для отсортированных массивов. Допустим необходимо найти элемент с ключом key = 52.

Обозначим : low - индекс нижней границы интервала поиска hi - индекс верхней границыОбозначим : low — индекс нижней границы интервала поиска hi — индекс верхней границы интервала поиска mid — индекс середины интервала поиска low = 1 hi = n while (low <= hi) do mid = (low + hi) div 2 if key = k(mid) then search = mid return endif. Алгоритм бинарного поиска if key < k(mid) then hi = mid — 1 else low = mid + 1 endif endwhile search = 0 return

Эффективность бинарного поиска • Количество сравнений при бинарном поиске (эффективность) имеет порядок О( logЭффективность бинарного поиска • Количество сравнений при бинарном поиске (эффективность) имеет порядок О( log 2 N )

Поиск по бинарному дереву Длительность операции поиска зависит от структуры дерева.  Поиск по бинарному дереву Длительность операции поиска зависит от структуры дерева.

 • Наибольший эффект использования дерева достигается в том случае,  когда дерево сбалансировано. • Наибольший эффект использования дерева достигается в том случае, когда дерево сбалансировано. • Поиск элемента в сбалансированном дереве называется бинарным поиском по дереву. • При бинарном поиске по дереву перебирается не больше log 2 N элементов. Другими словами, эффективность бинарного поиска по дереву имеет порядок O ( log 2 N )

Алгоритм поиска по бинарному дереву  p  = tree whlie p  nilАлгоритм поиска по бинарному дереву p = tree whlie p nil do if key = k(p) then search = p return endif if key < k(p) then p = left(p) else p = right(p) endif endwhile search = nil return tree

Очень часто следствием поиска являются ситуации:  • если узел с заданным ключом неОчень часто следствием поиска являются ситуации: • если узел с заданным ключом не найден , то его надо вставить ; • если узел с заданным ключом найден , то его надо удалить.

Поиск по бинарному дереву  с включением  (вставкой)  • Для включения новойПоиск по бинарному дереву с включением (вставкой) • Для включения новой записи в дерево, прежде всего нужно найти тот узел, к которому можно присоединить новый элемент, не нарушив упорядоченности дерева. • Модифицируем процедуру поиска по бинарному дереву так, чтобы фиксировалась ссылка на узел, после обработки которого поиск прекращается. • С этой целью введем вспомогательный указатель q , отстающий от рабочего p на один шаг.

p = tree q = nil while p  nil do  q =p = tree q = nil while p nil do q = p if key = k(p) then search = p return endif if key < k(p) then p = left(p) else p = right(p) endif endwhile v = maketree(key, rec) if q = nil then tree = v else if key < k(q) then left(q) = v else right(q) = v endif search = v return Алгоритм поиска по бинарному дереву с включением (вставкой)

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

Удаление узлов бинарного дерева Удаление узлов бинарного дерева

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

Предшественником  удаляемого  узла ( 12 ) является самый правый узел левого поддереваПредшественником удаляемого узла ( 12 ) является самый правый узел левого поддерева (11). Преемником узла (12) — самый левый узел правого поддерева (13).

Будем разрабатывать алгоритм для преемника  (узел 13 ), который будет поставлен на местоБудем разрабатывать алгоритм для преемника (узел 13 ), который будет поставлен на место удаляемого узла 12. Введем указатели : p — рабочий указатель; q — отстает от р на один шаг; v — указывает на преемника удаляемого узла; t — отстает от v на один шаг; s — на один шаг впереди v (указывает на левого сына или пустое место). В результате поиска преемника на узел 13 должен указывать указатель v , а указатель s — на пустое место (как показано на рисунке).

q = nil p = tree while (p  nil) and (k(p)  key)q = nil p = tree while (p nil) and (k(p) key) do q = p if key < k(p) then p = left(p) else p = right(p) endif endwhile if p = nil then ‘ Ключ не найден ’ return endif if left(p) = nil then v = right(p) else if right(p) = nil then v = left(p) else ‘ У nod(p) — два сына ’ ‘ Введем два указателя (t отстает от v на 1 шаг , s — опережает )’ t = p v = right(p) s = left(v) Алгоритм поиска по бинарному дереву с удалением

while s  nil do   t = v   v =while s nil do t = v v = s s = left(v) endwhile if t p then ‘ v не является сыном p’ left(t) = right(v) = right(p) endif left(v) = left(p) endif if q = nil then ‘p — корень ’ tree = v else if p = left(q) then left(q) = v else right(q) = v endif freenode(p) return Алгоритм поиска по бинарному дереву с удалением ( продолжение )

Контрольные вопросы 1. В чем состоит назначение поиска? 2. Что такое уникальный ключ? 3.Контрольные вопросы 1. В чем состоит назначение поиска? 2. Что такое уникальный ключ? 3. Какая операция производится в случае отсутствия заданного ключа в списке? 4. В чем различие между последовательным и индексно-последовательным поиском? 5. Какой из них более эффективный и почему? 6. Какие способы переупорядочивания таблицы поиска Вы знаете? 7. Основные отличия метода перестановки в начало от метода транспозиции. 8. Где они будут работать быстрее, в массиве или списке? 9. В чем суть бинарного поиска? 10. Как можно обойти бинарное дерево? 11. Можно ли применять бинарный поиск к массивам? 12. Если удалить корень в непустом бинарном дереве, какой элемент станет на его место?

Сортировка - это расположение данных в памяти в регулярном виде по выбранному параметру. РегулярностьСортировка — это расположение данных в памяти в регулярном виде по выбранному параметру. Регулярность рассматривают как возрастание (убывание) значения параметра от начала к концу массива данных.

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

При сортировке могут встретиться одинаковые ключи. В этом случае желательно после сортировки расположить одинаковыеПри сортировке могут встретиться одинаковые ключи. В этом случае желательно после сортировки расположить одинаковые ключи в том же порядке, что и в исходном файле. Это — устойчивая сортировка. Мы будем рассматривать только сортировки, не использующие дополнительную оперативную память. Такие сортировки называются « на том же месте » .

  Эффективность сортировки можно рассматривать по нескольким критериям:  • время, затрачиваемое на Эффективность сортировки можно рассматривать по нескольким критериям: • время, затрачиваемое на сортировку; • объем оперативной памяти, требуемой для сортировки; • время, затраченное программистом на написание программы.

  Выделяем первый критерий.  Эквивалентом затраченного на сортировку времени можно считать количество Выделяем первый критерий. Эквивалентом затраченного на сортировку времени можно считать количество сравнений и количество перемещений при выполнении сортировки. • Порядок числа сравнений и перемещений при сортировке лежит в пределах от О ( n log n ) до О ( n 2 ); О ( n ) — идеальный и недостижимый случай.

Различают следующие методы сортировки:  • строгие (прямые) методы;  • улучшенные методы. СтрогиеРазличают следующие методы сортировки: • строгие (прямые) методы; • улучшенные методы. Строгие методы: • метод прямого включения; • метод прямого выбора; • метод прямого обмена. Эффективность строгих методов примерно одинакова.

Сортировка методом прямого включения  Элементы мысленно делятся на уже готовую последовательность a 1Сортировка методом прямого включения Элементы мысленно делятся на уже готовую последовательность a 1 , . . . , ai-1 и исходную последовательность. При каждом шаге, начиная с i = 2 и увеличивая i каждый раз на единицу, из исходной последовательности извлекается i -й элемент и перекладывается в готовую последовательность, при этом он вставляется на нужное место.

  Алгоритм этой сортировки таков:  for  i = 2 to n Алгоритм этой сортировки таков: for i = 2 to n x = a(i) находим место среди а (1)… а ( i ) для включения х next i

Алгоритм сортировки методом прямого включения без барьера for i = 2 to n xАлгоритм сортировки методом прямого включения без барьера for i = 2 to n x = a(i) for j = i — 1 downto 1 if x < a(j) then a( j + 1 ) = a(j) else go to L endif next j L: a( j + 1 ) = x n ext i r eturn

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

Алгоритм сортировки методом прямого включения  с барьером for i = 2 to nАлгоритм сортировки методом прямого включения с барьером for i = 2 to n x = a(i) a (0) = x { a (0) — барьер } j = i — 1 while x < a(j ) do a( j + 1 ) = a(j ) j = j — 1 endwhile a( j + 1 ) = x next i return

Эффективность алгоритма прямого включения  • Минимальные оценки числа сравнений C min  иЭффективность алгоритма прямого включения • Минимальные оценки числа сравнений C min и перемещений M min встречаются в случае уже упорядоченной исходной последовательности элементов, наихудшие же оценки С max и M max — когда они первоначально расположены в обратном порядке.

 • Количество сравнений в худшем случае, когда массив отсортирован противоположным образом,  Сmax • Количество сравнений в худшем случае, когда массив отсортирован противоположным образом, Сmax = n (n — 1)/2 , то есть порядок О ( n 2 ). Количество перестановок M max = Cmax + 3( n -1) , то есть порядок О ( n 2 ). Если же массив уже отсортирован, то число сравнений и перестановок минимально: C min = n -1; M min = 3( n -1).

Сортировка методом прямого выбора  Этот метод основан на следующих принципах. 1. Выбирается элементСортировка методом прямого выбора Этот метод основан на следующих принципах. 1. Выбирается элемент с наименьшим ключом. 2. Он меняется местами с первым элементом a 1. 3. Затем этот процесс повторяется с оставшимися n -1 элементами, n -2 элементами и т. д. до тех пор, пока не останется один, самый «большой» элемент.

Алгоритм сортировки прямым выбором for i = 1 to n - 1  xАлгоритм сортировки прямым выбором for i = 1 to n — 1 x = a(i) k = i for j = i + 1 to n if a(j) < x then k = j x = a(k) endif next j a(k) = a(i) = x next i return

Эффективность алгоритма  сортировки прямым выбором  • Число сравнений ключей C , очевидно,Эффективность алгоритма сортировки прямым выбором • Число сравнений ключей C , очевидно, не зависит от начального порядка ключей. Можно сказать, что в этом смысле поведение этого метода менее естественно, чем поведение прямого включения. Для C при любом расположении ключей имеем: C = n ( n -1)/2 • Порядок числа сравнений, таким образом, О( n 2 )

 • Число перестановок  минимально  М min = 3( n - 1) • Число перестановок минимально М min = 3( n — 1) в случае изначально упорядоченных ключей • и максимально , М max = 3( n — 1) + С , т. е. порядок О( n 2 ), если первоначально ключи располагались в обратном порядке. • В худшем случае сортировка прямым выбором дает порядок n 2 , как для числа сравнений, так и для числа перемещений.

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

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

 Иллюстрация к обменной сортировке Иллюстрация к обменной сортировке

Алгоритм метода прямого обмена for i = 2 to n  for j =Алгоритм метода прямого обмена for i = 2 to n for j = n to i step — 1 if a(j) < a(j — 1 ) then x = a(j — 1 ) = a(j) = x endif next j next i return

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

fl = true for i = 2 to n if fl = false thenfl = true for i = 2 to n if fl = false then return endif fl = false for j = n to i step — 1 if a(j) < a(j — 1 ) then fl = true x = a(j — 1 ) = a(j) = x endif next j next i return

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

Эффективность алгоритма сортировки прямым обменом Число сравнений Cmax = n ( n -1)/2, Эффективность алгоритма сортировки прямым обменом Число сравнений Cmax = n ( n -1)/2, порядок О( n 2 ). Число перемещений М max = 3 Cmax = 3 n ( n -1)/2, порядок О( n 2 ). Если массив уже отсортирован и применяется алгоритм с флажком, то достаточно всего одного прохода по массиву, и тогда получаем минимальное число сравнений C min = n — 1, порядок О( n ), а перемещения вообще отсутствуют

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

Улучшенные методы сортировки  Сортировка Шелла (сортировка с уменьшающимся шагом)  Быстрая сортировка (Улучшенные методы сортировки Сортировка Шелла (сортировка с уменьшающимся шагом) Быстрая сортировка ( Quick Sort )

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

Иллюстрация к сортировке Шелла  Иллюстрация к сортировке Шелла

 • Сначала отдельно группируются и в группах сортируются элементы, отстоящие друг от друга • Сначала отдельно группируются и в группах сортируются элементы, отстоящие друг от друга на расстоянии 4. Такой процесс называется четверной сортировкой. В нашем примере 8 элементов, и каждая группа состоит из двух элементов, то есть 1 -й и 5 -й элементы, 2 -й и 6 -й, 3 -й и 7 -й и, наконец, 4 -й и 8 -й элементы. После четверной сортировки элементы перегруппировываются — теперь каждый элемент группы отстоит от другого на 2 позиции — и вновь сортируются. Это называется двойной сортировкой. И наконец, на третьем проходе идет обычная или одинарная сортировка.

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

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

 • Приводимый ниже алгоритм не ориентирован на некую определенную последовательность расстояний и использует • Приводимый ниже алгоритм не ориентирован на некую определенную последовательность расстояний и использует метод прямой вставки с безусловным переходом. • При использовании метода барьера каждая из сортировок нуждается в постановке своего собственного барьера, поэтому приходится расширять массив с [0. . N ] до [- h 1. . N ].

 • Не доказано, какие расстояния дают наилучший результат, но они не должны быть • Не доказано, какие расстояния дают наилучший результат, но они не должны быть множителями один другого. Д. Кнут предлагает такую последовательность шагов h (в обратном порядке): 1, 3, 7, 15, 31, … • То есть: h m = 2 h m-1 + 1 , а количество шагов t = ( log 2 n ) — 1. • При такой организации алгоритма его эффективность имеет порядок O ( n 1, 2 )

Алгоритм сортировки Шелла Обозначим  •  h [1. . t ] - массивАлгоритм сортировки Шелла Обозначим • h [1. . t ] — массив размеров шагов ; • t – количество шагов ; • a [1. . n ] — сортируемый массив ; • k – переменная, в которую записывается размер шага сортировки ; • x — значение вставляемого элемента.

Subroutine  Shell. Sort const t = 3  h(1) = 7  h(2)Subroutine Shell. Sort const t = 3 h(1) = 7 h(2) = 3 h(3) = 1 for m = 1 to t k = h(m) for i = 1 + k to n x = a(i) for j = i — k to 1 step -k if x < a(j) then a( j+k) = a(j) else goto L endif next j L: a(j+k) = x next i next m return

Быстрая сортировка ( Quick Sort )  • Относится к методам обменной сортировки. ВБыстрая сортировка ( Quick Sort ) • Относится к методам обменной сортировки. В основе лежит методика разделения ключей по отношению к выбранному. • Слева от 6 располагают все ключи с меньшими, а справа — с большими или равными 6.

Алгоритм быстрой сортировки  if i = j then  y = a(i) =Алгоритм быстрой сортировки if i j if L < j then sort (L, j) endif if i < R then sort (i, R) endif return. Sub Sort (L, R) i = L j = R x = a((L + R) div 2) repeat while a(i) x do j = j — 1 endwhile Sub Quick. Sort (1, n) return

Эффективность алгоритма  Quick Sort Из всех существующих методов сортировки Quick Sort  самыйЭффективность алгоритма Quick Sort Из всех существующих методов сортировки Quick Sort самый эффективный. Его эффективность имеет порядок О (n log 2 n)

Алгоритм сортировки с помощью бинарного дерева  if key  k(q) then  left(q)Алгоритм сортировки с помощью бинарного дерева if key < k(q) then left(q) = v else right(q) = v endif endwhile if tree nil then intrave(left(tree)) print info(tree) intrave(right(tree)) endif returnread (key, rec) tree = maketree(key , rec) while not eof do p = tree q = tree read (key, rec) v = maketree(key, rec) while p nil do q = p if key < k(p) then p = left(p) else p = right(p) endif endwhile

Контрольные вопросы Что такое сортировка?  Назовите основные методы сортировки.  Какие методы сортировкиКонтрольные вопросы Что такое сортировка? Назовите основные методы сортировки. Какие методы сортировки относятся к строгим? Какие методы сортировки относятся к улучшенным? Какая сортировка называется устойчивой? В чем состоит суть метода прямого включения? В чем состоит суть метода прямого выбора? В чем состоит суть метода прямого обмена? Назовите разницу между этими тремя методами. Какой метод сортировки является самым эффективным? К какому из основных методов относится метод Шелла?

Экзаменационные вопросы по курсу «Алгоритмы и структуры данных» 1. Понятие типов и структур данных.Экзаменационные вопросы по курсу «Алгоритмы и структуры данных» 1. Понятие типов и структур данных. Оперативные и внешние структуры. 2. Стандартные и пользовательские типы данных. 3. Определение и представление структур данных. 4. Классификация структур данных. Векторы и массивы как статистические структуры. 5. Записи и таблицы как статические структуры. 6. Понятие списковой структуры. Стек как полустатическая структура. Операция над стеками 7. Очередь как полустатическая структура. Операции над очередью. 8. Недостатки полустатической очереди, методы их исправления. Очередь со сдвигом. 9. Кольцевая полустатическая очередь. Операции над кольцевой очередью. Деки, операции над ними. 10. Понятие динамических структур данных. Организация односвязных и двусвязных списков. Простейшие операции над односвязными списками.

Продолжение экзаменационных вопросов 11. Реализация стеков с помощью списков.  12. Смысл и организацияПродолжение экзаменационных вопросов 11. Реализация стеков с помощью списков. 12. Смысл и организация операций создания и удаления элемента динамической структуры. Понятие свободного списка и пула свободных элементов. Утилизация освободившихся элементов. 13. Очередь и операции над ней при реализации связными списками 14. Операции вставки и извлечения элементов из списка. Сравнение этих операций с аналогичными в массивах. Недостаток связного списка по сравнению с массивом. 15. Пример алгоритма решения задачи извлечения элементов из списка по заданному признаку. 16. Пример алгоритма решения задачи вставки заданного элемента в упорядоченный список. 17. Элементы заголовков в списках; нелинейные связные структуры. 18. Понятие рекурсивных структур данных. Деревья, их признаки и представления. 19. Алгоритм сведения m-арного дерева к бинарному; основные операции над деревьями; виды обхода. 20. Понятие поиска и ключей; назначение и структуры алгоритмов поиска.

Продолжение экзаменационных вопросов 21. Последовательный поиск и его эффективность. 22. Индексно-последовательный поиск. 23. ОптимизацияПродолжение экзаменационных вопросов 21. Последовательный поиск и его эффективность. 22. Индексно-последовательный поиск. 23. Оптимизация поиска. Переупорядочивание таблицы с учетом вероятности поиска элемента. Дерево оптимального поиска. 24. Метод оптимизации поиска путем перестановки в начало списка. 25. Метод транспозиции при оптимизации поиска. 26. Бинарный поиск 27. Алгоритм создания упорядоченного бинарного дерева. 28. Поиск по бинарному дереву. Эффективность поиска по бинарному дереву. 29. Поиск по бинарному дереву с включением. 30. Поиск по бинарному дереву с удалением.

Продолжение экзаменационных вопросов 31. Алгоритмы прохождения бинарных деревьев. 32. Понятие сортировки,  ее эффективность;Продолжение экзаменационных вопросов 31. Алгоритмы прохождения бинарных деревьев. 32. Понятие сортировки, ее эффективность; классификация методов сортировки. 33. Сортировка методом прямого выбора. 34. Сортировка методом прямого включения. 35. Сортировка методом прямого обмена. 36. Быстрая сортировка. 37. Сортировка Шелла. 38. Сортировка с помощью бинарного дерева. 39. Сравнительный анализ эффективности методов сортировки. 40. Нерекурсивный алгоритм обхода бинарного дерева.