• 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

Object Storage Arubacloud
0 głosów
83 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 (56,980 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ź 113 wizyt
pytanie zadane 3 sierpnia 2020 w C i C++ przez TlenekWodoru Użytkownik (520 p.)
0 głosów
0 odpowiedzi 277 wizyt
pytanie zadane 8 stycznia 2021 w Algorytmy przez SmaczySchabowy Początkujący (270 p.)
0 głosów
2 odpowiedzi 108 wizyt
pytanie zadane 5 dni temu w Inne języki przez sensor Użytkownik (680 p.)

92,568 zapytań

141,424 odpowiedzi

319,634 komentarzy

61,956 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...