Anda di halaman 1dari 9

WYSZUKIWANIE ELEMENTU

Szukaj (member) idea wp Niech E bdzie dowolnym zbiorem, a X skoczonym cigiem o elementach z E. Zbadaj, czy dany element x przestrzeni E wystpuje w cigu X. Porwnaj kolejny element tablicy z elementem x. Jeeli badany element jest rwny x, to zakocz postpowanie; Jeeli nie, to rozwa nastpny element. (n>0, (i n) e[i ] E ) wk (wynik=true, in, e[i]=x) lub (wynik=false, i=n+1, x=e[1],...,x=e[i-1]) (wynik= true wttw (i n) e[i] = x) W(n) = n = O(n) A(n) =

szukaj{ i :=1; wynik := false; while (i n and not wynik)do if (x=e[i]) then wynik := true else i := i+1 fi; od }

(n1) p 2

co dla p=1 (czyli przypadku gdy wiemy, e poszukiwany element znajduje si w w cigu) daje: A(n) =

(n+ 1) 2

Szukaj przedziau Dany jest cig rosncy e[1],..,e[n] oraz element x pewnej przestrzeni liniowo uporzdkowanej E. (search) Chcemy ustali przedzia [e[i], e[i+1]], w ktrym (ewentualnie) mieci si x. idea Najpierw sprawdzamy przedziay pierwszy i ostatni (przedziay skrajne). Jeeli x jest mniejszy od przedziau pierwszego albo wikszy od ostatniego to koczymy dziaanie i wiemy, e x nie znajduje si w przeszukiwanym cigu. W przeciwnym przypadku rozpoczynamy porwnywanie x z kolejnymi elementami cigu zaczynajc od porwnania z drugim elementem cigu. Jeeli x jest od niego mniejsze to znaczy e znajduje si w pierwszym przedziale cigu. Jeeli jest wikszy, to porwnujemy go z kolejnymi elelmentami. Algorytm koczy dziaanie gdy znajdziemy elelement wikszy od elementu x. Wtedy e[i]x<e[i+1] (n > 0, (i < n) e[i ] < e [i + 1]) e[i]x<e[i+1], in if x<e[1] then i := 0 else if x e[n] then i := n else i := 1; while x e[i+1] { i := i+1; } fi; fi; wynik := i; } wk wynik = i wttw x Przedziau i W(n) = 2+(n-1) = n+1 = O(n) A(n) =

wp {

(n1) + c , c< 2 2

Binsea Dany jest cig rosncy e[1],..,e[n] oraz element x pewnej przestrzeni liniowo uporzdkowanej E. Chcemy rch ustali przedzia [e[i], e[i+1]], w ktrym (ewentualnie) mieci si x. idea Wyznaczymy element rodkowy zbioru. Sprawdzimy, czy jest on poszukiwanym elementem. Jeli tak, to element zosta znaleziony i moemy zakoczy poszukiwania. Jeli nie, to poszukiwany element jest albo mniejszy od elementu rodkowego, albo wikszy. Poniewa zbir jest uporzdkowany, to elementy mniejsze od rodkowego bd leay w pierwszej powce zbioru, a elementy wiksze w drugiej powce. Zatem w nastpnym obiegu zbir moemy zredukowa do pierwszej lub drugiej powki - jest w nich o poow mniej elementw. Majc nowy zbir postpujemy w sposb identyczny - znw wyznaczamy element rodkowy, sprawdzamy, czy jest poszukiwanym elementem. Jeli nie, to zbir dzielimy znw na dwie poowy - elementy mniejsze od rodkowego i elementy wiksze od rodkowego. Poszukiwania kontynuujemy w odpowiedniej

powce zbioru a znajdziemy poszukiwany element lub do chwili, gdy po podziale powka zbioru nie zawiera dalszych elementw. wp (n>1, (i n)e [i ] e [i + 1] oraz e [1] x < e [n]) e[i] x < e[j], i < j wk (e[wynik ] x < e [wynik + 1]) W(n)= lg(n-1) = lgn = (lg n) Jest cakowicie poprawny ze wzgldu na podan specyfikacj. Jest algorytmem optymalnym w klasie algorytmw rozwizujcych problem wyszukiwania w cigu uporzdkowanym przez porwnywanie elementw. binSearch { i :=1; j := n; while (j-i >1) do m := (i+j) div 2; if (e[m] x) then i := m else j := m fi od; wynik := i }

Min-max Dany jest cig elementw e[i], i = 1,...,n nalecych do pewnego zbioru E liniowo uporzdkowanego przez (naiwny) relacj . Znale najwikszy i najmniejszy element tego cigu. idea Ustalamy na pocztku, e pierwszy element jest zarazem najwikszy i najmniejszy. Nastpnie przejedamy sekwencyjnie wszystkie elementy cigu. Jeeli element jest wikszy od dotychczasowego elementu maksymalnego to sam staje si elementem maksymalnym. Jeeli nie jest wikszy od elementu maksymalnego to sprawdzamy czy jest mniejszy od elementu minimalnego. Jeeli jest mniejszy to sam staje si minimalnym. Na koniec otrzymujemy element mniejszy od wszystkich i drugi element wikszy od wszystkich. (i = j ) e[i ] = e[j ] wk (1 j < i )(e [max ] e [j ] e [min] e [j ]) (min n)(max n) (i)(e[min] e[i] oraz e[max] e[i]) W(n) = 2n -2 A(n) = 2n - 2 - lg n + c

wp

MinMax1 { min := 1; max := 1; for i := 2 to n do if e[i] >e[max] then max := i else if e[i]< e[min] then min := i fi; fi; od; }

Min-max Dany jest cig elementw e[i], i = 1,...,n nalecych do pewnego zbioru E liniowo uporzdkowanego (rekurencyjny) przez relacj . Znale najwikszy i najmniejszy element tego cigu. (Zamy dla uproszczenia, e liczba elementw cigu jest potg dwjki oraz e elementami cigu s liczby rzeczywiste.) idea Sprawd ile elementw ma rozwaany cig. Jeeli liczba elementw jest wynosi 2 to porwnaj je i ustal wartoci min i max. Jeeli liczba elementw jest wiksza to najpierw podziel zadanie na dwa podzadania rwnych rozmiarw, a nastpnie rozwi oba podzadania t sam metod. Nastpnie porwnaj znalezione w podzadaniach minima, porwnaj maksima i ustal wynik kocowy. (i j )e [i ] e [j ] Wk (1 min n), (1 max n), (i )(e [min] e [i ] e [max ] e [i ]) T(n) = (3/2)*n 2 Jest optymalny w klasie dla n=2k czyli n bdcego potg dwjki algorytmw rozwizujcych problem rwnoczesnego wyszukiwania minimum i

wp class para { int min; int max }

para minMax (int i, j){ if ( i+1=j ) then if (e[j] > e[i]) then x.max := j; x.min := i else x.min := j; x.max := i fi; else k:= (i+j-1) div 2; lewy := minMax( i, k); prawy := minMax( k+1, j); if (e[prawy.min]<e[lewy.min]) then x.min:=prawy.min else x.min:=lewy.min fi; if (e[lewy.max]<e[prawy.max]) then x.max:=prawy.max else x.max:=lewy.max fi; fi; return x; }

maksimum. Udowodniono, e kady algorytm wyznaczania minimum i maksimum musi wykona w przypadku najgorszym co najmniej (3/2)*n 2 porwnania.

K-ty najwikszy element (algorytm Hoare) idea

Dany jest cig n-elementw pewnej przestrzeni liniowo uporzdkowanej (E, ). Znale kty najwikszy element tego cigu. Rozdziel wszystkie elementy na wiksze (cz starsza) od pewnego elementu M i na mniejsze (cz modsza) od M. Umie element M tak by oddziela cz starsz od modszej i niech x oznacza liczb elementw starszych. Jeeli w czci starszej jest tylko k1 elementw to M jest k-tym poszukiwanym elementem. W przeciwnym przypadku istniej dwie moliwoci. Jeeli x>k-1 to szukaj k-tego elementu w czci starszej. Natomiast jeeli x<k-1 to szukaj k-(x+1)-tego elementu wrd elemntw modszych. (i n)e [i ] E wk (1 wynik n) oraz istnieje dokadnie k-1 elementw wikszych lub rwnych e[wynik]. W(n,k) = kn k(k+1)/2 A(n, k ) = O (n)

wp

Hoare (int lewy, prawy, k);{ j := Rozdziel(lewy,prawy); if ( prawy-j = k-1) then return e[j]; else if (prawy-j>k-1) then return Hoare(j+1, prawy, k); else return Hoare(lewy,j-1,k-(prawy-j+1)) fi; fi; }

partiti Dzieli cig na dwa podcigi. Jeden zawierajcy elementy mniejsze od wybranego elementu M (najczciej za on m przyjmuje si pierwszy lub ostatni element cigu) oraz drugi zawierajcy elementy wiksze od elementu M. idea Bierzemy ostatni element cigu e[prawy] i ustalamy, e cig bdziemy dzieli wzgldem tego elementu (nazwijmy go m). Teraz idc od lewej strony cigu porwnujemy kady element z elementem m. Jeeli element jest wikszy od m to zostawiamy go w miejscu. Natomiast jeeli element jest mniejszy lub rwny od m to zamieniamy go miejscem z elementami na pocztku cigu. Dziki temu po dojciu do m, czyli ostatniego elementu cigu wiemy, e wszystkie elementy pocztkowe cigu (jest ich tyle ile znalelimy ich w cigu) s mniejsze od elementu m. Teraz tylko zamieniamy m z miejscem, w ktrym znajduje si pierwszy element wikszy od niego. ( ki)e[k]m ( i<k<j)m<e[k] W(n,k) = k*n k(n+1)/2 A(n,k)=O(n)

int Partition (lewy, prawy){ m := e[prawy];

i := lewy - 1; j := lewy; while (j < prawy) do if e[j] m then swap(e[i+1], e[j]); i := i+1; fi; j := j+1; od ; swap(e[i+1],m); return i+1 }

BFPR Dany jest cig n-elementw pewnej przestrzeni liniowo uporzdkowanej (E, ). Znale k-ty najwikszy T element tego cigu. idea Jest to modyfikacja algorytmu Hoare. Naley ustawi wszystkie elementy cigu w pitki. Nastpnie porzdkujemy rosnco kad z pitek z osobna i wyznaczmy median dla pitek. Nastpnie naley wyznaczy median median, stosujc t sam metod. Nastpnie rozdziel cig wzgldem tej wyznaczonej ostatecznej mediany. Na koniec zastosuj algorytm BFPRT rekurencyjnie dla odpowiedniego fragmentu cigu, tak jak w algorytmie Hoare. Idea algorytmu magicznych pitek polega na tym, eby znale w zbiorze A taki element, ktry zapewni podzia na stosunkowo rwne zbiory elementw mniejszych A < i wikszych A > . W(n) = (n)

Turniej idea

Dany jest cig n-elementw pewnej przestrzeni liniowo uporzdkowanej (E, ). Znale drugi najwikszy element tego cigu. Najpierw tworzymy drzewo turniejowe, gdzie poszukiwany jest element najwikszy. Elementem drugim najwikszym musi by, ktry z elementw, ktre przegray z elementem najwikszym podczas rozgrywania turnieju. T(n) = (wyszukanie elementu najwikszego wrd n elementw) + (wyszukanie elementu najwikszego wrd jednej gazi drzewa turniejowego) = (n-1) + ( lgn - 1)

SORTOWANIE
Selecti Dany jest cig e elementw e1 , e2 , ..., en nalecych do pewnej liniowo uporzdkowanej przestrzeni (E, ). onSort Znale tak permutacj i1 , i2 , ..., in liczb 1,..., n, aby ei 1 ei 2 ... ein . idea Dla wszystkich i od 1 do n-1 wyszukujemy element najmniejszy i ustawiamy go na i-tej pozycji. Czynno powtarzamy dla coraz wikszych i czyli coraz mniejszych fragmentw cigu. e [1] e [2] ... e [i 1] {e [i ], ..., e [n]} T(n)=(n-1) + (n-2) + (n-3) +... +2 +1 = n(n-1)/2=(n2)

SelectionSort{ for i := 1 to n-1 do min := i; j := i+1; while (j < n+1) do if (e[j]<e[min]) then min:=j fi;

j := j+1; od; swap(e, i, min); od }

Insertr Dany jest cig e elementw e1 , e2 , ..., en nalecych do pewnej liniowo uporzdkowanej przestrzeni (E, ). ionSor Znale tak permutacj i1 , i2 , ..., in liczb 1,..., n, aby ei 1 ei 2 ... ein . t idea Algorytm przypomina proces wybierania kart z tali, w ten sposb, e nowo otrzyman kart wstawiamy tam gdzie jest jej miejsce w zbiorze kart, ktre ju mamy. Inaczej mwic, majc ju czciowo uporzdkowany cig, sprawdzamy now liczb poprzez jej porwnanie z wszystkimi elementami i wstawienie jej tam gdzie jest jej miejsce. ptli wewntrznej x e [j ] ... e [i ] (j < i e [j ] = e [j + 1]) W(n)=n(n 1)/2=(n2) W kadej liniowo uporzdkowanej strukturze danych algorytm sortowania przez wstawianie jest cakowicie poprawny ze wzgldu na warunek pocztkowy n>0 i warunek kocowy (1 < i n)e [i 1] e [i ] oraz cig wyjciowy jest permutacj elementw cigu wejciowego.

InsertionSort{ for i := 2 to n do j := i; x:=e[i]; while (j >1 and x<e[j-1]) do e[j] := e[j-1]; j := j-1; od; e[j] := x; od }

Jeli cig jest uporzdkowany niemalejco algorytm ptli zewntrznej wykona tylko e [1] e [2] ... e [i n-1 porwna. 1] A(n)=(1/4)n2 + O (n)

Quick Dany jest cig e elementw e1 , e2 , ..., en nalecych do pewnej liniowo uporzdkowanej przestrzeni (E, ). Sort Znale tak permutacj i1 , i2 , ..., in liczb 1,..., n, aby ei 1 ei 2 ... ein . idea Rozdzielmy elementy cigu na dwie czci wzgldem pewnego elemenu rozdzielajcego m, tak by elementy mniejsze lub rwne znajdoway si na lewo od niego, a wiksze na prawo. Nastpnie posortuj stosujc t sam metod, elementy znajdujce si na lewo od m oraz na prawo od m. W(n) = (n-1)+(n-2)+ ... +W(1) = (n2 ) A(n) = cn lgn Algorytm QuickSort jest optymalny ze wzgldu na redni zoono czasow w klasie algorytmw sortujcych przez porwnywanie elementw.

QuickSort(lewy, prawy) { if (prawy > lewy) then j:= Partition(lewy, prawy); QuickSort(lewy, j-1); QuickSort(j+1, prawy); fi; }

Merge Dany jest cig e elementw e1 , e2 , ..., en nalecych do pewnej liniowo uporzdkowanej przestrzeni (E, ). Sort Znale tak permutacj i1 , i2 , ..., in liczb 1,..., n, aby ei 1 ei 2 ... ein . idea Na pocztku dzielimy cig na dwa podcigi. Nastpnie sortujemy kady z tych dwch podzielonych podcigw przy uyciu tej samej metody. Na koniec scalamy wszystkie posortowane podcigi i otrzymujemy jeden duy posortowany podcig.

wp

(lewy x prawy e [lewy ] e [lewy + 1] wk (e [lewy ] e [lewy + 1] e [x ] e [x + 1] e [x ] e [x + 1] e [x + 2] e [prawy ]) . . . e [prawy ]) pom[1] pom[2] ... T(n, scalanie) = O(n+m) Algorytm MergeSort pom[k 1] lub jest optymalny ze T(n, mergesort) = (n lgn) wzgldu na redni i na pesymistyczn zoono czasow w klasie algorytmw sortujcych przez porwnywanie elementw.

MergeSort(lewy, prawy) { if (prawy >lewy) then x := (lewy + prawy) div 2; MergeSort(lewy,x); MergeSort(x+1, prawy); scal(lewy, x, prawy); fi; } scal(lewy,x,prawy) { i:=lewy; j := x+1; k :=1; pom - tablica pomocnicza while (i x and j prawy) do if e[i]< e[j] then pom[k] := e[i]; i := i +1 else pom[k] := e[j]; j := j +1 fi; k := k+1; od; if (j>prawy) then for (j=i; j++;j<x+1) do pom[k]:= e[j]; k:= k+1; od; fi; przepisz k-1 elem z tablicy pom do e. }

Sortowanie przez Dany jest zbir elementw, ktry naley posortowa. Zbir ten musi posiada pewn wewntrzn rozrzucanie struktur. Mog to by sowa zapisane w alfabecie aciskim, liczby o ustalonej liczbie cyfr, obiekty o skoczonej i ograniczonej iloci atrybutw. Ponadto skadowe elementw musz nalee do zbiorw liniowo uporzdkowanych. idea Najpierw utwrz tyle koszykw z ilu elementw skada si alfabet. Nastpnie wrzu elementy do odpowiednich koszykw biorc pod uwag jak powtarzajc si cech np. pierwsz cyfr liczbe albo kolor karty. Nastpnie uporzdkuj zawarto kadego z koszykw osobno. Na koniec pocz zawartoci koszykw i utwrz jeden cig. T (n ) = O (n) + j=0n-1 O((nj )2 ) A(n) = O (n) + n(2 1/n) Algorytm ma koszt liniowy

BucketSort (e, n){ for i := 1 to n do dopisz e[i] do listy L[n e [i ] ] od; for i := 0 to n-1 do InsertionSort (L[i]) od; for i := 0 to n-1 do Przepisz elementy listy L[i] na kolejne pozycje cigu e od }

Sorto wanie przez zlicza nie idea Najpierw dla kadego elementu znajd liczb elementw od niego mniejszych bd mu rwnych (oznaczmy t liczb przez y). Nastpnie wstaw ten element na pozycj y+1 w nowym cigu. T(n) = O(n+k) Algorytm sortowania przez zliczanie jest stabilny, tzn. wejciowy porzdek elementw rwnych pozostaje taki sam na wyjciu.

Zliczanie (e, n, k) { for i := 1 to k do C[i] := 0 od; for j := 1 to n do C[e[j]] := C[e[j]]+1 od; for i := 2 to k do C[i] := C[i] + C[i-1]; od; for j := n downto 1 do B[C[e[j]]] := e[j]; C[e[j]] := C[e[j]] #1 od } B tablica wynikw C tablia pomocnicza o dugoci k

Sortowanie Dana jest tablica n liczba naturalnych d cyfrowych e[1], e[2], , e[n]. Niech Q0 , Q1 , ..., Q9 bd pozycyjne kolejkami FIFO, pocztkowo pustymi. RadixSort idea RadixSort(e,n){ for k := 1 to d do for i :=1 to n do j := (k-ta od koca cyfra liczby e[i]) ; Qj := Qj + e[j]; od przepisz zawartoci kubekw do e. od } T (n ) = (d n)

Struktury Danych
Sito Eratostanesa idea Zadanie polega na znalezieniu wszystkich liczb pierwszych nie wikszych ni pewna z gry ustalona liczba n. Polega na sukcesywnym wykrelaniu z listy n elementowej elementw podzielnych przez 2, przez 3, przez 4 itd. Jest wykadniczy ale do koca nie rozumiem dlaczego. Spyta na konsultacjach, strona 116 a asd.dvi

Sito2{ L := new LINK(2); x := L; for i := 3 to n do x.next:= new LINK(i); x := x.next

od; x := L; while (x 1 null) do w := x.val; poprzedni := x; y := x.next; while (y 1 null) do if (y.val mod w = 0) then poprzedni.next := y.next; else poprzedni := y; ; y := y.next; od; x := x.next; od; }