Przejdź do treści
ŚredniWaga: 4-6 pkt

Kolekcje: Listy, Słowniki i Zbiory

Wybór właściwej struktury danych decyduje o czasie działania programu. Kiedy lista, kiedy słownik, a kiedy zbiór — i dlaczego to zmienia złożoność.

1. Trzy struktury, trzy zastosowania

Na maturze rzadko pytają wprost o strukturę danych — ale wybór złej potrafi zamienić program działający w sekundę w taki, który liczy minutami. To częsty temat pytania „dlaczego drugie rozwiązanie jest szybsze".

  • Lista — kolejność ma znaczenie, elementy mogą się powtarzać. Dostęp po indeksie.
  • Słownik — para klucz i wartość. Idealny do zliczania i wyszukiwania po nazwie.
  • Zbiór — tylko unikalne elementy, bez kolejności. Do sprawdzania „czy już było".

2. Dlaczego zbiór bywa szybszy od listy

Sprawdzenie x in lista wymaga przejścia po kolei przez elementy, czyli O(n)O(n). To samo sprawdzenie na zbiorze albo słowniku działa w czasie średnio stałym, O(1)O(1).

# wolno: dla kazdego elementu przechodzimy cala liste
wynik = []
for x in dane:
  if x not in wynik:      # O(n) przy kazdym obiegu
      wynik.append(x)

# szybko: sprawdzenie w zbiorze jest natychmiastowe
widziane = set()
wynik = []
for x in dane:
  if x not in widziane:   # O(1)
      widziane.add(x)
      wynik.append(x)

Pierwsza wersja ma złożoność O(n2)O(n^2), druga O(n)O(n). Przy dziesięciu tysiącach danych z arkusza maturalnego to różnica między ułamkiem sekundy a wyraźnym oczekiwaniem.

3. Słownik do zliczania

Zadania typu „która litera występuje najczęściej" albo „ile razy pojawia się każde słowo" rozwiązuje się słownikiem w kilku linijkach.

licznik = {}
for znak in tekst:
  licznik[znak] = licznik.get(znak, 0) + 1

# element o najwiekszej wartosci
najczestszy = max(licznik, key=licznik.get)

Metoda get z wartością domyślną pozwala uniknąć sprawdzania, czy klucz już istnieje. To skraca kod i eliminuje najczęstszy błąd w tym zadaniu.

4. Pułapki

  • Zbiór gubi kolejność i duplikaty. Jeśli zadanie wymaga zachowania kolejności wystąpień, potrzebujesz zbioru i listy naraz, jak w przykładzie wyżej.
  • Modyfikowanie listy w trakcie iterowania po niej daje pominięte elementy. Buduj nową listę zamiast usuwać z bieżącej.
  • Kluczem słownika nie może być lista, bo jest zmienna. Krotka może.
  • Sortowanie po wartościach słownika wymaga wskazania klucza sortowania — samo sorted() uporządkuje klucze, nie wartości.

Nadal czujesz się niepewnie?

To tylko jeden z pewniaków. Na kursie przechodzimy przez nie wszystkie, krok po kroku, aż poczujesz ten spokój.

Pomóżcie mi zdać maturę!