Осн. на този алг е масив с цели числа с св- вото,че p и q са свърз ⬄,когато p и q ел. в масива са ≡.За да изпълним обедин p и q минаваме през
масива като променяме вси-чки клетки с същата ст-ст като p да имат същата ст-ст като q.
Този алг. е базиран на структура данни: масив индекси по имена на обекти. Всеки обект сочи към друг обект от множеството в структура без цикли.За да определим дали 2 обекта са в едно и също множ. следваме указатели за всеки от тях, докато стигнем до обект,който сочи себе си.Ако не са в едно и също множ.,стигаме до разл.обекти, които сочат себе си. За да получим обеди-нение просто свърз.единия към другия. Програмнареализ.завсякоpиq:
for ( i = p; i != id[I]; i = id[ i ]);
for(j=q;j!=id[j];j=id[j]);
if( i == j ) continue; // двата указат. са //еднакви => свързани числа
id[I]=j;//обединяваме
printf( “ %d %d \n”, p, q);
При обработване двойката p - q ние:
1.следваме указатели от p докато id[I]= = I, 2.следваме указатели от q докато id[j]= = j. , 3.ако I!= j => id[I] = id[j] => обединението е просто прилепяне към дърво
Анализ и сравнение
Алг.за БО е по бърз от този за БН,защото той не трябва да минава през целия масив за вся-ка входна двойка. Изпълн.на алг.за БО за-виси в гол.степен от х-ра на входа.Разлика-та м/у бързо обед. и намир. представлява подобрение, но недостатъка е че не може да се гарантира че подобрението в бързи-ната е значително защото вх. данни може да са такива че да направят намир. бавно.
Св-во. За M>N,алг.с БО може да отнеме повече от MN/2 инструкции, за да реши зад. за свързаност с M дв.от N обекта.
Док-во.Ако на вх. двойките идват подреде-ни така: 1-2, 2-3 и т.н След N-1 подобни дв. имаме N обекта в 1 и също множ,а дървото което се получило е права линия. Като N сочи към N -1, N – 1 сочи към N – 2 и т.н. За да изпълни опер.намиране за обекта N прог.трд мине през N-1 указателя. Ср. брой указатели е (N-1) /2. Ако останлите двойки свързват N с някакъв друг обект,опер.на-миране за всяка от тези дв. вкл. поне N – 1 указателя. Общата сума за М-те опер нами-ране за тази последов.от вх. дв е > МN/2
Представ в дърво.
4.Свързаностнаобекти–алгоритъмспретегленоБързообединение.Представяне. За избягване на лоши сл. при алг. за БО е създаден алг.за ПБО. Вместо случайно да се свързва II дърво към I при опер.oбединение,се следят броя на върховете в всяко дърво и винаги свързваме по-малкото дърво към по-голямото. Промяната изисква малко повече код и още 1 масив, в който се държат броя на върховете, но ефективноста съществено се подобрява.
Св-во. Алг. проследява най-много 2 lgN указателя за да определи дали 2 измежду N обекта са свързани. За големи числа -почти линеен алг. възможни подобрения:
сплескване на дървото като всеки връх сочи директно корена(чрез смени на указатели)
всяко ребро се разглежда 1 път - не е нужно да се помни => спестяване на памет.
Реализация:
#include #define N10 000main()
{ int I, j, p, q, id[N], sz[N]; for(I=0;I {id[I]=I;sz[I]=1;}
while(scanf(“%d %d\n”,&p,&q) == край)
{for(I=p;I!=id[I];I=id[I]);
for( j = q; j != id[j ]; j = id[ j ]); if (I == j ) continue;
Основните причини,за да извършваме матем.анализ на алг. са:
-за да сравним различни алг.за една и съща зад.
-за да предвиждаме производителността в нова среда
-за да задаваме ст-сти на параметрите на алг.
Алг.обикновено имат време за работа, пропорц. на една от следните ф-ии(N-главенпараметърнанарастване): 1-инструкцията се изпълнява само веднъж или най-много няколко пъти, казваме че времето за работа на алг. е константа log N-ако времето за работа на алг. е логаритмично,програмата става по-бавна с нарастването на N.Среща се при прог, които решават големи задачи.
N-времето е линейно,когато всеки вх. елемент се обработва по малко.Както се променя N,така се променя и вр. за работа
N logN-такова време за работа се по-лучава,когато алг.решават зад.,като я разделят на по-малки подзадачи,решават ги независимо и после обединяват решението
N2-когато времето е квадратично,алг.м д се използва практически само за малки зад. Появява се в алг,в които се обработват всички двойки от данни.
N3-ако алг.обработва тройка от данни,той има кубичновр.за работа,за малки задачи
2N-вр.за работа нараства експоненциално, тези алг.намират малко прилож в практиката. Осн.формули,които се използ при работа с експоненти, логаритми и редици са: 1)експоненти-ХАХВ=ХА+В ХА/ХВ=ХА-В ;
ХN +ХN =2(ХN); 2N +2N =2N+1 логаритми- XA=B, само ако logx B=A
i=0 i=0
ΣN AI=(AN+1-1)/(A-1) при 0<А<1 то ΣN AI<=1/(1-A); при N->безкр.,сумата клони към 1/(1-А)
i=1
-аритм.редици ΣN I=(N(N+1))/2 ≈N2/2
и наистина 2+5+8+..(3к-1),което е 3(1+2+..+к)-(1+1+..+1),което е предст.и ка-то(к(3к+1))/2 => ((3к+1)к)/2=3(Х)-к =>
i=1
Х=(N(N+1))/2 ,което е ≈N2/2. ΣN I2=(N(N+1)(2N+1))/6 ≈N3/3
Матем.озн,които се срещат във формулите, описващи поведението на алг са:
└х ┘- закръгляне отдолу
┌х┐-закръгляне отгоре lgN-двоичен логаритъм lnN-натурален логаритъм N!-функция факториел
FN—числа на Фибоначи
0 1 1 2 3 5 8 13 21 34 55 ...
дефинирани по формулата
FN=FN-1+FN-2 za N>=2,F0=0,F1=1
HN—хармонични числа НN=1+1/2+1/3+...+1/N.
Въведение в рекурсията.Основни свойства на рекурсията.Типове рекурсии, аналлиз на производителността и доказателства.Формални техники за преобразуване на рекурсивни в нерекурсивни алгоритми;опашна рекурсия,множествена рекурсия.
Рекурсивен алг.е този,който при изпълн.си се обръща към себе си пряко или косвено поне 1 път.За да реализираме рекурс.алг. използ.рекурс.ф-ии. Има 2 вида рекурсия:
- проста – в тялото си алг.се обръща поне 1 път към себе си пряко,но с др.аргументи, които постеп.намал.и се стига до кр.ст-сти, при които алг.не се обръща към себе си
-взаимна – алг.А1 се обръща на 1 или по-вече места към А2 и обратно. Мд има м/у повече от 2 алг.
Класич.пр.за рекурс.ф-я е факториел.
N!=N(N-1)! , N>=1 с 0!=1.
Intfactorial(intN)
{ if (N==0) return 1; return N*factorial(N-1); }
Рекурс.ф-ии дават сигурност,компактна реализ.Тези ф-ии трябва да удовл.=>главните св-ва:
-да реши изрично осн.сл.(усл.за край)
-всяко рекурс.викане трябва да вкл.по-малка стойност на аргументите. Пример:
int F (int i)
{if(i<1)return0;if(i==1)return1;
return F(i-1) + F(i-2)
Рекурс.реализ.на тази зад.е изкл.неефективна.Алг.е с експоненц.време(изкл.мн.повт)