• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Implementacja seta z idxami / drzewa licznikowego

0 głosów
219 wizyt
pytanie zadane 1 marca 2023 w Algorytmy przez pasjonat_algorytmiki Pasjonat (19,560 p.)
Wie ktoś może, czy mogę jakoś stosunkowo nietrudno zaimplementować sobie seta z idxami, chodzi mi żebym mógł wykonywać operacje:

- dodaj i usuń element

- znajdź który element ma idx Z

No i żeby ta struktura była posortowana.

Wiem że jest coś takiego jak ordered_set, ale z tym mam kilka problemów:

- żeby tego użyć, trzeba zapamiętać te długie kilka linijek

- problem się robi, jak chce mieć powtórzenia, bo tak trzeba używać jakieś dziwne rzeczy.

- nie wiem jak zrobić tam seta innego niż intow.

Podsumuwując, czy radzicie zapamiętać te linijki do ordered_seta i jakoś nauczyć się jak pisać multiseta, czy może jest jakaś nietrudna do zaimplementowania w czasie zawodow struktura, która umożliwi mi te operacje. Słyszałem o jakiś drzewach BST i kompresji czerwono czarnej, czy jakoś tak, ale jak przeczytałam o tym to trochę mi się odechciało.....

Ciekawi mnie jeszcze jedna rzecz. Czy np można ten problem rozwiązać jakoś stosunkowo łatwo, jak chce mieć złożoność sqrt, zamiast loga.

Z góry dziękuję za pomoc i poświęcony czas!

1 odpowiedź

+2 głosów
odpowiedź 1 marca 2023 przez Whistleroosh Maniak (57,400 p.)
wybrane 1 marca 2023 przez pasjonat_algorytmiki
 
Najlepsza

ordered_set jest chyba najlepszym rozwiązaniem. Działa dla dowolnego typu tak długo jak ten typ ma zdefiniowany operator<. Możesz nawet zrobić template:

template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

I wtedy dla structa np. Node robisz:

ordered_set<Node> ordS;

Inną opcją jest zaimplementowanie tego drzewem przedziałowym, ale problem pojawia się gdy wartości są z dużego zakresu np. [0, 1e18]. Wtedy pozostaje albo skorzystanie z kompresji, albo z dynamicznego drzewa przedziałowego, albo ze zbalansowanego BST np. drzewo AVL lub RB (Red-black tree). Tylko takie drzewa BST nie są proste w zaimplementowaniu w trakcie 5-godzinnego konkursu. A ordered_set korzysta już z RB tree (to wynika z rb_tree_tag)

Nie wydaje mi się, ze istnieje prostsze rozwiązanie działające w sqrt(n)

Podobne pytania

0 głosów
1 odpowiedź 320 wizyt
pytanie zadane 3 sierpnia 2020 w C i C++ przez TlenekWodoru Użytkownik (520 p.)
0 głosów
0 odpowiedzi 523 wizyt
pytanie zadane 8 stycznia 2021 w Algorytmy przez SmaczySchabowy Początkujący (270 p.)
0 głosów
2 odpowiedzi 907 wizyt
pytanie zadane 18 kwietnia 2024 w Inne języki przez sensor Użytkownik (680 p.)

93,721 zapytań

142,649 odpowiedzi

323,266 komentarzy

63,270 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...