Zbiory - operacje na zbiorach
1. Czym jest zbiór?
Zbiór (set) to nieuporządkowana kolekcja unikalnych elementów. Bazuje na matematycznym pojęciu zbioru.
Kluczowe cechy zbioru:
- Nieuporządkowany – elementy nie mają określonej kolejności.
- Unikalne elementy – każdy element występuje tylko raz.
- Mutowalny – można dodawać i usuwać elementy.
- Elementy hashowalne – mogą być tylko niemutowalne obiekty.
- Szybkie operacje – wyszukiwanie, dodawanie, usuwanie w O(1).
2. Tworzenie zbiorów
2.1. Podstawowa składnia
2.2. Konstruktor set()
2.3. Set comprehension
3. Dodawanie elementów
3.1. add() – dodaj pojedynczy element
Złożoność czasowa: O(1)
3.2. update() – dodaj wiele elementów
Złożoność czasowa: O(k), gdzie k to liczba elementów do dodania.
4. Usuwanie elementów
4.1. remove() – usuń element (błąd jeśli nie istnieje)
Złożoność czasowa: O(1)
4.2. discard() – usuń element (bez błędu)
Złożoność czasowa: O(1)
4.3. pop() – usuń losowy element
Uwaga: Kolejność jest nieprzewidywalna!
4.4. clear() – usuń wszystkie elementy
5. Sprawdzanie przynależności
5.1. Operator in
Złożoność czasowa: O(1) – znacznie szybciej niż w liście!
5.2. Porównanie z listą
6. Operacje na zbiorach
6.1. Suma zbiorów (union) – | lub union()
Zwraca zbiór zawierający wszystkie elementy z obu zbiorów.
Złożoność czasowa: O(len(A) + len(B))
6.2. Przecięcie zbiorów (intersection) – & lub intersection()
Zwraca zbiór zawierający tylko wspólne elementy.
Złożoność czasowa: O(min(len(A), len(B)))
6.3. Różnica zbiorów (difference) – - lub difference()
Zwraca elementy z A, które nie są w B.
Złożoność czasowa: O(len(A))
6.4. Różnica symetryczna (symmetric difference) – ^ lub symmetric_difference()
Zwraca elementy, które są w A lub B, ale nie w obu.
Złożoność czasowa: O(len(A) + len(B))
7. Operacje z modyfikacją (in-place)
7.1. update() lub |= – dodaj elementy z innego zbioru
7.2. intersection_update() lub &=
7.3. difference_update() lub -=
7.4. symmetric_difference_update() lub ^=
8. Relacje między zbiorami
8.1. Podzbiór (subset) – <= lub issubset()
Sprawdza, czy A jest podzbiorem B (wszystkie elementy A są w B).
8.2. Nadzbiór (superset) – >= lub issuperset()
Sprawdza, czy A jest nadzbiorem B (wszystkie elementy B są w A).
8.3. Zbiory rozłączne – isdisjoint()
Sprawdza, czy zbiory nie mają wspólnych elementów.
9. Inne operacje
9.1. len() – liczba elementów
Złożoność czasowa: O(1)
9.2. copy() – kopia zbioru
10. Iterowanie po zbiorze
10.1. Pętla for
10.2. Set comprehension
11. frozenset – niemutowalny zbiór
Frozenset to niemutowalna wersja zbioru. Może być kluczem w słowniku lub elementem zbioru.
11.1. Tworzenie frozenset
11.2. Frozenset jako klucz słownika
11.3. Frozenset w zbiorze
12. Praktyczne zastosowania
12.1. Usuwanie duplikatów
12.2. Sprawdzanie czy listy mają wspólne elementy
12.3. Znajdowanie unikalnych słów w tekście
12.4. Sprawdzanie czy wszystkie elementy są unikalne
12.5. Filtrowanie na podstawie drugiej listy
13. Złożoność czasowa operacji na zbiorach
| Operacja | Średnia | Najgorszy |
|---|---|---|
x in zbior |
O(1) | O(n) |
zbior.add(x) |
O(1) | O(n) |
zbior.remove(x) |
O(1) | O(n) |
zbior.discard(x) |
O(1) | O(n) |
A | B (union) |
O(len(A) + len(B)) | |
A & B (intersection) |
O(min(len(A), len(B))) | |
A - B (difference) |
O(len(A)) | |
len(zbior) |
O(1) | O(1) |
14. Zbiory w matematyce – przykłady
14.1. Teoria zbiorów
14.2. Prawa De Morgana
15. Najczęstsze błędy
Błąd 1: Próba dodania niehashowalne obiektu
Błąd 2: Pusty zbiór vs pusty słownik
Błąd 3: Modyfikacja zbioru podczas iteracji
16. Zbiór vs Lista vs Słownik
| Cecha | Zbiór | Lista | Słownik |
|---|---|---|---|
| Uporządkowana | Nie | Tak | Tak (3.7+) |
| Duplikaty | Nie | Tak | Klucze unikalne |
| Wyszukiwanie | O(1) | O(n) | O(1) |
| Indeksowanie | Nie | Tak | Po kluczu |
| Modyfikowalna | Tak | Tak | Tak |
| Użycie pamięci | Średnie | Małe | Duże |
17. Podsumowanie
Zbiory to potężna struktura danych do pracy z unikalnymi elementami:
- Szybkie wyszukiwanie: O(1)
- Automatyczne usuwanie duplikatów
- Operacje matematyczne (suma, przecięcie, różnica)
- Idealne do sprawdzania przynależności
Kluczowe operacje:
add(),remove(),discard()– modyfikacja|,&,-,^– operacje na zbiorachin– sprawdzanie przynależności (O(1)!)
Kiedy używać zbiorów?
- Potrzebujesz unikalnych elementów
- Chcesz szybko sprawdzać przynależność
- Wykonujesz operacje matematyczne na zbiorach
- Musisz usunąć duplikaty
Co dalej warto poznać:
frozenset– niemutowalny zbiór- Algorytmy grafowe (zbiory wierzchołków)
- Optymalizacja zapytań do bazy danych
- Teoria zbiorów w matematyce