Algorytm selekcji Hoare a. Łukasz Miemus

Podobne dokumenty
Podstawowe algorytmy i ich implementacje w C. Wykład 9

Struktury Danych i Złożoność Obliczeniowa

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

WYKŁAD 9. Algorytmy sortowania elementów zbioru (tablic) Programy: c4_1.c... c4_3.c. Tomasz Zieliński

Algorytmy i Struktury Danych.

Podstawy algorytmiki i programowania - wykład 6 Sortowanie- algorytmy

Laboratorium nr 7 Sortowanie

Sortowanie przez scalanie

np. dla p=1 mamy T1(N) N/2 średni czas chybionego wyszukiwania z prawdopodobieństwem q:

Wykład 3. Metoda dziel i zwyciężaj

Wykład 5. Sortowanie w czasie liniowologarytmicznym

Programowanie w VB Proste algorytmy sortowania

Algorytmy i Struktury Danych, 2. ćwiczenia

Strategia "dziel i zwyciężaj"

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

Sortowanie w czasie liniowym

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

Jeszcze o algorytmach

Programowanie Proceduralne

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

Zasady analizy algorytmów

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

Algorytmy. 1. Sortowanie 2. Statki i okręty. programowanie cz.7. poniedziałek, 2 marca 2009

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

Analiza algorytmów zadania podstawowe

Algorytmy sortujące i wyszukujące

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Struktury danych i złożoność obliczeniowa Wykład 2. Prof. dr hab. inż. Jan Magott

Sortowanie bąbelkowe

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Sortowanie. LABORKA Piotr Ciskowski

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Algorytmy sortowania w języku C. Autor: mgr inż. Sławomir Samolej. Zagadnienie 1. (Sortowanie)

(3 kwiecień 2014) Marika Pankowska Kamila Pietrzak

Sortowanie przez wstawianie Insertion Sort

Wyszukiwanie binarne

Informatyka A. Algorytmy

ALGORYTMY I STRUKTURY DANYCH

Wykład X. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2016 Janusz Słupik

Algorytmy i Struktury Danych, 2. ćwiczenia

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Wstęp do programowania

Wykład 4. Sortowanie

Algorytmy i Struktury Danych. Co dziś? Drzewo decyzyjne. Wykład IV Sortowania cd. Elementarne struktury danych

Wstęp do programowania

TEORETYCZNE PODSTAWY INFORMATYKI

Wstęp do programowania

Wstęp do programowania

Wykład 2. Poprawność algorytmów

Algorytmy. Programowanie Proceduralne 1

Porządek symetryczny: right(x)

Łyżwy - omówienie zadania

Podstawy algorytmiki i programowania - wykład 3 Funkcje rekurencyjne Wyszukiwanie liniowe i binarne w tablicy

Algorytmy i Struktury Danych

Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Wykład 5_2 Algorytm ograniczania liczby serii za pomocą kopcowego rozdzielania serii początkowych

- - Ocena wykonaniu zad3. Brak zad3

1 Podstawy c++ w pigułce.

Wstęp do programowania

Raport z projektu. Przedmiot: Algorytmy i struktury danych 1 Projekt: Wieża Hanoi Autor: Wojciech Topolski

Anna Sobocińska Sylwia Piwońska

Algorytmy i Struktury Danych. (c) Marcin Sydow. Sortowanie Selection Sort Insertion Sort Merge Sort. Sortowanie 1. Listy dowiązaniowe.

Algorytm. a programowanie -

Poprawność semantyczna

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Kodowanie permutacji. Przykład Kodem permutacji A = (1, 5, 2, 6, 4, 7, 3) jest ciąg B = (0, 0, 1, 0, 2, 0, 4).

Zestaw 1 ZESTAWY A. a 1 a 2 + a 3 ± a n, gdzie skªadnik a n jest odejmowany, gdy n jest liczb parzyst oraz dodawany w przeciwnym.

Analiza algorytmów zadania podstawowe

Poszukiwanie liniowe wśród liczb naturalnych

Jeśli czas działania algorytmu zależy nie tylko od rozmiaru danych wejściowych i przyjmuje różne wartości dla różnych danych o tym samym rozmiarze,

Algorytmy i struktury danych

Algorytmy i Struktury Danych.

Metodyki i Techniki Programowania 2

Rekurencja. Przygotowała: Agnieszka Reiter

Laboratorium 5: Tablice. Wyszukiwanie binarne

Sortowanie - wybrane algorytmy

Podstawy Informatyki. Sprawność algorytmów

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Wskaźniki. Programowanie Proceduralne 1

Egzamin, AISDI, I termin, 18 czerwca 2015 r.

Wyszukiwanie w BST Minimalny i maksymalny klucz. Wyszukiwanie w BST Minimalny klucz. Wyszukiwanie w BST - minimalny klucz Wersja rekurencyjna

E S - uniwersum struktury stosu

Liczby całkowite i rzeczywiste

Sortowanie. Bartman Jacek Algorytmy i struktury

Algorytmy. Programowanie Proceduralne 1

Proste algorytmy w języku C

Podstawy Informatyki. Metody dostępu do danych

EGZAMIN - Wersja A. ALGORYTMY I STRUKTURY DANYCH Lisek89 opracowanie kartki od Pani dr E. Koszelew

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 13. Karol Tarnowski A-1 p.

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 13. Karol Tarnowski A-1 p.

Podstawy Programowania 1 Sortowanie tablic jednowymiarowych. Plan. Sortowanie. Sortowanie Rodzaje sortowania. Notatki. Notatki. Notatki.

Drzewa wyszukiwań binarnych (BST)

Matematyczne Podstawy Informatyki

Drzewa BST i AVL. Drzewa poszukiwań binarnych (BST)

Laboratoria nr 1. Sortowanie

Zaawansowane algorytmy i struktury danych

Wstęp do programowania

Transkrypt:

Algorytm selekcji Hoare a Łukasz Miemus 1 lutego 2006

Rozdział 1 O algorytmie 1.1 Problem Mamy tablicę A[N] różnych elementów i zmienną int K, takie że 1 K N. Oczekiwane rozwiązanie to określenie K-tego najmniejszego elementu tablicy A[] w taki sposób, aby element ten znalazł się na pozycji A[K] w tablicy oraz wszystkie elementy o indeksach mniejszych od K były mniejsze wartościami od A[K], natomiast elementy od indeksach większych od K były od A[K] większe wartościami: A[1], A[2],..., A[K-1] A[K] A[K+1],..., A[N] 1.2 Wybrane rozwiązania 1.2.1 Algorytm naiwny Algorytm ten opiera się na początkowym posortowaniu tablicy A[], wtedy znalezienie K-tego najmniejszego elementu przeprowadzamy w czasie O(1), a więc złożoność algorytmu wynosi: Sortowanie elementów tablicy (merge-sort lub heapsort) O(n log n) Zwrócenie K-tego elementu O(1) O(n log n), co wydaje się być wynikiem zadowalającym natomiast my pokażemy, że problem ten da się rozwiązać w średnim czasie O(n), stosując algorytm selekcji Hoare a. 1.2.2 Algorytm Hoare a Definicja: K-ty najmniejszy z N elementów to unikalny element, który jest większy od K-1 innych elementów, ale mniejszy od N-K elmentów. 1

Wniosek: Element nie może być K-tym najmniejszym jeśli jest większy od K (i więcej) elementów lub mniejszy od N-K+1 (i więcej) elementów. Zaczynamy od hipotezy: A[K] jest K-tym najmniejszym elementem. Algorytm dzieli tablicę A na dwie części poprzez skanowanie jej od lewej strony (dla indeksów I = 1,2,...) w poszukiwaniu elementu A[I] A[K], skanowanie od prawej strony (dla indeksów J = N,N-1,...) w poszukiwaniu elementu A[J] A[K], oraz zamianę znalezionych elementów; procedura jest powtarzana dopóki wskaźniki I oraz J się nie spotkają. Daje nam to trzy przypadki: 1. (J < K < I) K-ty najmniejszy element jest na wyjściowej pozycji i procedura kończy działanie. 2. (J < I K) Elementy A[1]...A[J] są mniejsze od N-K+1 innych elementów, zatem żaden z nich nie może być K-tym najmniejszym, przeglądniemy więc podtablicę A[I]...A[N] w poszukiwaniu (K-I+1)-tego najmniejszego elementu. 2

3. (K J < I) Elementy A[I]...A[N] są większe od K innych elementów, zatem żaden z nich nie może być K-tym najmniejszym, przeglądniemy więc podtablicę A[1]...A[J] w poszukiwaniu K-tego najmniejszego elementu. 1.2.3 Analiza złożoności algorytmu Hoare a Złożoność pesymistyczna Dla podanej wersji algorytmu, najgorszy z możliwych przypadków to trafienie, jako elementu podziału, największego lub najmniejszego wartością elementu z tablicy A. Powodem jest strategia wyboru w naszym przypadku elementem tym jest po prostu element o K-tym indeksie przeszukiwanej tablicy. Istnieje zatem określony zestaw danych, dla których algorytm zawsze będzie działał w czasie pesymistycznym: Przykład dla K = 1: O(n 2 ) A[1] = N, A[2] = 2, A[3] = 1, A[4] = 3,..., A[N] = N-1 Aby uniknąć takiej sytuacji, można skorzystać z innej wersji algorytmu wybierać za każdym razem element podziału losowo. Należy jednak mieć na uwadze fakt, że nie zmieni to rzędu złożoności! Złożoność oczekiwana Oczekiwany wynik wyboru elementu podziału można rozbić na dwa przypadki. W pierwszym przeszukujemy podtablicę o wielkości co najwyżej 3N 4, w drugim (pesymistycznie) podtablicę o wielkości N. Prawdopodobieństwo wystąpienia dla każdego z tych wyników wynosi 50%, zatem mamy: T n 1 2 (T n) + 1 2 (T 3N 4 ) + N. 3

T n T 3N 4 + 2N. T n = O(n) algorytm działa w czasie liniowym. 4

Rozdział 2 Przykład Ilustracje przedstawiają wszystkie wywołania procedury dla danych zapisanych w tablicy A[10], poszukiwanym elementem jest 6-ty najmniejszy. 1. Procedurę wywołujemy na całej tablicy wejściowej. 2. Elementem, względem którego będzie wykonywany podział, jest A[6] = 4. Ponieważ elementy A[1]...A[J] są mniejsze od N-K+1 (= 5) innych elementów, żaden z nich nie może być poszukiwanym przez nas 6-tym najmniejszym zatem wywołamy procedurę ponownie na podtablicy A[I]...A[N], szukając (K-I+1 = 2)-tego najmniejszego elementu. 3. Elementem podziału jest tym razem A[2] = 8. Ponieważ każdy z elementów A[I]...A[N] jest większy od co najmniej K (= 2) innych elementów, żaden z nich nie może być poszukiwanym 2-gim najmniejszym wywołujemy procedurę na podtablicy A[1]...A[J], szukając (K = 2)- tego najmniejszego elementu. 5

4. Dzielimy względem A[2] = 5. Widać, że na powstałej podtablicy żaden podział nie ma już sensu, 6-ty najmniejszy element został odnaleziony jest nim A[6] = 6, program kończy działanie. 6

Rozdział 3 Implementacja #include <s tdio. h> #define N 10 int main ( void ) { int A[N+1] = {0,10,8,3,1,9,4,6,5,2,7}; int K = 6; int L = 1, R = N; int I, J, X; while (L < R) { X = A[K] ; I = L, J = R; while (1) { while (A[ I ] < X) I++; while (X < A[ J ] ) J ; i f ( I <= J ) { int W = A[ I ] ; A[ I ] = A[ J ] ; A[ J ] = W; I++; J ; } else break ; } i f ( J < K) L = I ; i f (K < I ) R = J ; } p r i n t f ( %d najmniejszy element to : %d\n, K, A[K] ) ; } return 0; 7