• 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

VPS Starter Arubacloud
0 głosów
100 wizyt
pytanie zadane 1 marca 2023 w Algorytmy przez pasjonat_algorytmiki Pasjonat (19,540 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,360 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ź 136 wizyt
pytanie zadane 3 sierpnia 2020 w C i C++ przez TlenekWodoru Użytkownik (520 p.)
0 głosów
0 odpowiedzi 309 wizyt
pytanie zadane 8 stycznia 2021 w Algorytmy przez SmaczySchabowy Początkujący (270 p.)
0 głosów
2 odpowiedzi 207 wizyt
pytanie zadane 18 kwietnia w Inne języki przez sensor Użytkownik (680 p.)

92,973 zapytań

141,937 odpowiedzi

321,177 komentarzy

62,301 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...