Влияние върху производителността



страница3/43
Дата21.12.2022
Размер1.47 Mb.
#116011
1   2   3   4   5   6   7   8   9   ...   43
CAA.doc
Свързани:
saap conspect
Начален алг. Той запомня всички двойки и ги обхожда,за да проверим дали следва-щата дв.обекти е свърз(мн. ресурсоемен ).

Алгоритъм за бързо намиране(БН)


Осн. на този алг е масив с цели числа с св- вото,че p и q са свърз ⬄,когато p и q ел. в масива са ≡.За да изпълним обедин p и q минаваме през
масива като променяме вси-чки клетки с същата ст-ст като p да имат същата ст-ст като q.

P

q

0 1 2 3 4 5 6 7 8 9

Програмна реализация

3

4

0 1 2 4 4 5 6 7 8 9

#include

4

9

0 1 2 9 9 5 6 7 8 9

#define N 10 000

8

0

0 1 2 9 9 5 6 7 0 9

main ()

2

3

0 1 9 9 9 5 6 7 0 9

{ int I, p, q , t, id[N];

5

6

0 1 9 9 9 6 6 7 0 9

for( I = 0; I < N; I++) id[I] = I;

2

9

0 1 9 9 9 6 6 7 0 9

while(scanf(“%d, %d \n”, &p,&q) == край

5

9

0 1 9 9 9 9 9 7 0 9

{

7

3

0 1 9 9 9 9 9 9 0 9

if( id[p] == id[ q ] )continue;

4

8

0 1 0 0 0 0 0 0 0 0

for( t = id[p], I = 0; I I++)

0

2

0 1 0 0 0 0 0 0 0 0

if(id[I] == t) id[I] = id[q];

5

6

0 1 0 0 0 0 0 0 0 0

printf(“нова връзка”)

6

1

1 1 1 1 1 1 1 1 1 1

}}

Представ. в дърво.








  1. Свързаност на обекти алгоритъм с бързо обединение.Програмна реализация.Анализ и сравнение с алгоритъма за бързо намиране. Представяне в дърво.

Този алг. е базиран на структура данни: масив индекси по имена на обекти. Всеки обект сочи към друг обект от множеството в структура без цикли.За да определим дали 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. сплескване на дървото като всеки връх сочи директно корена(чрез смени на указатели)

  2. всяко ребро се разглежда 1 път - не е нужно да се помни => спестяване на памет.

Реализация:


#include #define N 10 000 main()

{ 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;


if( sz [ I ] < sz [ j ])

{ id[ I ] = j; sz[ j ] += sz[ I ];}


else { id[ j ] = I; sz [ I ] += sz[ j ];}

printf ( % d %d \n”, p, q);}}


част II на дървото.


  1. Mатематически основи в анализа на алгоритми. Използвани формули с експоненти, логаритми, редиц и.


Основните причини,за да извършваме матем.анализ на алг. са:
-за да сравним различни алг.за една и съща зад.
-за да предвиждаме производителността в нова среда
-за да задаваме ст-сти на параметрите на алг.
Алг.обикновено имат време за работа, пропорц. на една от следните ф-ии(N-главен параметър на нарастване):
1-инструкцията се изпълнява само веднъж или най-много няколко пъти, казваме че времето за работа на алг. е константа
log N-ако времето за работа на алг. е логаритмично,програмата става по-бавна с нарастването на N.Среща се при прог, които решават големи задачи.
N-времето е линейно,когато всеки вх. елемент се обработва по малко.Както се променя N,така се променя и вр. за работа
N logN-такова време за работа се по-лучава,когато алг.решават зад.,като я разделят на по-малки подзадачи,решават ги независимо и после обединяват решението
N2-когато времето е квадратично,алг.м д се използва практически само за малки зад. Появява се в алг,в които се обработват всички двойки от данни.
N3-ако алг.обработва тройка от данни,той има кубично вр.за работа,за малки задачи
2N-вр.за работа нараства експоненциално, тези алг.намират малко прилож в практиката. Осн.формули,които се използ при работа с експоненти, логаритми и редици са: 1)експонентиАХВА+В ХАВА-В ;
ХNN =2(ХN); 2N +2N =2N+1

  1. логаритми- XA=B, само ако logx B=A

--T1: loga B= logcB/logc A,при А,В,С>0,А!=1
--T2)logAB=logA+logB; за А,В>0
x*2y =AB=2z ->X+Y=Z.


  1. i=0
    редициN 2i=2N+1-1;


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. Въведение в рекурсията.Основни свойства на рекурсията.Типове рекурсии, аналлиз на производителността и доказателства.Формални техники за преобразуване на рекурсивни в нерекурсивни алгоритми;опашна рекурсия,множествена рекурсия.


Рекурсивен алг.е този,който при изпълн.си се обръща към себе си пряко или косвено поне 1 път.За да реализираме рекурс.алг. използ.рекурс.ф-ии. Има 2 вида рекурсия:
- проста – в тялото си алг.се обръща поне 1 път към себе си пряко,но с др.аргументи, които постеп.намал.и се стига до кр.ст-сти, при които алг.не се обръща към себе си
- взаимна – алг.А1 се обръща на 1 или по-вече места към А2 и обратно. Мд има м/у повече от 2 алг.

Класич.пр.за рекурс.ф-я е факториел.

N!=N(N-1)! , N>=1 с 0!=1.


Int factorial(int N)

{ if (N==0) return 1; return N*factorial(N-1); }


Рекурс.ф-ии дават сигурност,компактна реализ.Тези ф-ии трябва да удовл.=>главните св-ва:
-да реши изрично осн.сл.(усл.за край)
-всяко рекурс.викане трябва да вкл.по-малка стойност на аргументите. Пример:

int F (int i)


{ if (i<1) return 0; if (i==1) return 1;

return F(i-1) + F(i-2)


Рекурс.реализ.на тази зад.е изкл.неефективна.Алг.е с експоненц.време(изкл.мн.повт)


Сподели с приятели:

1   2   3   4   5   6   7   8   9   ...   43




©obuch.info 2024
отнасят до администрацията

    Начална страница