ALGORYTMY I STRUKTURY DANYCH

26
ALGORYTMY I STRUKTURY DANYCH WYKŁAD 03 cd. Wyszukiwanie Grażyna Mirkowska PJWSTK, 2003/2004

description

ALGORYTMY I STRUKTURY DANYCH. WYKŁAD 03 cd. Wyszukiwanie Grażyna Mirkowska PJWSTK, 2003/2004. Plan wykładu. Drugi co do wielkości element Algorytm turniej K-ty co do wielkości element ciągu Algorytm Hoare Wyszukiwanie w ciągu uporządkowanym Algorytm bisekcji. - PowerPoint PPT Presentation

Transcript of ALGORYTMY I STRUKTURY DANYCH

  • ALGORYTMY I STRUKTURY DANYCHWYKAD 03 cd. Wyszukiwanie

    Grayna MirkowskaPJWSTK, 2003/2004

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • Plan wykadu

    Drugi co do wielkoci element Algorytm turniejK-ty co do wielkoci element ciguAlgorytm Hoare Wyszukiwanie w cigu uporzdkowanymAlgorytm bisekcji

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • Problem Dany jest cig rnych elementw e[1],...,e[n] pewnej przestrzeni liniowo uporzdkowanej < E, >. Znale drugi co do wielkoci element tego cigu. WP = { e[i] e[j] dla i j , n>0}, WK = {1 wynik n, e[j] e[wynik] < e[max] dla j=1,2,...,n } e[wynik] = maximum({e[1]...,e[n]} - maximum{e[1],...,e[n]})Algorytm naiwny : 1. Znale element maksymalny. 2. Usun go z rozwaa . 3. Znale element maksymalny w pozostaym zbiorze.Drugi najwikszy element cigu

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • { i := 2; max :=1; while i n do if e[i] > e[max] then max := i fi; i := i+1; od; pom := e[1]; e[1] := e[max]; e[max] := pom; i:=3; wynik := 2; while i n do if e[i] > e[wynik] then wynik := i fi; i := i+1; od; } Swap(e[1], e[max]);T(n) = 2n -3Max: = 1; for ( i =2; ie[max]) {max:=i;} }wynik := 2; for ( i =3; ie[wynik]){wynik:=i;} }e[max] := maksimum(1,n);e[wynik] := maksimum(2,n);Algorytm naiwny

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • Metoda polega na porwnywaniu ssiednich elementw cigu. Elementy wiksze (wygrywajce) przechodz do nastpnej rundy.4586588Czy mona to zrobi lepiej?

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • Kady element, z wyjtkiem maksymalnego przegra co najwyej raz.Element drugi co do wielkoci przegra jedynie z elementem maksymalnym.Wrd elementw, ktre gray z najwikszym!Por. przykadAnaliza metody

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • Krok1. Zbudowanie drzewa turnieju.Zamy, e n= 2k.Krok 2. Wybranie elementu drugiego najwikszego.lg n -1A ile elementw przegrao z najwikszym?Tyle, ile byo rund!n -1 porwnaT(n)= n + lg n -2Koszt algorytmu Turniej

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • Problem: Dany jest cig n-elementw pewnej przestrzeni liniowo uporzdkowanej . Znale k-ty najwikszy element tego cigu.2, 4, 6, 12, 78, 45, 3, 33, 17, 22Element najwikszy = 78 element drugi co do wielkoci = 45 3-ci najwikszy = 33 4-ty najwikszy = 22k-ty najwikszy element

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • Krok1. Wyszukaj element e[max] najwikszy wrd elementw e[i],...,e[n]; Krok 2. Zamie elementy na pozycjach i-tej oraz max Krok 3. Powtrz postpowanie dla nastpnego i. T(n) = (n-1) + (n-2) +... +(n-k) = k*n - k*(k+1)/2Pierwsze rozwizanie

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • Zakadam, e elementy w cigu e nie powtarzaj si.{ x := 1; while x k do max := x; for i := x+1 to n do if e[i] > e[max] then max := i fi od; swap(e[x], e[max]); x := x+1; od; wynik := e[k] }e[1]>...>e[x-1] >{e[x],...,e[n] }e[max] {e[x],...,e[n]}e[1]>...>e[x-1] >{e[x],...,e[n] }Algorytm naiwny

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • Rozdziel wszystkie elementy na wiksze od pewnego elementu M(cz starsza) i na mniejsze od M (cz modsza).M = medianaUmie median tak by oddzielaa cze modsz od starszej.Wynikiem jest mediana, jeli w czci starszej jest tylko k-1 elementw.W przeciwnym przypadku: jeli elementw starszych jest >k-1, to szukaj k-tego elementu w czci starszej. Jeli elementw starszych jest mniej ni k-1, to szukaj elementu k-(liczba elementw starszych+1) wrd elementw modszych.Czy mona to zrobi taniej?

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • 10 5 7 9 11 4 3 2 12 8 6 1W podanym cigu szukamy 7tego co do wielkoci elementumediana105 7 9 4 3 2 6 1mediana5Szukam 4-go najwikszego Wynikiem jest element 5Przykad

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • function Hoare(l, p, k) { j := SPLIT(l, p); if ( p-j = k-1) then wynik := e[j] else if p-j>k-1 then Hoare(j+1, p, k) else Hoare(l,j-1, k-(p-j+1)) fi fi } {e[1]...,e[j-1]}< e[j]
  • int function SPLIT(lewy,prawy){ mediana := e[lewy]; i := lewy+1; j := prawy; bool := true; while (bool) do while (j>lewy andif e[j] mediana ) do j := j-1 od; while (i
  • 10, 5, 9, 8, 14, 7, 12, 3, 11ijmediana143710powrtJak to dziaa?

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • Kady element jest co najwyej raz porwnywany z median. Koszt algorytmu SPLITCzyli T(SPLIT, n ) = n-1 = (n)W( n,k) = n-1 +W( n-1,k)Czyli W(n,k)= k*n k(k+1)/2A(n,k) = (n-1) + 1/n[ S j=1...n-k A(n-j, k) + S j=n-k+2... n A(j-1,k (n-j+1)] Szukanie w czci starszejSzukanie w czci modszejA(n,k) = O(n) Koszt algorytmu Hoare

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • Wyszukiwanie w cigu uporzdkowanymProblem Dany jest cig rosncy e[1],..,e[n] oraz element x pewnej przestrzeni liniowo uporzdkowanej . Chcemy ustali przedzia e[i], e[i+1], w ktrym ewentualnie mieci si x.Specyfikacja : wp= {(i
  • Metoda poszukiwa sekwencyjnych{ if x
  • Koszt redni algorytmu sekwencyjnegoRozszerzamy dany cig o elementy a i b, tzn. przyjmujemy e[0] = a i e[n+1] =b, gdzie [a,b] jest przedziaem, w ktrym mieszcz si elementy cigu oraz x. Zamy, e prawdopodobiestwo tego, e x przyjmuje jak warto z przedziau [a,b] jest zawsze takie samo. Mamy p(x [e[i],e[i+1])) = (e[i+1] e[i])/(b-a)Koszt oczekiwany algorytmu A(n) =Jeli dugoci przedziaw s takie same, to A(n) = n/2 +c, gdzie c
  • Algorytm bisekcjiMetoda dziel i zwyciajPodziel dany cig na dwie czci. Sprawd, w ktrej poowie cigu znajduje si poszukiwany element i dalej szukaj t sam metod w tej wanie poowie.{ 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 } wp : e[1] x < e[n], n>1 wk : e[wynik] x< e[wynik+1] Niezmiennik e[i] x e[j], i j1+i = j oraz e[i] x e[j]

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • Koszt algorytmu bisekcjiCzy ten algorytm zatrzymuje si ?Niech k bdzie liczb wykonanych iteracji ptli oraz odl(k) = j - i.Przed wykonaniem ptli mamy k=0 i odl(k) = n-1.odl(k+1) = odl(k)/2, jeli odl(k) jest liczb parzyst (odl(k)-1)/2 odl(k+1) (odl(k)+1)/2 , jeli odl(k) jest liczb nieparzystOdl(k) jest liczb cakowit z przedziau [1,n-1 ] i ze wzrostem k maleje!Istnieje zatem takie k, e odl(k)=1. A wic algorytm zatrzymuje si.A jaka jest najwiksza warto k? k =[ lg n]

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • Nastpne slajdy bd wykorzystane na wiczeniach

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • Skoki co 4Idea Porwnujemy element x z co czwartym elementem danego cigu tak dugo a znajdziemy element wikszy od x. Wtedy szukamy x sekwencyjnie wrd czterech poprzedzajcych go elementach cigu.Metoda dokadniej:1 krok: Zbada czy x [e[1],e[n]). Jeli nie, to ustali wynik zgodnie ze specyfikacj, a jeli tak to wykona krok 2.2 krok: Porwnywa x z kolejnymi elementami o indeksach 4i, tak dugo a (a) znajdziemy element e[4i]>x lub (b) a przekroczymy n (a) szukamy wyniku sekwencyjnie w przedziale [e[4i- 4], e[4i]), (b) szukamy wyniku sekwencyjnie w przedziale [e[4i- 4], e[n]).

    omi

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

  • Algorytm skoki co 4{ if x < e[1] then i :=0 else if x e[n] then i := n else i := 4; bool := false; while (i n and not bool) do if x e[i] then i := i + 4 else bool := true fi od; i := i- 4; while x e[i+1] do i := i+1 od; fi; fi; wynik := i }e[1] x e[n]e[j] x dla j=1,2,...,i-4, boole[j] x dla j=1,2,...,i, bool, ine[j] x dla j=1,2,...,i-4, bool , in+4e[j] x dla j=1,2,...,i-4, x
  • Skoki co k{ if x < e[1] then i :=0 else if x e[n] then i := n else i := k; bool := false; while (i n and not bool) do if x e[i] then i := i + k else bool := true fi od; i := i-k; while x e[i+1] do i := i+1 od; fi; fi; wynik := i }e[j] x
  • Optymalne kDla jakich wartoci k algorytm ma najmniejszy koszt pesymistyczny?Koszt pesymistyczny wyraa si funkcj f(n) = 2 + n/k + ( k-1)Szukamy minimum tej funkcji:f(k) = -n/k2 + 1 f(k) = 0 dla k = n oraz f ( n)>0 Koszt pesymistyczny bdzie najmniejszy, gdy k = n

    G. Mirkowska, ASD_03 Wyszukiwanie c.d.

    Na kolejnych slajdach pokaemy kilka rozwiza tego samego problemu: wyszukiwania w cigu uporzdkowanym. Przykad ten ma t zalet, e jest prosty i atwo pokaza rnic w kosztach kolejnych wersji rozwizania problemu.Chocia zadanie zostao sformuowane oglnie, to ograniczymy si w tej chwili do struktury liczb rzeczywistych. Oczywicie nie zmienia to oglnoci postpowania, ale zamieszczony tutaj tekst uywa standardowego rozumienia relacji niewikszoci. W oglnym przypadku naleaoby napisa funkcj o wartociach booleowskich, ktra realizowaaby porwnywanie elementw i odpowiednio jej uy w testach programu.Przedzia zosta podzielony na (n+1) kawakw. Skoro maj by takie same, to dugo jednego wynosi (b-a)/(n+1). Oznaczmy to przez x.Zatem A(x)= 1+ (m-1)x/nx + Suma{ ((n-i) x)/(n x) : i=1...n-1} = 1 + 1/n{ n-1 + 1+ 2 + ... + n-1} = 1+ 1/n {(n-1) + n (n-1)/2} = n/2 + 1.5 - 1/n W tym algorytmi pominiemy przypadek, e x nie naley do adnego z przedziaw wyznaczonych przez nasz cig e1,...en. Uprocimy i skrcimy tym samym algorytm. Oczywicie, dopisujc takie same testy jak w poprzednich algorytmach atwo przeksztacimy podany tu algorytm do przypadku oglnego.W zwizku z powyszym, specyfikacja wyglda tym razem nieco inaczej.atwo te wykry niezmiennik ptli.Zaproponowana formua jest rzeczywicie niezmiennikiem ptli w tym programie. Skoro x jest midzy i-tym i jty, elementem to znajduje si albo w lewej albo w prawej poowie tego przedziau. Po ustaleniu (porwnanie w instrukcji if) , w ktrej czci znajduje si nasz element , przesuwamy jeden z kocw przedziau. Zatem po wykonaniu treci ptli, znw x znajduje si miedzy i-tym i j-tym elementem. Po wykonaniu caej ptli mamy j-i=1 zatem ustalilimy przedzia.Aby ustali jaka jest najwieksza moliwa liczba k, wystarczy spyta ile razy dan liczb cakowit moemy podzieli na 2 tak by iloraz by jeszcze liczb naturaln.