Údajové štruktúry a algoritmy

prednášky Ing. Daniel Hládek PhD.

Organizácia predmetu a hodnotenie

na stránke

Ciele predmetu

  • Získať a potvrdiť programátorské zručnosti v jazyku C.
  • Poznať a vedieť používať základné algoritmy a údajové štruktúry.

Základné programátorské zručnosti

  • Algoritmizácia - návrh riešenia problému a jeho premena na algoritmus.
  • Efektívny a správny zápis kódu.
  • Postupy pri odhaľovaní chýb.
  • Ovládanie základných nástrojov
    • editor, kompilátor, analyzátor pamäte, systém pre správu verzií.

Základné algoritmy

  • hashovanie
  • indexovanie
  • triedenie a vyhľadávanie:
    • v strome
    • v reťazci
    • v poli
    • v spojkovom zozname

Údajové štruktúry a algoritmy sú potrebné pre prácu v IT

Prečo sa zamýšať nad algoritmami?

  • Je dôležité aby použiteľné riešenie bolo k dispozícii v dostupnom čase.
  • Vykonanie algoritmu nie je zadarmo.
  • Vykonanie algoritmu trvá určitý čas.

Prečo sa zamýšľať nad algoritmami?

Ak mám nejaké riešenie:

  • Poskytne výsledok v konečnom čase?
  • Koľko výpočtových prostriedkov budeme potrebovať?

Algoritmy sú dôležité pre počítačové siete

  • algoritmické myslenie
  • poznanie technických prostriedkov
  • porozumenie princípom činnosti sieťových zariadení
  • znalosť grafových algoritmov

Dôležité algoritmy

  • Dijkstrov algoritmus najkratšej cesty
  • Kompresné algoritmy, stratové aj bezstratové
  • CRC kontrolný súčet
  • RSA šifrovanie
  • ARQ algoritmus (Automatic repeat request)
  • routing table - hash, tree

[note] Podľa https://www.quora.com/What-are-the-most-important-algorithms-used-in-computer-networking/ [/note]

Úvod do algoritmov

Čo je to algoritmus?

Introduction to Algorithms:

Algoritmus je dobre definovaná postupnosť výpočtov ktorá spracuje jednu alebo viacero hodnôt na výstup.

Vlastnosti algoritmov

  • Konečný
  • Determinovaný
  • Efektívny
  • Má vstup a výstup

Ak postup nespĺňa všetky vlastnosti algoritmu, nazývame ho heuristika

Zápis algoritmu

vstup => postup = výstup

  • Pseudokód
  • Kód
  • Vývojový diagram

Príklad algoritmu

  • varenie
  • triedenie
  • vyhľadávanie

Koľko bude stáť vyriešenie problému?

Zložitosť algoritmu

  • Pamäťová náročnosť

  • Časová náročnost (Výpočtová náročnosť)

  • peňazí = koľko času a koľko prstrojov (pamäte) budeme potrebovať?

Benchmarking

Odmeráme spotrebovaný strojový čas a potrebnú pamäť na vzorovom probléme.

Teoretická analýza algoritmu

Dopredu presne nevieme, koľko dát budeme spracovávať.

Vzťah medzi množstvom dát a množstvom potrebných prostriedkov

  • najlepší prípad
  • najhorší prípad
  • priemerný prípad

RAM Model

Určíme, ktorá inštrukcia má cenu 1.

RAM Model

  • Random Access Machine
  • Zjednodušenie algoritmu tak aby umožnil jeho teoretickú analýzu.
  • Virtuálny stroj s obmedzenou množinou operácií
    • artitmetické operácie
    • vetvenie
    • porovnanie
    • prístup do pamäte
  • Jedna operácia stojí jednu jednotku času.

Blog

Aká je cena vykonanie algoritmu lineárneho vyhľadávania?

  • cena priradenia: \(O_{prir}\)
  • cena porovnania: \(O_{por}\)
  • cena inkremenácie: \(O_{inc}\)

Iteratívne lineárne vyhľadávanie

int vyhladaj(char* pole, int size, char znak){
    for (int i = 0; i < size; i++)}
        if (pole[i] == znak){
            return i;
        }
    }
    return -1;
}

V najhoršom prípade:

\(O(n) = O_{prir} + n * (2 * O_{por} + O_{inc})\)

V najlepšom prípade:

\(O(n) = O_{prir} + (2 * O_{por} + O_{inc})\)

V priemernom prípade:

\(O(n) = O_{prir} + 0.5 * n * (2 * O_{por} + O_{inc})\)

Asymptotická zložitosť

Zanedbáme všetky konštanty.

\(C => O(1)\)

\(n C => O(n)\)

\(n^2 C => O(n^2)\)

Asymptotická zložitosť lineárneho vyhľadávania

\(O(n)\)

Vyhľadávanie bisekciou

Predpokladáme, že pole je zotriedené...

int binary_search(int* array,int size,int search){
   int first = 0;
   int last = size - 1;
   int middle = (first+last)/2;
   while (first <= last) {
      if (array[middle] < search)
         first = middle + 1;    
      else if (array[middle] == search) {
         return middle;
      }
      else{
         last = middle - 1;
      }
      middle = (first + last)/2;
   }
   return -1; 
}

Aká je zložitosť vyhľadávania bisekciou?

v najlepšom prípade

  • 2 x porovnanie
  • 1 delenie
  • 1 spočítanie
  • 1 priradenie

Asymptoticky \(0(1)\)

Asymptotická zložitosť bisekcie

Zložitosť slučky v najhoršom prípade:

\(O (log_2 (n))\)

Ktorá zložitosť je lepšia

  • konštantná \(0(1)\)
  • Lineárna \(O(n)\)
  • Logaritmická \(O(log(n))\)

References

  • [[[ia]]] Introduction to Algorithms Book by Charles E. Leiserson, Clifford Stein, Ronald Rivest, and Thomas H. Cormen
  • [[[pw]]] Piotr Wroblewski: Algoritmy - Datové struktury a programovací techniky, Computer Press 2004

Zhrnutie

  • Cena vykonania algoritmu súvisí s jeho zložitosťou
  • Cena návrhu počítačovej siete súvisí s jej zložitosťou
Reload?