
- •Теоретический раздел лекции Тема 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. Индивидуальные задания
- •Курсовая работа
- •Литература
I:byte;ch,ch1:char;
begin strp:=’’;
stek:=Tlist.create;
for i:=1 to length(stri) do
begin
ch:=stri[i];
if not ch in[’+’,’-’,’*’,’/’,’(’,’)’,’^’]
then strp:=strp+ch// операнд записываем в вых. стр.
else
if stek.sp1=Nil then stec.Add1(ch) //если стек пуст 1)
else
if ch=’(’then stec.Add1(ch) //откр. Скобка 2)
else
if ch=’)’then // выталкиваем все операции 3)
begin
stec.Read1(ch);
While ch<>’(’do //до ближайшей (
begin
strp:=strp+ch;// в strp
stec.Read1(ch);
End
End
else
begin // выталкивание более приоритетных 4)
pc:=prior(ch);
While (stek.sp1<>Nil) and (pc<= prior(stek.sp1.Inf)) do
begin
stec.Read1(ch1);
strp:=strp+ch1;
end;
stec.Add1(ch); // добавить после выталкивания
end;
end;//for ` выталкивание оставшихся операций 5)
While stek.sp1<>nil do begin stec.Read1(ch);
strp:=strp+ch end;
end;//OBP
6.2. Сложение больших целых чисел
Задача ставится следующим образом: для двух чисел с произвольным количеством разрядов (превосходящим возможности стандартных ячеек) требуется выполнить операции сложения.
Число Р, содержащее n разрядов можно представить в виде односвязного списка spk из отдельных цифр этого числа, причем единицы находятся в конце списка. Так число Р=1256 будет размешено следующим образом:
Пусть u,v – два больших числа, w- их сумма, w=v+u.
Var su,sv,sw:Tlist;// три очереди
< Inf:Byte; >
Procedure SumBch(su,sv:Tlist;var sw:Tlist);
Var u,V,s,t:byte;
begin
sw:=Tlist.create; s:=0;// s=0 или 1- перенос в следующий разряд
q:=10;// основание системы счисления
While (su.sp1<>Nil) and (sv.sp1<>Nil) do
begin
t:=su.sp1^.Inf+ sv.sp1^.Inf+s;
sw.Addk(t mod q);
s:=t div q;
su.sp1:=su.sp1^.A; sv.sp1:=sv.sp1^.A;
// после сложения
end;//числа в списках su и sv сохраняются
While su.sp1<>Nil do
begin
t:=su.sp1.Inf+s;
sw.Addk(t mod q);
s:=t div q;
su.sp1:=su.sp1^.A;
end;
While sv.sp1<>Nil do
begin
t:=sv.sp1.Inf+s;
sw.Addk(t mod q);
s:=t div q;
sv.sp1:=sv.sp1^.A;
end;
if s>0 then sw.Addk(s);
end;
В результате сумма будет размещена в списке (sw) в виде аналогичном u и v. Аналогично выполняется вычитание, несколько сложнее умножение и целочисленное деление больших чисел. (Предлагается реализовать в качестве упражнения).
6.3. Работа с разреженными матрицами
Решение многих прикладных задач (методы теории графов, численные методы решения дифференциальных уравнений, …) связано с обработкой матриц большой размерности n имеющих малое число ненулевых элементов. В этом случае для хранения не нулевых элементов и работы с ними эффективным является введение класса на основе одномерного массива списков, например, следующего вида
Const nr=100;// максимальная размерность
Type
Tinf=Record
a:extended;// элемент матрицы с индексами i,j
key:word; // здесь key=j второй индекс
end;
TmList=Class(Tlist)
H:array[1..nr] of Tlist; // массив из списков
Inf:Tinf;
n:word; // размер матрицы
Constructor create;
Procedure Addm(i,j:word;a:extended);
Function Readm(i,j:word):extended;
Procedure Rev(k,l:word);
. . . . . . . .
End;
Constructor TmList.create;
Var i:word;
begin
Inherited create;
for i:=1 to n do ms[i].sp1:=Nil;
end;
Добавление ненулевого элемента в матрицу:
Procedure TmList.Addm(i,j:word;a:extended);
begin
Inf.a:=a;
Inf.key:=j;
H[i].add1(inf);// используем метод класса Tlist
end;
Чтение элемента матрицы:
Function TmList.Readm(i,j:word):extended;
Var a:extended;
begin
sp:=H[i].poisk(j,a);// используем метод Tlist
if sp<>Nil then result:=a else result:=0;
end;
Перестановка местами строк матрицы:
Procedure TmList.Rev(k,l:word);
Begin
sp:=H[k]; H[k]:=H[l]; H[l]:=sp;
end;
Тема 7. Древовидные структуры данных
7.1. Древовидная структура данных
При решении игровых задач мы встретились с понятием дерева, которое использовалось в качестве математической модели для представления множества возможных вариантов. Познакомились с рекурсивным алгоритмом обхода всех узлов и листьев дерева и построенным на нем методом ветвей и границ.
Древовидная модель оказывается довольно эффективной и для представления динамических данных с целью быстрого поиска информации.
Древовидное
размещение списка данных (abcdefgkl)
можно изобразить, например, следующим
образом:
Рис 3.1.Древовидное размещение списка данных
Как видим данные размещаются в узлах дерева соединенных направленными дугами (ветвями). Если два узла соединены направленной дугой (xy) то узел х называется предшественником (родителем), а узел у – преемником (дочерью). Деревья имеют единственный узел (корень), у которого нет родителя. Узел, не имеющий дочерей называется листом. Внутренний узел – это узел, не являющийся листом или корнем. Порядок узла – количество его дочерних узлов. Степень дерева – максимальный порядок его узлов. Глубина узла равна числу его предков плюс 1. Глубина дерева – это наибольшая глубина его узлов. Дерево, представленное выше имеет степень 3 (троичное), глубину 4, корневой узел а, листы d, e, g, k, l.
Для реализации древовидных структур данных степени m используется следующая уже знакомая конструкция рекурсивного типа данных:
Type Ttree=^Tre
Tre=Record