
- •Теоретический раздел лекции Тема 1. Программирование с использованием рекурсии
- •1.1. Cтратегии решения задачи разбиением ее на подзадачи
- •1.2. Программирование рекуррентных соотношений
- •Var z:extended;
- •1.3. Условия окончания рекурсии
- •1.4. О целесообразности использования рекурсии
- •Var I,X,y,z:word;
- •1.5 Правила выбора программной реализации рекуррентных соотношений
- •Тема 2. Задачи перебора вариантов
- •2.1. Модель дерева решений
- •2.2. Задача оптимального выбора (задача о рюкзаке)
- •2.3. Метод полного перебора двоичного дерева
- •Var wt,ct:extended;
- •Var j,k:byte;
- •If k in s then begin
- •Var j:byte;
- •Var j:byte;
- •Var wt1,oct1:byte;
- •2.4. Метод ветвей и границ
- •Var n,I:byte;
- •Var wt1,oct1:Extended;
- •Include(s,I);
- •If I in Sopt then writeln(I,a[I].W,a[I].C);
- •2.5. Эвристические методы
- •Тема 3. Поиск и сортировка массивов записей
- •3.1. Применимость сортировки и поиска
- •3.2. Массив записей и поиск в нем
- •Var m:word;
- •3.3. Сортировки массивов
- •Var c: mas; I,j,k:word;
- •Var m:word;
- •Var I,j:Word;
- •Var I,j,l,r:Word; X:Tk; w:Tzp;
- •Тема 4. Связанные списки с использованием рекурсивных данных
- •4.1. Список, стек, очередь
- •4.2. Списки на основе динамических массивов
- •Inherited create;
- •Var turn:Tlist; с1,c2:Tinf;
- •4.3. Рекурсивные данные и однонаправленные списки
- •Inherited create;
- •Var stec,st1,turn,tr1:Tlist; inf:Tinf;
- •4.4. Начальное формирование, добавление и удаление элементов однонаправленного списка
- •4.5. Разновидности связанных списков
- •Inf:Tinf;
- •Тема 5. Поиск и сортировки на связанных линейных списках
- •5.1. Поиск в однонаправленных списках
- •5.2. Сортировка однонаправленных списков
- •1 3Var Inf:tInf;
- •Тема 6. Использование линейных связанных списков
- •6.1. Вычисления арифметических выражений
- •Var ch,ch1,ch2,chr:char;
- •I:byte;ch,ch1:char;
- •6.2. Сложение больших целых чисел
- •Var u,V,s,t:byte;
- •6.3. Работа с разреженными матрицами
- •Inf:Tinf;
- •Inf:tInf;
- •Var proot,p:Ptree;
- •Var bl:boolean;
- •7.2. Бинарное дерево поиска
- •7.3. Основные операции с бинарным деревом поиска
- •Inf:tInf;
- •Var d1:Tree; c:Tinf; k:Tkey;
- •Var bl:Boolean;
- •Var m:Word;
- •Var p:Ttree; m:Word;
- •Тема 8. Хеширование
- •8.1. Что такое хеширование
- •8.2. Схема хеширования
- •Interface
- •Inf:Tinf;
- •8.4. Другие способы хеширования
- •Практический раздел Указания по выбору варианта
- •Индивидуальные практические работы и контрольные работы
- •Индивидуальная практическая работа №1. Программирование с использованием рекурсии
- •1.1. Понятие рекурсии
- •1.2. Порядок выполнения работы
- •1.2.1. Пример решения задачи
- •Индивидуальная практическая работа №2. Организация однонаправленного списка на основе рекурсивных типов данных в виде стека
- •2.1. Основные понятия и определения
- •Inf:tInf; // информация
- •Контрольная работа №1. Программирование с использованием деревьев на основе рекурсивных типов данных
- •1.1. Понятие древовидной структуры
- •Inf:tInf;
- •1.2. Компонент tTreeView
- •1.3. Бинарное дерево поиска
- •Основные операции с двоичным деревом поиска
- •1.4. Порядок написания программы
- •Inf:tInf;
- •Inherited Free;
- •Var tr:Ttree;
- •1.5. Индивидуальные задания
- •Курсовая работа
- •Литература
Тема 5. Поиск и сортировки на связанных линейных списках
5.1. Поиск в однонаправленных списках
Поиск адреса элемента списка, который содержит заданный ключ K в информационном поле Inf.key и чтение информации:
Function Tlist.Poisk(K:<тип ключа>;Var Inf:Tinf):Psel;
begin
if sp1=Nil then Resalt:=Nil else
begin//если список не пуст
sp:=sp1;
While(sp^.Inf.key<>K) and (sp^.A<>Nil)
do sp:=sp^.A;
if sp^.Inf.key<>K then Resalt:=Nil
else begin Resalt:=sp;Inf:=spi^.Inf;
end;
end;
Поиск адреса элемента списка с меткой, предшествующего тому, который содержит заданный ключ k в информационном поле Inf.key:
Function Tlist.PoiskAfter(k:<тип ключа>):Psel;
begin
if sp1^.A=Nil then Resalt:=Nil else
begin//если элементов больше чем один
sp:=sp1;
While(sp^.A^.Inf.key<>k) and (sp^.A^.A<>Nil)
do sp:=sp^.A;
if sp^.A^.Inf.key<>k then Resalt:=Nil
else Resalt:=sp;
end;
end;
5.2. Сортировка однонаправленных списков
При поиске информации в списке, выводе данных обычно список упорядочивают (сортируют) по ключу.
Метод пузырьковой сортировки основан на переставлении местами двух соседних элементов. Поменять местами два соседних элемента в однонаправленном списке можно двумя способами.
Первый способ основан на перестановке адресов двух соседних элементов следующих за элементом с известным указателем spi:
Procedure RevAfter(spi:Psel);
begin
sp:=spi^.A^.A; // 1)
spi^.A^.A:=sp^.A; // 2)
sp^.A:=spi^.A; // 3)
spi^.A:=sp; // 4)
end;
Второй способ основан на обмене информации между ячейкой с текущим указателем spi и следующей за ней:
P
Inf
1 3Var Inf:tInf;
begin
Inf Inf
2spi^.Inf:=sp^.A^.Inf;
A A
end;
Первый способ более приемлем, если элементы содержат большие массивы информации.
Теперь, можно записать два способа пузырьковой сортировки:
Вариант сортировки стека с меткой пересылкой ключей:
Procedure Tlist.SortBublAfter;
Procedure RevAfter(spi:Psel);
Begin . . . end;
Var spt:Psel;
begin
if sp1^.A<>Nil then
begin
spt:=Nil;
Repeat
sp:=sp1;
While sp^.A^.A<>spt do begin
if sp^.A^.Inf.key>sp^.A^.A^.Inf.key
then RevAfter(sp);
sp:=sp^.A;
end;
spt:=sp^.A;//запомнили последний
Until sp1^.A^.A=spt;
end;
end
Вариант сортировки стека пересылкой информации:
Procedure Tlist.SortBublInf;
Procedure RevInf(spi:Psel);
Begin . . . end;
Var spt:Tsel;
begin
spt:=Nil;
Repeat
sp:=sp1;
While sp^.A<>spt do begin
if sp^.Inf.key>sp^.A^.Inf.key then RevInf(sp);
sp:=sp^.A;
end;
spt:=sp;//запомнили последний
Until sp1^.A:=spt;
end;
Сортировка очереди слиянием
Допустим, что есть две отсортированных в порядке возрастания очереди (tq, tr:Tlist). Построим алгоритм их слияния в одну отсортированную очередь tp:Tlist:
Procedure Slip(Var tq,tr,tp:Tlist);
Var Inf:TInf;
Begin
tp:=Tlist.create;
While(tq.sp1<>Nil) and (tr.sp1<>Nil) do
if tq.sp1.Inf.key<tr.sp1.Inf.key
then begin tq.Read1(Inf);
tp.Addk(Inf) end
else begin tr.Read1(Inf);
tp.Addk(Inf) end;
while tq.sp1<>nil do begin
tq.Read1(Inf);
tp.Addk(Inf);
end;
while tr.sp1<>nil do begin
tr.Read1(Inf);
tp.Addk(Inf);
end;
end;
Разбиение одной очереди на две очереди
Procedure Div2sp(var tp,tq,tr:Psel);
Var Inf:TInf;bl:boolean;
begin
tq:=Tlist.create; tr:=Tlist.create;
bl:=true;
While bl do begin
tp.Read1(Inf);
tq.Addk(Inf);
bl:=(tp.sp1<>Nil);
If bl then begin
tp.Read1(Inf);
tr.Addk(Inf);
bl:=(tp.sp1<>Nil);
end;
end;
end;
Сортировка очереди слиянием (рекурсивная):
Procedure Sortslip(var tp:Tlist);
Var tq,tr:Tlist;
begin
if tp.sp1<>tp.spk then begin
Div2sp(tp,tq,tr);
sortslip(tq);
sortslip(tr);
slip(tq,tr,tp);
end;
end;
Сначала весь список будет разбит на списки по одному элементу, затем они будут сливаться в списки по 2 упорядоченных, затем по 3-4 упорядоченных…-пока не сольются в один упорядоченный.
Сортировка однонаправленной очереди методом слияния не требует дополнительной памяти, в отличие от такой же сортировки массива. Если требуется отсортировать файл или массив, то его считывают в список, сортируют и отсортированный список снова записывают в файл или массив. При небольших объемах информации в ячейках сортировка слиянием является одной из самых эффективных. Если информационные ячейки имеют большой объем, то более эффективной является сортировка обменом ключей.