Techniki konstruowania algorytmów. Metoda dziel i zwyciężaj

Podobne dokumenty
Programowanie dynamiczne cz. 2

Strategia "dziel i zwyciężaj"

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

Schemat programowania dynamicznego (ang. dynamic programming)

Programowanie dynamiczne (optymalizacja dynamiczna).

Programowanie dynamiczne i algorytmy zachłanne

Sortowanie przez scalanie

Wstęp do Programowania potok funkcyjny

Wstęp do programowania

Algorytmy i Struktury Danych.

Wstęp do programowania

Projektowanie i analiza algorytmów

Analiza algorytmów zadania podstawowe

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

Teoretyczne podstawy informatyki

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

Algorytmy i str ruktury danych. Metody algorytmiczne. Bartman Jacek

Algorytmy i Struktury Danych

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

Temat: Algorytmy zachłanne

Zaawansowane algorytmy i struktury danych

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

Algorytmy i struktury danych.

Programowanie dynamiczne

TEORETYCZNE PODSTAWY INFORMATYKI

Programowanie dynamiczne

TEORETYCZNE PODSTAWY INFORMATYKI

Algorytmy zachłanne. dr inż. Urszula Gałązka

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

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 )

Literatura. 1) Pojęcia: złożoność czasowa, rząd funkcji. Aby wyznaczyć pesymistyczną złożoność czasową algorytmu należy:

Struktury danych i złozoność obliczeniowa. Prof. dr hab. inż. Jan Magott

Algorytmy i Struktury Danych, 2. ćwiczenia

Programowanie dynamiczne

Wstęp do programowania

Podstawy Informatyki. Sprawność algorytmów

Podejście zachłanne, a programowanie dynamiczne

Złożoność algorytmów. Wstęp do Informatyki

Algorytmy i struktury danych IS/IO, WIMiIP

wstęp do informatyki i programowania część testowa (25 pyt. / 60 min.)

Lista 4. Kamil Matuszewski 10 maja 2016

Algorytmy w teorii liczb

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Zaawansowane algorytmy i struktury danych

[12] Metody projektowania algorytmów (dziel i rządź, programowanie dynamiczne i algorytmy zachłanne).

Matematyczne Podstawy Informatyki

Przypomnienie wiadomości dla trzecioklasisty C z y p a m i ę t a s z?

Drzewa spinające MST dla grafów ważonych Maksymalne drzewo spinające Drzewo Steinera. Wykład 6. Drzewa cz. II

Algorytmy Grafowe. dr hab. Bożena Woźna-Szcześniak, prof. UJD. Wykład 5 i 6. Uniwersytet Humanistyczno-Przyrodniczy im. Jana Długosza w Częstochowie

Wykład 10 Grafy, algorytmy grafowe

Wstęp do programowania

Zofia Kruczkiewicz, Algorytmu i struktury danych, Wykład 14, 1

Rozwiązywanie układów równań liniowych metody dokładne Materiały pomocnicze do ćwiczeń z metod numerycznych

ANALIZA ALGORYTMÓW. Analiza algorytmów polega między innymi na odpowiedzi na pytania:

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

Zasady analizy algorytmów

Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to

Problemy porządkowe zadania

Analiza algorytmów zadania podstawowe

Plan wykładu. Przykład. Przykład 3/19/2011. Przykład zagadnienia transportowego. Optymalizacja w procesach biznesowych Wykład 2 DECYZJA?

INFORMATYKA WYBRANE ALGORYTMY OPTYMALIZACYJNE KRYPTOLOGIA.

Modele i narzędzia optymalizacji w systemach informatycznych zarządzania

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

Wykład 8. Drzewo rozpinające (minimum spanning tree)

Programowanie Równoległe i Rozproszone. Algorytm Kung a. Algorytm Kung a. Programowanie Równoległe i Rozproszone Wykład 8. Przygotował: Lucjan Stapp

Technologie informacyjne Wykład VII-IX

Kolejka priorytetowa. Często rozważa się kolejki priorytetowe, w których poszukuje się elementu minimalnego zamiast maksymalnego.

WYMAGANIA EDUKACYJNE Z MATEMATYKI DLA KLASY 7SP. V. Obliczenia procentowe. Uczeń: 1) przedstawia część wielkości jako procent tej wielkości;

Uwaga: Funkcja zamień(a[j],a[j+s]) zamienia miejscami wartości A[j] oraz A[j+s].

Jarosław Wróblewski Matematyka Elementarna, zima 2014/15

Wstęp do programowania. Dziel i rządź. Piotr Chrząstowski-Wachtel

Porównanie czasów działania algorytmów sortowania przez wstawianie i scalanie

Wybrane wymagania dla informatyki w gimnazjum i liceum z podstawy programowej

Informatyka A. Algorytmy

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

Zaprojektować i zaimplementować algorytm realizujący następujące zadanie.

MATEMATYKA Z PLUSEM DLA KLASY VII W KONTEKŚCIE WYMAGAŃ PODSTAWY PROGRAMOWEJ. programowej dla klas IV-VI. programowej dla klas IV-VI.

Wstęp do programowania

WYMAGANIA EDUKACYJN KRYTERIA OCENY Z MATEMATYKI W KLASIE II GIMNAZJUM

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,

Rekurencja/rekursja. Iluzja istnienia wielu kopii tego samego algorytmu (aktywacji) Tylko jedna aktywacja jest aktywna w danej chwili

Temat: Algorytm kompresji plików metodą Huffmana

Algorytmy i Struktury Danych, 2. ćwiczenia

Znajdowanie wyjścia z labiryntu

MATEMATYKA WYKAZ UMIEJĘTNOŚCI WYMAGANYCH NA POSZCZEGÓLNE OCENY DLA KLASY DRUGIEJ

Efektywna metoda sortowania sortowanie przez scalanie

TEORETYCZNE PODSTAWY INFORMATYKI

Algorytmy i Struktury Danych

Wstęp do programowania

Ćwiczenie 3 Programowanie dynamiczne

Przedmiotowe zasady oceniania i wymagania edukacyjne z matematyki dla klasy drugiej gimnazjum

zajęcia 1. Bartosz Górski, Tomasz Kulczyński, Błażej Osiński

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

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

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

UKŁADY RÓWNAŃ LINIOWYCH

WYMAGANIA EDUKACYJNE

Akademia Górniczo-Hutnicza im. Stanisława Staszica w Krakowie Olimpiada O Diamentowy Indeks AGH 2017/18. Informatyka Etap III

Programowanie w VB Proste algorytmy sortowania

Wprowadzenie do algorytmów / Thomas H. Cormen [et al.]. - wyd. 7. Warszawa, Spis treści. Wprowadzenie 2

Transkrypt:

Techniki konstruowania algorytmów Metoda dziel i zwyciężaj

Technika dziel i zwyciężaj Aby rozwiązać problem techniką dziel i zwyciężaj musi on wykazywać własność podstruktury rozwiązanie problemu można wyliczyć na podstawie rozwiązań podproblemów. Idea: dla małych danych rozwiązanie wyliczamy ad hoc; duży problem dzielimy na podproblemy, rozwiązujemy je (rekurencyjnie) a na końcu obliczamy wynik korzystając z rozwiązań podproblemów. Dziel i zwyciężaj to podejście zstępujące do rozwiązywania zadań.

Technika dziel i zwyciężaj Znane przykłady stosowania techniki dziel i zwyciężaj : sortowanie przez scalanie, sortowanie przez podział (sortowanie szybkie).

Maksymalny zysk na giełdzie Problem maksymalnego zysku na giełdzie: dane są ceny jakiegoś towaru w kolejnych dniach; należy wyznaczyć taką parę dni, pomiędzy którymi jest największa dodatnia różnica cen tego towaru. Rozwiązanie naiwne: sprawdzamy każdą możliwą parę najpierw kupna a potem sprzedaży czas O(n 2 ). Rozwiązanie techniką dziel i zwyciężaj : rozwiązujemy podproblem dla pierwszej połowy danych, potem dla drugiej połowy danych, następnie obliczamy rozwiązanie leżące na styku obu połówek i wyciągamy maksimum. Złożoność czasowa (liczba obliczeń max) O(n). Złożoność pamięciowa (głębokość rekursji) O(log n). Wynik: maksymalny zysk w danym fragmencie, wartość minimalna i wartość maksymalna.

Maksymalny zysk na giełdzie f(c[0 n-1]) -> (z, i, j) { if (n jest małe) { sprawdź wszystkie możliwe pary; return optymalne rozwiązanie; } m := n/2 ; (a, b, c) := f(c[0 m-1]); (d, e, f) := f(c[m n-1]); y := max{a, d, f-b}; return (y, min{b, e}, max{c, f}); }

Mnożenie liczb zespolonych Problem mnożenia liczb zespolonych: dane są dwie liczby zespolone; należy obliczyć ich iloczyn. Rozwiązanie naiwne: dla liczb x=(a + bi) i y=(c + di) wyliczamy x y = ((ac-bd) + (bc+ad) i) 4 mnożenia i 2 dodawania. Rozwiązanie techniką dziel i zwyciężaj : m := (a b) (c+d) f := ad g := bc x y = (m f+g) + (f+g) i 3 mnożenia i 5 dodawań.

Metoda rekurencji uniwersalnej Uproszczona metoda rekurencji uniwersalnej to sposób rozwiązania równań rekurencyjnych postaci: T(n) = c dla n = 1 T(n) = a T(n/b) + c n dla n > 1 T(n) Θ(n) dla a < b T(n) Θ(n log n) dla a = b T(n) Θ(n log ba ) dla a > b

Mnożenie długich liczb Problem mnożenia długich liczb: dane są dwie n-cyfrowe liczby; należy obliczyć ich iloczyn; Umiemy dodawać i odejmować długie liczby w czasie liniowym. Rozwiązanie tradycyjne: mnożenie pisemne metodą 4 Rosjan czas O(n 2 ). Rozwiązanie techniką dziel i zwyciężaj w sposób naiwny: m := n/2 ; x = (x n-1 x n-2 x 1 x 0 ) = 2 m (x n-1 x m )+(x m-1 x 0 ) = 2 m x 1 +x 0 y = (y n-1 y n-2 y 1 y 0 ) = 2 m (y n-1 y m )+(y m-1 y 0 ) = 2 m y 1 +y 0 x y = (2 m x 1 +x 0 ) (2 m y 1 +y 0 ) = 4 m x 1 y 1 + 2 m (x 0 y 1 +x 1 y 0 ) + x 0 y 0 4 mnożenia i 3 dodawania : czas O(n 2 )

Mnożenie długich liczb Rozwiązanie techniką dziel i zwyciężaj algorytmem Karacuby: m := n/2 ; x = (x n-1 x n-2 x 1 x 0 ) = 2 m (x n-1 x m )+(x m-1 x 0 ) = 2 m x 1 +x 0 y = (y n-1 y n-2 y 1 y 0 ) = 2 m (y n-1 y m )+(y m-1 y 0 ) = 2 m y 1 +y 0 a := x 1 y 1 c := x 0 y 0 b := (x 1 +x 0 ) (y 1 +y 0 ) - a - b x y = 4 m a + 2 m b + c 3 mnożenia i 6 dodawań: czas O(n log 3 )

Techniki konstruowania algorytmów Metoda redukcji

Technika redukcji Technika redukcji jest szczególnym przypadkiem techniki dziel i zwyciężaj. Aby rozwiązać problem techniką redukcji musi on wykazywać własność pojedynczej podstruktury rozwiązanie problemu można wyliczyć na podstawie rozwiązania jednego podproblemu. Idea: dla małych danych rozwiązanie wyliczamy ad hoc; duży problem redukujemy do mniejszego podproblemu, rozwiązujemy go (rekurencyjnie) a na końcu obliczamy wynik korzystając z rozwiązania podproblemu.

Technika redukcji Znane przykłady stosowania techniki redukcji: wyszukiwanie binarne, szybkie potęgowanie, obliczanie silni.

Techniki konstruowania algorytmów Programowanie dynamiczne

Programowanie dynamiczne Programowanie dynamiczne stosuje się głównie do problemów optymalizacyjnych. Aby rozwiązać problem techniką programowania dynamicznego musi on wykazywać własności: podstruktury rozwiązanie problemu można wyliczyć na podstawie rozwiązań podproblemów; wspólnych podproblemów rozwiązując rekurencyjnie takie zadanie wielokrotnie obliczalibyśmy wyniki dla tych samych danych. Idea: dla małych danych rozwiązanie wyliczamy ad hoc; duży problem dzielimy na podproblemy, rozwiązujemy je wstępująco zaczynając od najmniejszych podzadań i kończąc na zadaniu głównym (w bieżących obliczeniach korzystamy z wcześniej obliczonych wyników). Programowanie dynamiczne to podejście wstępujące rozwiązywania zadań.

Odtwarzanie optymalnego rozwiązania Aby odtworzyć optymalne rozwiązanie potrzebujemy dodatkowo pamiętać skąd się wziął optymalny wynik dla określonego podproblemu też go zapamiętujemy w tablicy pomocniczej. Optymalne rozwiązanie odtwarzamy od końca (optymalnych rozwiązań może być wiele)

Stokrotki Problem przejścia przez pole ze stokrotkami: dane jest prostokątne pole podzielone na mniejsze prostokąty zwane kwartałami w liczbie n x m (n wierszy, m kolumn); w każdym kwartale rośnie określona liczba stokrotek; należy przejść z pola w lewym górnym rogu do pola w prawym dolnym rogu tak, aby zebrać po drodze jak największą liczbę stokrotek; można się poruszać tylko w prawo i w dół.

Stokrotki Rozwiązanie rekurencyjne: suma(i, j) = kwartał(i, j) + max{suma(i-1, j), suma(i, j-1)} Złożoność: pamięć O(n+m), czas wykładniczy. Rozwiązanie dynamiczne: wypełniamy całą tabelę wartościami zysków wg wzoru rekurencyjnego. Złożoność: pamięć O(n m), czas O(n m). Tabelę można wypełnić wierszami lub kolumnami, pamiętając tylko dwa wiersze lub dwie kolumny. Złożoność: pamięć O(min{n, m}), czas O(n m). Aby odtworzyć optymalną drogę, należy zapamiętywać skąd przyszliśmy. Złożoność: pamięć O(n m), czas O(n m).

Stokrotki Kwartały ze stokrotkami 2 0 3 3 4 7 1 4 6 4 3 5 1 5 4 2 2 2 6 5 Tablica z rozwiązaniem 2 2 5 8 6 13 14 18 12 17 20 25 13 22 26 28 15 24 32 37

Najdłuższy wspólny podciąg Problem najdłuższego wspólnego podciągu (ang. Longest Common Subsequence, LCS): dane są dwa ciągi znaków X = (x 1,...,x m ) i Y = (y 1,..., y n ); należy znaleźć długość najdłuższego z możliwych ciągów Z takiego, że Z jest podciągiem X i Z jest podciągiem Y. Zastosowanie: wykrywanie zmian w dokumentach; weryfikacja antyplagiatowa.

Najdłuższy wspólny podciąg Oznaczenie. Niech Z = (z 1,...,z n ) będzie n-znakowym ciągiem. Wówczas przez Z i będziemy oznaczali i-znakowy prefiks ciągu Z dla i {0,,n} (Z 0 będzie ciągiem pustym). Lemat. Niech Z = (z 1,...,z k ) będzie najdłuższym wspólnym podciągiem ciągu X = (x 1,...,x m ) i Y = (y 1,..., y n ). Wówczas: (1) jeżeli x m = y n, to z k = x m = y n oraz Z k-1 = lcs(x m-1, Y n-1 ); (2) jeżeli x m y n i z k x m, to Z = lcs(x m-1, Y); (3) jeżeli x m y n i z k y n, to Z = lcs(x, Y n-1 ). Lemat pozwala na napisanie prostej funkcji rekurencyjnej rozwiązującej ten problem.

Najdłuższy wspólny podciąg Niech c(i, j) oznacza długość najdłuższego wspólnego podciągu dla X i, Y j. Zależności rekurencyjne: c(i, j) = 0 gdy i = 0 lub j = 0 c(i, j) = c(i-1, j-1) + 1 gdy i, j > 0 oraz x i = y j c(i, j) = max{c(i, j-1), c(i-1, j)} gdy i, j > 0 oraz x i y j Rozwiązanie dynamiczne: wypełniamy całą tabelę długościami wg wzoru rekurencyjnego. Złożoność: pamięć O(n m), czas O(n m). Tabelę można wypełnić wierszami lub kolumnami, pamiętając tylko dwa wiersze lub dwie kolumny. Złożoność: pamięć O(min{n, m}), czas O(n m). Aby odtworzyć najdłuższy wspólny podciąg, należy zapamiętywać wg której reguły wypełniliśmy dane pole. Złożoność: pamięć O(n m), czas O(n m).

Najdłuższy podciąg rosnący Problem najdłuższego podciągu rosnącego (ang. Longest Increasing Subsequence, LIS): dany jest ciąg liczb X = (x 1,...,x n ); należy znaleźć długość najdłuższego z możliwych ciągów Z takiego, że Z jest podciągiem X i Z jest rosnący. Zastosowanie: w matematyce i fizyce.

Najdłuższy podciąg rosnący Oznaczenie. Niech Z = (z 1,...,z n ) będzie n-liczbowym ciągiem. Wówczas przez Z i będziemy oznaczali i- liczbowy prefiks ciągu Z dla i {0,,n} (Z 0 będzie ciągiem pustym). Lemat. Niech Z = (z 1,...,z k ) będzie najdłuższym podciągiem rosnącym ciągu X = (x 1,...,x m ). Wówczas: (1) jeżeli x m = z k, to Z k-1 = lis(x m-1 ) + 1; (2) jeżeli x m z k, to Z = lis(x m-1 ). Lemat pozwala na napisanie funkcji rekurencyjnej rozwiązującej ten problem.

Najdłuższy podciąg rosnący Niech c(i) oznacza długość najdłuższego podciągu rosnącego dla X i, zawierającego liczbę x i. Zależności rekurencyjne: c(i) = 1 gdy x i = min j=1 i {x j } c(i) = max j=1 i-1 {c j : x j < x i } + 1 gdy x i > min j=1 i {x j } Rozwiązanie dynamiczne: wypełniamy całą tabelę długościami wg wzoru rekurencyjnego. Złożoność: pamięć O(n), czas O(n 2 ). Rozwiązanie dynamiczne ulepszone o wyszukiwanie binarne. Złożoność: pamięć O(n), czas O(n log n). Aby odtworzyć najdłuższy podciąg rosnący, należy zapamiętywać przedostatni element którym przedłużamy podciąg rosnący. Złożoność: pamięć O(n), czas O(n log n).

Techniki konstruowania algorytmów Rekurencja ze spamiętywaniem

Rekurencja ze spamiętywaniem Rekurencja ze spamiętywaniem jest szczególnym przypadkiem programowania dynamicznego. Aby rozwiązać problem za pomocą rekurencji ze spamiętywaniem musi on się dać rozwiązać dynamicznie, czyli wykazywać własności: optymalnej podstruktury; wspólnych podproblemów. Idea: dla małych danych rozwiązanie wyliczamy ad hoc; duży problem dzielimy na podproblemy i wyliczamy ich rozwiązania; jeśli dany podproblem był już wcześniej obliczony to odczytujemy gotowy wynik z tablicy pomocniczej, w przeciwnym przypadku rozwiązujemy go rekurencyjnie; wyliczony wynik dla problemu zapamiętujemy w tablicy pomocniczej, aby w przyszłości nie liczyć go ponownie, tylko szybko odczytać (rozwiązany problem może być przecież częścią większego problemu).

Rekurencja ze spamiętywaniem Znane przykłady stosowania rekurencji ze spamiętywaniem: współczynnik dwumianowy, ciąg Fibonacciego.

Współczynniki dwumianowe Problem wyznaczenia k-tego wyrazu w n-tym wierszu trójkąta Pascala: dane są liczby naturalne n i k, takie że 0 k n; należy obliczyć współczynnik dwumianowy ( n k). Rozwiązanie tradycyjne: budujemy trójkątną tablicę i wypełniamy ją wierszami od góry: A[0][k] = A[k][0] = 1, A[k][j] = A[k-1][j-1] + A[k-1][j] dla k=1 n-1. Na końcu odczytujemy A[n][k]. Złożoność: pamięć O(n 2 ), czas O(n 2 ).

Współczynniki dwumianowe Rozwiązanie rekurencyjne: wypełniam po kolei tablicę współczynnikami dwumianowymi; Rekurencja: Pascal(n, 0) = 1 Pascal(n, n) = 1 Pascal(n, k) = Pascal(n-1, k-1) + Pascal(n-1, k) Złożoność: pamięć O(n 2 ), czas wykładniczy. Rekurencja ze spamiętywaniem wyników. Złożoność: pamięć O(n 2 ), czas O(n 2 ). Rozwiązanie dynamiczne: przechowuję tylko ostatnio wyliczony wiersz trójkąta Pacsala; na jego podstawie obliczam następny. Złożoność: pamięć O(n), czas O(n 2 ).

Współczynniki dwumianowe Algorytm ze spamiętywaniem: Tablica globalna int p[n+1][n+1] = {0, }; Funkcja rekurencyjna function Pascal(n, k) { if (p[n][k] = 0) return p[n][k]; if (k = 0 or k = n) p[n][k] = 1; else p[n][k] = Pascal(n-1, k-1) + Pascal(n-1, k); return p[n][k]; } Liczba obliczeń rekurencyjnych dla każdego elementu tablicy wynosi 1.

Techniki konstruowania algorytmów Strategia zachłanna

Strategia zachłanna Strategię zachłanną stosuje się głównie do problemów optymalizacyjnych. Aby rozwiązać problem techniką zachłanną musi on wykazywać własności: podstruktury rozwiązanie problemu można wyliczyć na podstawie rozwiązań podproblemów albo rozwiązanie problemu można skonstruować dodając albo nie dodając jakiegoś elementu do rozwiązania; wyboru zachłannego w każdym kroku algorytmu jesteśmy w stanie wybrać element należący do rozwiązania (albo wyeliminować element z rozwiązania). Idea: dla małych danych rozwiązanie wyliczamy ad hoc; dla dużego problemu wybieramy element należący do rozwiązania (albo stwierdzamy, że nie będzie on należał do rozwiązania optymalnego), redukując tym samym rozmiar zadania. Ważnym elementem strategii zachłannej jest uzasadnienie poprawności rozwiązania.

Przydział zajęć do sali Problem przydziału zajęć do sali: dane są godziny, w których mogą się odbywać wykłady w pewnej sali; należy wyznaczyć taki zbiór wykładów, aby odbyło się ich jak najwięcej. Rozwiązanie: sortujemy wykłady po ich godzinach zakończenia; wybieramy wykład, który kończy się najszybciej i nie zachodzi na poprzednie wykłady (aż do wyczerpania danych). Czas (zdeterminowany procedurą sortowania): O(n log(n)) Poprawność rozwiązania: dowód nie wprost.

Szeregowanie zadań do jednego procesora Problem szeregowania zadań do procesora: danych jest n zadań t 1, t n i procesor, na którym te zadania będą wykonane; każde z zadań ma określony czas realizacji d 1, d n ; należy tak poprzydzielać zadania do procesora, aby zminimalizować sumaryczny czas przebywania zadań w systemie. Rozwiązanie: sortujemy zadania po ich czasach wykonania; przydzielamy zadania do procesora w kolejności od najkrótszego do najdłuższego. Czas (zdeterminowany procedurą sortowania): O(n log(n)) Poprawność rozwiązania: dowód nie wprost.

Szeregowanie zadań do wielu procesorów Problem szeregowania zadań do procesorów: danych jest n zadań t 1, t n i m procesorów p 1, p m ; każde z zadań ma określony czas realizacji d 1, d n ; należy tak poprzydzielać zadania do procesorów, aby zminimalizować sumaryczny czas przebywania zadań w systemie. Rozwiązanie: sortujemy zadania po ich czasach wykonania; sekwencyjnie przydzielamy zadania do kolejnych procesorów (do pierwszego procesora p 1 trafią zadania t i[1], t i[m+1], t i[2m+1], ). czas: O(n log(n)) Poprawność rozwiązania: dowód nie wprost. Uwaga: zadania muszą być wykonane w kolejności od najkrótszego do najdłuższego na każdym procesorze.

Przykłady problemów rozwiązywanych techniką zachłanną Algorytm Huffmana wyznaczający kodowanie dla symboli, których prawdopodobieństwa wystąpienia w tekście są znane. Algorytm Kruskala wyznaczający minimalne drzewo rozpinające dla grafu nieskierowanego ważonego, o ile jest on spójny. Algorytm Dijkstry wyznaczający najkrótsze ścieżki z pojedynczego źródła w grafie o nieujemnych wagach krawędzi.