michal daniel wyszukiwanie 39

background image

Uniwersytet Śląski

Wydział Informatyki i Nauki o Materiałach

Sprawozdanie na potrzeby przedmiotu

Analiza i złożoność obliczeniowa algorytmów

Zadanie 39. Wyszukiwanie

Michał Daniel

Magisterskie, zaoczne, grupa F

Sosnowiec 2012

background image

1. Treść zadania

Niech A będzie posortowaną tablicą n różnych liczb całkowitych, wśród których mogą być też

liczby ujemne. Zaprojektuj efektywny algorytm znajdowania indeksu k, 1 ≤ k ≤ n, takiego, że A[k]

= k, o ile taki indeks istnieje. Następnie dokonaj analizy zaprojektowanego algorytmu (wyznacz

optymistyczny i pesymistyczny czas jego działania).

2. Teoria

Jedno z założeń zadania mówi, iż A jest posortowaną tablicą zawierającą różne liczby całkowite,

w tym również liczby ujemne. Założenie to umożliwia zastosowanie bisekcji znanej z algorytmu

wyszukiwania binarnego. Ponieważ zbiór A jest posortowany i zawiera różne elementy, możemy

wyznaczyć jego środkowy element, sprawdzić jego wartość i porównać ją z jego indeksem. Jeśli te

wartości są równe to otrzymujemy rozwiązanie zadania w jego optymistycznym czasie działania.

Jeśli natomiast wartości te są różne, to sprawdzając czy wartość tego elementu jest większa lub

mniejsza od swojego indeksu możemy wybrać połówkę zbioru w którym należy spodziewać się

rozwiązania (i tym samym zmniejszyć obszar poszukiwań o połowę). Nowo otrzymaną połówkę

zbioru również możemy podzielić na pół i tym samym wykonać operację wyszukiwania od nowa na

zbiorze mniejszym o połowę. Operację taką należy wykonywać dopóki nie odnaleźliśmy

rozwiązania lub ilość elementów w zbiorze jest większa niż 1 (czyli dopóty dopóki podział jest

możliwy).

Dodatkowym warunkiem jaki możemy zastosować w algorytmie jest warunek sprawdzenia, czy

wartość skrajnie prawego elementu zbioru (tzn o indeksie końca przedziału) nie jest mniejsza od 1.

Jeśli jest, oznacza to, że w zadanej tablicy nie odnajdziemy rozwiązania, ponieważ tablica jest

posortowana.

background image

3. Rozwiązanie

Algorytm zapisany w pseudokodzie:

Binarysearch(A)

1

lewo := 0

2

prawo := n-1

3

while lewo <= prawo do

4

if A[prawo] < 1 then return false

5

środek := (lewo + prawo)/2

6

if środek = A[środek] then return środek

7

if A[środek] > środek then prawo := środek – 1

8

else lewo := środek + 1

9

return false

Graficzne przedstawienie działania algorytmu dla A = [-6, -2, 1, 2, 5, 7, 10]

Złożoność optymistyczna

Optymistyczny czas działania powyższego algorytmu wynosi 1 operację, ponieważ pierwszy

element, który wybierzemy jako środkowy w zadanym zbiorze może spełniać A[k] = k lub też

ostatni element zbioru A[n] może być niedodatni. W takim przypadku algorytm wykona 1

porównanie.

background image

Złożoność pesymistyczna

Pesymistyczny przypadek to taki, dla którego rozwiązanie nie istnieje, a wszystkie elementy

zbioru są dodatnie. Jak możemy zaobserwować na powyższym rysunku, zbiór który należy

przeszukać z każdym przebiegiem zmniejsza się o połowę. Ponieważ w każdym przebiegu pętli

możemy wykonać maksymalnie 3 porównania możemy określić, że liczba wykonywanych operacji

x wynosi:

gdzie m to liczba podziałów zbioru. Liczba operacji porównania jest w tym przypadku pomijalna,

ponieważ nie ma znaczącego wpływu (jest to stała), tak więc:

A więc pesymistyczna złożoność obliczeniowa algorytmu jest klasy O(log n).

background image

Załącznik 1 – implementacja algorytmu w PHP

Algorytm zapisany w języku PHP wraz z objaśnieniami:

// parametrem jest posortowana tablica
function binarysearch(&$array)
{

if (!is_array($array)) return false;

$l = 0; // indeks początku przedziału
$p = count($array)-1; // indeks końca przedziału

while ($l <= $p) // główna pętla algorytmu
{

// jeśli wartość skrajnie prawego elementu jest ujemna = brak rozwiązania

if ($array[$p] < 1) {
return false;
}

$s = floor(($l+$p)/2); // znajdujemy środek przedziału
$value = $array[$s]; // pobieramy wartość środkowego elementu

if ($s == $value) { // jeśli wartość i indeks są takie same, mamy rozwiązanie
return $s;
}

// jeśli wartość elementu jest większa niż indeks to idziemy
// do lewej połówki – tylko tam możemy znaleźć rozwiązanie

if ($value > $s) $p = $s - 1;
else $l = $s + 1; // w przeciwnym wypadku do prawej

}
return false; // brak rozwiązania

}


Document Outline


Wyszukiwarka

Podobne podstrony:
michal daniel podzial liczby 10
8 Piesi, Rowerzyści i Motocykliści 1 39 2
35 39
39 SC DS300 R BMW 5 A 00 XX
39 06
3 Narzędzia wyszukiwawcze i źródła informacji ppt
39 40
Pierwsze miejsce w wyszukiwarkach
michalpasterski pl 10 sposobw na nieograniczon motywacj
pit 39
08 1993 39 46
39 1 W leśniczówce
39 Boys - Jesteś szalona, kwitki, kwitki - poziome
OFERTA Zeszyt 39, Niepełnosprawność
39, Semestr 1, Fizyka

więcej podobnych podstron