background image

Zasady projektowania 

algorytmów

background image

Algorytm - pojęcie

Algorytm 

– 

matematyce 

oraz 

informatyce  skończony,  uporządkowany 

ciąg  jasno  zdefiniowanych  czynności, 

koniecznych  do  wykonania  pewnego 

rodzaju 

zadań. 

Algorytm 

ma 

przeprowadzić  system  z  pewnego  stanu 

początkowego  do  pożądanego  stanu 

końcowego.

background image

Techniki projektowania 

algorytmów

● 

Dziel i zwyciężaj (divide and conquer) – 

rekursja

● 

Redukcja (reduction, transform and 

conquer)

● 

Programowanie liniowe (linear 

programming)

● 

Programowanie zachłanne (greedy 

method)

● 

Programowanie dynamiczne (dynamic

programming)

● 

Algorytmy przeszukujące (trial and error)

● 

Algorytmy probabilistyczne i heurystyki

(probabilistic, heuristic)

background image

Rekursja

Rekursja albo rekurencja (ang. recursion, 

z łac. recurrere, przybiec z powrotem) to 

w  programowaniu  i  w  matematyce 

odwoływanie się(np. funkcji lub definicji) 

do 

samej 

siebie. 

Każda 

definicja 

rekurencyjna  potrzebuje  przynajmniej 

jednego 

przypadku 

bazowego 

(nie 

rekurencyjnego).

- Wieże Hanoi, 

- algorytm Euklidesa znajdowania NWD,

Przykładowy algorytm - QuickSort

background image

Programowanie liniowe

Programowanie 

liniowe 

to 

klasa 

problemów 

programowania 

matematycznego,  w  której  wszystkie 

warunki  ograniczające  oraz  funkcja  celu 

mają  postać  liniową.  Rozwiązania  tego 

problemu 

nazywamy 

rozwiązaniami 

optymalnymi.

Metody rozwiązywania:

- graficznie,

- algorytm Simplex,

- metoda elipsoid,

- algorytm Karmarkera,

background image

Programowanie zachłanne

Algorytm  zachłanny  –  algorytm,  który  w  celu 

wyznaczenia  rozwiązania  w  każdym  kroku 

dokonuje  zachłannego,  tj.  najlepiej  rokującego 

w  danym  momencie  wyboru  rozwiązania 

częściowego. Innymi słowy algorytm zachłanny 

nie  patrzy  czy  w  kolejnych  krokach  jest  sens 

wykonywać  dane  działanie,  dokonuje  decyzji 

lokalnie  optymalnej,  dokonuje  on  wyboru 

wydającego  się  w  danej  chwili  najlepszym, 

kontynuując 

rozwiązanie 

podproblemu 

wynikającego  z  podjętej  decyzji.  Typowe 

zadanie  rozwiązywane  metodą  zachłanną  ma 

charakter optymalizacyjny.

background image

Programowanie dynamiczne

Programowanie  dynamiczne  opiera  się  na  podziale 

rozwiązywanego 

problemu 

na 

podproblemy 

względem  kilku  parametrów.  W  odróżnieniu  od 

techniki  dziel  i  zwyciężaj  podproblemy  w 

programowaniu  dynamicznym  nie  są  na  ogół 

rozłączne,  ale  musi  je  cechować  własność 

optymalnej  podstruktury.  Zazwyczaj  jednym  z 

parametrów definiujących podproblemy jest liczba 

elementów  znajdujących  się  w  rozpatrywanym 

problemie,  drugim  jest  pewna  wartość  liczbowa, 

zmieniająca  się  w  zakresie  od  0  do  największej 

stałej  występującej  w  problemie.  Możliwe  są 

jednak 

bardziej 

skomplikowane 

dobory 

parametrów,  a  także  większa  ich  liczba.  Ponieważ 

jednak  uzyskiwany  algorytm  zazwyczaj  wymaga 

pamięci  (i  czasu)  proporcjonalnego  do  iloczynu 

maksymalnych  wartości  wszystkich  parametrów, 

stosowanie  większej  ilości  parametrów  niż  3-4 

rzadko bywa praktyczne.

background image

Algorytmy przeszukujące

Algorytm  przeszukujący  -    redukujący  liczbę 

węzłów,  które  muszą  być  rozwiązywane  w 

drzewach  przeszukujących  przez  algorytm 

min-max. 

Jest 

to 

przeszukiwanie 

wykorzystywane  w  grach  dwuosobowych, 

takich  jak  kółko  i  krzyżyk,  szachy,  go. 

Warunkiem stopu jest znalezienie przynajmniej 

jednego 

rozwiązania 

czyniącego 

obecnie 

badaną  opcję  ruchu  gorszą  od  poprzednio 

zbadanych  opcji.  Wybranie  takiej  opcji  ruchu 

nie 

przyniosłoby 

korzyści 

graczowi 

ruszającemu  się,  dlatego  też  nie  ma  potrzeby 

przeszukiwać  dalej  gałęzi  drzewa  tej  opcji.  Ta 

technika 

pozwala 

zaoszczędzić 

czas 

poszukiwania  bez  zmiany  wyniku  działania 

algorytmu.

background image

Algorytmy probabilistyczne i 

heurystyczne

Algorytm  probabilistyczny  albo  randomizowany  to 

algorytm który do swojego działania używa losowości. 

W  praktyce  oznacza  to  że  implementacja  takiego 

algorytmu  korzysta  przy  obliczeniach  z  generatora 

liczb 

losowych. 

Główną 

zaletą 

algorytmów 

probabilistycznych 

porównaniu 

deterministycznymi  jest  działanie  zawsze  w  "średnim 

przypadku", dzięki czemu złośliwe dane wejściowe nie 

wydłużają  jego  działania.  Formalnie  efektywność 

takiego  algorytmu  jest  zmienną  losową  określoną  na 

przestrzeni  możliwych  losowych  ciągów.  Wartość 

oczekiwana 

takiej 

zmiennej 

nazywana 

jest 

oczekiwanym 

czasem 

działania. 

Przypadek 

pesymistyczny 

jest 

zwykle 

na 

tyle 

mało 

prawdopodobny, że można go pominąć w analizie.

Heurystyka - metoda znajdowania rozwiązań, dla której 

nie 

ma 

gwarancji 

znalezienia 

rozwiązania 

optymalnego, a często nawet prawidłowego.

background image

KONIEC


Document Outline