Wyszukiwanie. Wyszukiwanie binarne

Podobne dokumenty
Metoda bisekcji (inaczej połowienia przedziału lub równych podziałów)

Algorytmy i struktury danych Matematyka III sem.

Poprawność semantyczna

Efektywna metoda sortowania sortowanie przez scalanie

Wykład 2. Poprawność algorytmów

Znaleźć wzór ogólny i zbadać istnienie granicy ciągu określonego rekurencyjnie:

Podstawy Informatyki. Algorytmy i ich poprawność

void Pobierz(Student &a); void Wypisz(Student a); void Ustaw_zaliczenia(Student t[],int r); void Wypisz_najlepszych(Student t[],int r, float prog);

Wyszukiwanie binarne

Wstęp do programowania

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

Za pierwszy niebanalny algorytm uważa się algorytm Euklidesa wyszukiwanie NWD dwóch liczb (400 a 300 rok przed narodzeniem Chrystusa).

Rekurencje. Jeśli algorytm zawiera wywołanie samego siebie, jego czas działania moŝe być określony rekurencją. Przykład: sortowanie przez scalanie:

Sortowanie Shella Shell Sort

Sortowanie przez scalanie

Poprawność algorytmów

Możliwości i ograniczenia komputerów

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

ALGORYTMY Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

3. Podaj elementy składowe jakie powinna uwzględniać definicja informatyki.

(1) Poprawność Algorytmów

Schematy blokowe I. 1. Dostępne bloki: 2. Prosty program drukujący tekst.

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Strategia "dziel i zwyciężaj"

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

Scenariusz zajęć. Moduł VI. Projekt Gra logiczna zgadywanie liczby

Podstawy programowania skrót z wykładów:

Zadanie 3 Oblicz jeżeli wiadomo, że liczby 8 2,, 1, , tworzą ciąg arytmetyczny. Wyznacz różnicę ciągu. Rozwiązanie:

Krzysztof Jakubczyk. Zadanie 2

FUNKCJA LINIOWA - WYKRES. y = ax + b. a i b to współczynniki funkcji, które mają wartości liczbowe

Programowanie dynamiczne

FUNKCJA LINIOWA - WYKRES

Matematyka dyskretna

Instrukcja warunkowa i złoŝona.

Samodzielnie wykonaj następujące operacje: 13 / 2 = 30 / 5 = 73 / 15 = 15 / 23 = 13 % 2 = 30 % 5 = 73 % 15 = 15 % 23 =

Sortowanie przez wstawianie

Analiza Algorytmów - Moduł 2- Ćwiczenia

Program znajduje największa lub najmniejsza z podanych liczb. Liczby podajemy dopóki nam sie nie znudzi.

TEORETYCZNE PODSTAWY INFORMATYKI

Wskazówki dotyczące zmiennych, tablic i procedur 1

Wykład z Technologii Informacyjnych. Piotr Mika

Metoda tabel semantycznych. Dedukcja drogi Watsonie, dedukcja... Definicja logicznej konsekwencji. Logika obliczeniowa.

Podstawy programowania. Wykład: 11. Trochę różnych przykładów. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Podstawowe elementy programu. patrz: następne 2 slajdy. Podstawowe elementy programu. Komendy proste:

WyŜsza Szkoła Zarządzania Ochroną Pracy MS EXCEL CZ.2

Instrukcje cykliczne (pętle) WHILE...END WHILE

Złożoność obliczeniowa zadania, zestaw 2

W języku C dostępne są trzy instrukcje, umożliwiające tworzenie pętli: for, while oraz do. for (w1;w2;w3) instrukcja

Algorytm. Krótka historia algorytmów

- - Ocena wykonaniu zad3. Brak zad3

Co to jest algorytm? przepis prowadzący do rozwiązania zadania, problemu,

Zapis algorytmów: schematy blokowe i pseudokod 1

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

I. Podstawy języka C powtórka

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

Statystyka hydrologiczna i prawdopodobieństwo zjawisk hydrologicznych.

Program 14. #include <iostream> #include <ctime> using namespace std;

for (inicjacja_warunkow_poczatkowych; wyrazenie_warunkowe; wyrazenie_zwiekszajace) { blok instrukcji; }

Zasada indukcji matematycznej

Pochodna funkcji odwrotnej

for (inicjacja_warunkow_poczatkowych(końcowych); wyrazenie_warunkowe; wyrazenie_zwiekszajace(zmniejszające)) { blok instrukcji; }

Zmienne powłoki. Wywołanie wartości następuje poprzez umieszczenie przed nazwą zmiennej znaku dolara ($ZMIENNA), np. ZMIENNA=wartosc.

Podstawy Programowania C++

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Jak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest

Politechnika Warszawska

Zadeklarowanie tablicy przypomina analogiczną operację dla zwykłych (skalarnych) zmiennych. Może zatem wyglądać na przykład tak:

Zasady analizy algorytmów

Statystyka matematyczna dla leśników

FUNKCJE. Rozwiązywanie zadań Ćw. 1-3 a) b) str Ćw. 5 i 6 str. 141 dodatkowo podaj przeciwdziedzinę.

Konstrukcje warunkowe Pętle

5. OKREŚLANIE WARTOŚCI LOGICZNEJ ZDAŃ ZŁOŻONYCH

Matematyka Dyskretna 2/2008 rozwiązania. x 2 = 5x 6 (1) s 1 = Aα 1 + Bβ 1. A + B = c 2 A + 3 B = d

Zaawansowane algorytmy i struktury danych

WIELOMIANY I FUNKCJE WYMIERNE

Sortowanie przez wstawianie Insertion Sort

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

3) Naszkicuj wykres funkcji y=-xdo kwadratu+2x+1 i napisz równanie osi symetrii jej wykresu.

Wykład 3 Hipotezy statystyczne

Lista 0. Kamil Matuszewski 1 marca 2016

Każde wykonanie bloku instrukcji nazywamy pojedynczym przebiegiem lub iteracją pętli.

do instrukcja while (wyrażenie);

Zestaw 12- Macierz odwrotna, układy równań liniowych

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

Obliczenia iteracyjne

Algorytmy i złożoność obliczeniowa. Wojciech Horzelski

Wstęp do Programowania potok funkcyjny

Kolokwium ze wstępu do informatyki, I rok Mat. (Ściśle tajne przed godz. 10 : grudnia 2005.)

Algorytmy przeszukiwania wzorca

Laboratoria nr 1. Sortowanie

zestaw DO ĆWICZEŃ z matematyki

Jak rozgrywać turnieje tenisowe?

Definicja pochodnej cząstkowej

4. Postęp arytmetyczny i geometryczny. Wartość bezwzględna, potęgowanie i pierwiastkowanie liczb rzeczywistych.

Podyplomowe Studium Informatyki

Iteracje. Algorytm z iteracją to taki, w którym trzeba wielokrotnie powtarzać instrukcję, aby warunek został spełniony.

Regulamin Usługi Pakiety Internet obowiązuje od 30 marca 2012 r. do odwołania

Transkrypt:

Wyszukiwanie Wejście: posortowana, n-elementowa tablica liczbowa T oraz liczba p. Wyjście: liczba naturalna, określająca pozycję elementu p w tablicy T, bądź 1, jeŝeli element w tablicy nie występuje. Wyszukiwanie binarne Wyszukiwanie binarne polega na tropieniu fragmentu tablicy, o którym wiemy, Ŝe musi zawierać element p, o ile element ten znajduje się w tablicy T. Początkowo tym fragmentem jest cała tablica. Przedział kurczy się po porównaniu środkowego elementu ze zmienną p i odrzuceniu odpowiedniej połowy tego przedziału. Proces trwa do chwili odnalezienia p w tablicy lub do momentu, gdy wiadomo, Ŝe przedział, w którym musiałby się on znajdować, jest pusty. ZłoŜoność obliczeniowa: O(log 2 n). (Na analogicznej zasadzie działa np. algorytm bisekcji, słuŝący do znajdywania miejsc zerowych funkcji.) 1

Sformułowanie algorytmu Wiemy, Ŝe jeŝeli p znajduje się w gdziekolwiek w tablicy T, to musi być w określonym przedziale. Oznaczmy ten fakt skrótem: musi_być(przedział). Szkic programu: zainicjuj przedział jako 1...n pętla // niezmiennik: musi_być(przedział) jeŝeli przedział pusty elementu p nie ma w tablicy T oblicz wartość środek, środka przedziału uŝyj środek do testów, aby zmniejszyć przedział jeŝeli p znaleziono podczas testu wynik = pozycja p w tablicy 2

Przedział reprezentujemy przy pomocy dwóch indeksów: dół, góra. Oznaczenie musi_być(dół, góra) oznacza, Ŝe jeŝeli element znajduje się gdzieś w tablicy, to znajduje się w przedziale domkniętym T[dół... góra]. Inicjowanie: jakie wartości muszą mieć zmienne góra i dół, aby warunek musi_być(dół, góra) był spełniony? Oczywiście 1 oraz n. A zatem: dół = 1 góra = n Następnie sprawdzamy, czy przedział jest pusty: jeŝeli dół > góra wynik = -1 // elementu nie ma w tablicy 3

Obliczamy wartość środka przedziału: środek = (dół + góra) div 2 // Dzielenie całkowite Szkic programu wygląda teraz tak: dół = 1 góra = n pętla // niezmiennik: musi_być(dół, góra) jeŝeli dół > góra wynik = -1 środek = (dół + góra) div 2 uŝyj środek do testów, aby zmniejszyć przedział [dół... góra] jeŝeli p znaleziono podczas testu wynik = pozycja p w tablicy 4

Teraz porównujemy p i T[środek] oraz podejmujemy odpowiednie działania w celu zachowania niezmiennika (4 ostatnie wiersze). Piszemy: jeŝeli T[środek] < p: przypadek A jeŝeli T[środek] == p: przypadek B jeŝeli T[środek] > p: przypadek C Przypadek B oznacza, Ŝe znaleziono element: przypisujemy wynik = środek i kończymy program. Analiza przypadku A: JeŜeli T[środek] < p, to T[dół] T[dół+1]... T[środek] < p. Innymi słowy, p nie moŝe znajdować się w przedziale T[dół... środek]. Zatem, jeŝeli p znajduje się w tablicy T, to znajduje się w przedziale [środek + 1... góra], co zapisujemy: musi_być(środek + 1, góra). Przywracamy zatem prawdziwość niezmiennika musi_być(dół, góra) poprzez podstawienie: dół = środek + 1. 5

Analogicznie, w przypadku C przywracamy niezmiennik podstawiając: góra = środek 1. Ostateczna postać pseudokodu wyszukiwania binarnego: dół = 1 góra = n pętla // niezmiennik: musi_być(dół, góra) jeŝeli dół > góra wynik = -1 środek = (dół + góra) div 2 jeŝeli T[środek] < p: dół = środek + 1 jeŝeli T[środek] == p: wynik = środek; jeŝeli T[środek] > p: góra = środek - 1 6

Dowód poprawności algorytmu Metoda niezmienników Floyda (przypomnienie) wyróŝnić newralgiczne punkty w algorytmie, określić warunki (niezmienniki), jakie mają być spełnione w kaŝdym wyróŝnionym punkcie, udowodnić poprawność kolejnych warunków, zakładając poprawność warunków poprzedzających, własność stopu udowodnić np. metodą liczników iteracji lub metodą malejących wielkości. 7

1. // musi_być(1, n) 2. dół = 1; góra = n 3. // musi_być(dół, góra) 4. pętla 5. // musi_być(dół, góra) 6. jeŝeli dół > góra 7. // dół > góra i musi_być(dół, góra) 8. // p nie ma w tablicy T 9. wynik = -1; pętli 10. // dół góra i musi_być(dół, góra) 11. środek = (dół + góra) div 2 12. // dół środek góra i musi_być(dół, góra) 13. jeŝeli T[środek] < p 14. // musi_być(dół, góra) i nie_moŝe_być(dół, środek) 15. // musi_być(środek+1, góra) 16. dół = środek + 1 17. // musi_być(dół, góra) 18. jeŝeli T[środek] == p 19. // T[środek] == p 20. wynik = środek; pętli 21. jeŝeli T[środek] > p 22. // musi_być(dół, góra) i nie_moŝe_być(środek, góra) 23. // musi_być(dół, środek-1) 24. góra = środek -1 25. // musi_być(dół, góra) 26. // musi_być(dół, góra) 8

Dowód poprawności algorytmu wyszukiwania binarnego będzie się składał się z 3 części: 1. Inicjowanie. Niezmiennik jest prawdziwy podczas pierwszego wykonania pętli. 2. Zachowanie prawdziwości niezmiennika. JeŜeli niezmiennik jest prawdziwy na początku iteracji i treść pętli zostanie wykonana, to niezmiennik pozostanie prawdziwy po jej zakończeniu. 3. Zakończenie. Pętla się skończy i da poŝądany skutek (u nas: nadanie zmiennej wynik odpowiedniej wartości). 9

Szczegółowa analiza (uwaga nudne!). Prawdziwość warunku (asercji) z wiersza 1, czyli musi_byc(1,n), wynika z definicji tego warunku: jeśli p znajduje się w tablicy, to musi być w przedziale T[1...n]. Przypisania w wierszu 2 zapewniają więc prawdziwość asercji z wiersza 3, czyli musi_być(dół, góra). Inicjowanie pętli: wiemy, Ŝe asercja w wierszu 3 jest taka sama, jak w wierszu 5. JeŜeli przeprowadzimy odpowiednią analizę dla wierszy 6-26 będziemy wiedzieli, Ŝe prawdziwość niezmiennika jest w pętli zachowana, bo asercje w wierszach 5 i 26 są identyczne. Pozytywny wynik testu w wierszu 6 prowadzi do asercji w wierszu 7: jeśli p znajduje się gdziekolwiek w tablicy, to musi być między dół i góra dla dół < góra. Z tych warunków wynika wiersz 8: p nie ma w tablicy. Tak więc poprawnie kończymy pętlę w wierszu 9 po nadaniu zmiennej wynik wartości -1. JeŜeli test w wierszu 6 da wynik negatywny, to przechodzimy do wiersza 10. Niezmiennik jest nadal zachowany (nie zrobiliśmy nic, co mogłoby go zmienić), a w wyniku testu wiemy, Ŝe dół <= góra. Wiersz 11 to nadanie zmiennej środek wartości średniej z dół i góra, zaokrąglonej w dół do najbliŝszej liczby całkowitej. PoniewaŜ średnia zawsze znajduje się pomiędzy dwiema wartościami a zaokrąglenie nie zmniejszy jej poniŝej dół, prawdziwa jest asercja w wierszu 12. Dowód poprawności instrukcji warunkowych w wierszach 13-25 dotyczy kaŝdego z trzech moŝliwych przypadków. 10

Przypadek drugi (wiersz 18): poniewaŝ prawdziwa jest asercja z wiersza 19, nadanie zmiennej wynik wartości środek i zakończenie pętli są poprawne. To jest drugie miejsce, w którym pętla moŝe się zakończyć. Pozostałe przypadki (czyli pierwszy i trzeci) są symetryczne. Rozpatrzmy dla przykładu warunek z wierszy 21-25. Pierwszy człon asercji z wiersza 22 nie został naruszony podczas działania programu. Drugi człon jest prawdziwy, bo p < T[środek] T[środek+1]... T[n] wiemy, Ŝe p nie moŝe się znajdować w tablicy powyŝej indeksu środek-1, co wyraŝone zostało warunkiem nie_moŝe_być(środek, góra). Logika podpowiada, Ŝe jeŝeli p musi być między dół a góra, i nie moŝe być pod indeksem środek ani wyŝej, to musi być znajdować się między dół a środek-1 (o ile w ogóle się oczywiście w tablicy znajduje). Stąd się bierze wiersz 23. Wykonanie instrukcji z wiersza 24 przy prawdziwej asercji z wiersza 23, daje prawdziwość asercji w wierszu 25. Zatem niezmiennik w wierszu 26 pozostaje prawdziwy. Rozumowanie dla wierszy 13-17 wygląda identycznie. Wykazaliśmy więc, Ŝe jeŝeli pętla się kończy, to zmienna wynik ma właściwą wartość. MoŜe się jednak pojawić pętla nieskończona. W dowodzie własności stopu wykorzystamy metodę malejących wielkości. Przedział dół... góra ma początkowy rozmiar n. Z wierszy 6-9 wynika, Ŝe pętla się skończy, jeŝeli przedział zawiera mniej niŝ jeden element. Musimy więc wykazać, Ŝe przedział się zmniejsza przy kaŝdym obiegu pętli. Na podstawie wiersza 12 wiemy, Ŝe środek znajduje się zawsze w bieŝącym przedziale. Pierwsza i trzecia instrukcja warunkowa wykluczają indeks środek z bieŝącego przedziału i w ten sposób zmniejszają jego rozmiar co najmniej o 1. A zatem pętla a co za tym idzie cały program musi się zatrzymać. 11