SZZ materiály

1

Základní abstraktní kolekce (jejich klasická implementace [seznamy, slovníky], iterátory nad nimi, typické elementární operace a jejich časová složitost) a specializované abstraktní kolekce (fronta, zásobník)

Užitečné odkazy

Abstraktní datový typ

Abstraktní datový typ

Proč existují kolekce

Abstraktní kolekce

Dělení prvků v kolekci

Základní abstraktní kolekce

Seznam

Typické operace

Operace seznamu

Typické implementace

Statické pole

int[] numbers = new int[5];

numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;

int length = numbers.Length; // 5
int first = numbers[0]; // 10
Operace Best Case Worst Case Vysvětlení
zjištění délky (Length) O(1) O(1) Velikost pole je známá od vytvoření
přístup (numbers[i]) O(1) O(1) Prvek je uložen na přesně vypočitatelné pozici v souvislé paměti
změna hodnoty (numbers[i] = x) O(1) O(1) Mění se jen hodnota na již existující pozici
vyhledání hodnoty O(1) O(n) Buď je hledaný prvek hned na začátku, je na konci nebo v poli není
vložení/odstranění prvku O(n) O(n) Je nutné vytvořit nové pole a zkopírovat všechny prvky (velikost je pevná)

Dynamické pole

using System.Collections.Generic;

List<int> numbers = new();

numbers.Add(10);
numbers.Add(20);
numbers.Add(30);

int count = numbers.Count; // 3
int first = numbers[0]; // 10
Operace Best Case Worst Case Vysvětlení
zjištění počtu prvků (Count) O(1) O(1) Počet prvků je uložen jako vlastnost kolekce
přístup (numbers[i]) O(1) O(1) Prvek je uložen na přesně vypočitatelné pozici v souvislé paměti
změna hodnoty (numbers[i] = x) O(1) O(1) Mění se jen hodnota na existující pozici
vyhledání hodnoty O(1) O(n) Buď je prvek hned na začátku, nebo je nutné projít celý seznam
přidání na konec (Add) O(1) O(n) Pokud je volná kapacita, jen se zapíše; při zaplnění se vytvoří větší pole a vše se zkopíruje
vložení/odstranění uprostřed O(n) O(n) Je nutné posunout prvky za danou pozicí

Jednosměrný spojový seznam

Singly Linked List

Množina

Typické operace

A = {1, 2, 3, 4}
B = {3, 4, 5, 6}

A ∪ B = {1, 2, 3, 4, 5, 6}      // Prvky, které jsou v A nebo v B.
A ∩ B = {3, 4}                  // Prvky, které jsou zároveň v A i v B
A \ B = {1, 2}                  // Prvky, které jsou v A, ale nejsou v B.
B \ A = {5, 6}                  // Prvky, které jsou v B, ale nejsou v A.

Typické implementace

Hashovací tabulka

Slovník

Dictionary

Typické operace

Typické implementace

Fronta

Queue

Typické implementace

Implementace enqueue dequeue front rear Poznámka
Kruhové pole O(1) O(1) O(1) O(1) Posun indexů pomocí modulo, žádné přesouvání prvků
Spojový seznam (head + tail) O(1) O(1) O(1) O(1) Vkládání i odebírání jen přepojí ukazatele
Dynamické pole (běžný list) O(1) O(n) O(1) O(1) dequeue vyžaduje posun všech prvků

Zásobník

Stack

Typické implementace

Implementace push pop peek Poznámka
Dynamické pole O(1)* O(1) O(1) *amortizovaně
Spojový seznam O(1) O(1) O(1) Přepojení hlavy

Iterátor

Stack

Typické operace