OBOWIĄZKOWE DO PRZESŁANIA: jedno zadanie
https://en.wikipedia.org/wiki/Set_(abstract_data_type)
Zbiór to ADT, który pozwala przechowywać dane bez powtórzeń i bez ustalonego uporządkowania. Jest to komputerowa realizacja matematycznego pojęcia zbioru skończonego. Istotne jest, aby operacja sprawdzania należenia elementu do zbioru była wykonywana w stałym czasie O(1).
Czasem wymaga się, aby elementy zbioru były posortowane. Wtedy sprawdzanie należenia elementu do zbioru zajmuje czas O(log n).
Typowe operacje dla ADT SET są następujące:
Działania na zbiorach:
// https://en.cppreference.com/w/cpp/container/set
#include <set>
// std::set is an associative container that contains a sorted set of unique
// objects of type Key. Sorting is done using the key comparison function Compare.
// Search, removal, and insertion operations have logarithmic complexity.
// Sets are usually implemented as red-black trees.
// Przykład użycia zbioru posortowanego.
// Elementy zbioru będą wewnętrznie posortowane.
// std::set<int> intset = {4,0,3,1,2}; // initializer list
std::set<int> intset;
for (int i = 0; i < 15; i++)
intset.insert(i % 5); // elementy powtarzające się są ignorowane
// operacja insert() zwraca status typu
// std::pair< std::set<int>::iterator, bool >
assert( intset.size() == 5 );
assert( intset.count(2) == 1 ); // dozwolone 0 lub 1 dla set
assert( intset.count(20) == 0 ); // brak 20 w zbiorze
// Wyszukiwanie elementu w zbiorze, dostajemy iterator.
auto it = intset.find(3);
assert( it != intset.end() ); // liczba 3 należy do zbioru
assert( intset.contains(3) ); // C++20
// intset.erase(3); // usunięcie liczby 3
intset.erase(it); // użycie iteratora do usunięcia liczby 3
it = intset.find(7);
assert( it == intset.end() ); // liczby 7 nie ma w zbiorze
intset.clear(); // opróżnienie zbioru
assert( intset.empty() );
// https://en.cppreference.com/w/cpp/container/unordered_set #include <unordered_set> // std::unordered_set is an associative container that contains a set of unique // objects of type Key. Search, insertion, and removal have average constant-time complexity. // The elements are not sorted in any particular order (hashing is used), // but organized into buckets. // Container elements may not be modified. // Przykład użycia zbioru nieuporządkowanego. // Działa to samo, co dla std::set.
Przygotować implementację realizującą ADT SET na bazie tablicy mieszającej z wykorzystaniem metody łańcuchowej.
// Szablon dla prostego zbioru wykorzystującego metodę łańcuchową.
template<typename T>
class MySet {
int BUCKET; // liczba bukietów
std::list<T> *table;
public:
MySet(int b); // konstruktor
~MySet() { clear(); delete [] table; }
bool empty() const; // czy zbiór jest pusty?
int size() const; // liczba elementów zbioru
void insert(T key); // wstawienie klucza do zbioru
T* find(const T& key); // czy klucz jest w zbiorze? zwraca &key lub nullptr
void remove(const T& key);
int hash(const T& key) { return (int(key) % BUCKET); } // działa dla int, float
void display() const;
void clear(); // czyścimy zbiór
};
template<typename T>
MySet<T>::MySet(int b) {
BUCKET = b;
table = new std::list<T>[BUCKET]; // tablica z pustymi listami
assert( table != nullptr );
}
template<typename T>
void MySet<T>::display() const {
for (int i = 0; i < BUCKET; i++)
for (const T& k : table[i])
std::cout << k << " ";
std::cout << std::endl;
}
Przygotować implementację realizującą ADT SET na bazie drzewa BST, najlepiej samobalansującego (AVL, RBT). Inna możliwość to użycie listy z przeskokami. Elementy powtarzające się mają być ignorowane. Wyświetlane elementy zbioru będą posortowane (kolejność inorder).
Przygotować implementację zbioru do przechowywania liczb całkowitych z zakresu od 0 do n-1. Wykorzystać tablicę int lub bool, w której 0 lub 1 na pozycji k oznacza odpowiednio brak lub istnienie liczby k w zbiorze. Zadbać o to, aby odczyt liczby elementów w zbiorze odbywał się w stałym czasie O(1). Zastosowanie: zbiór wierzchołków grafu w reprezentacji macierzy sąsiedztwa, gdzie wierzchołki grafu są liczbami od 0 do n-1.
Przygotować implementację realizującą ADT SET na bazie drzewa trie do przechowywania stringów.