struktura pomiędzy list a vector

0

Witam! Mam następujący problem:
potrzebuje struktury danych, w ktorej:

  • usuwanie lub dodawanie elementow dziala porównywalnie szybko jak w przypadku listy
  • numer kolejności da się odczytać podobnie szybko jak w przypadku wektora

Chodzi mi o to abym mógł utworzyc listę obiektów, szukał obiektu o pewnej wartosci, zwracał jego kolejność a następnie usuwal go. czynność ta powtarzam n razy dla n elementow. chciałbym uzyskać złożoność rzędu n. wie ktoś jak to zrobić?

0

Nie da się. Gdyby się dało, to bym o czymś takim wiedział :D

Poza tym to powinno polecieć do Algorytmów, a nie do C++.

Edit:
Zakładając, że chodzi ci o listę łączoną, a nie coś typu ArrayList.
Edit2:
Z drugiej strony ArrayList to taki Vector, więc myślę, że nie chodziło o ArrayList :P

0

Rzędu n raczej nie osiągniesz, ale może się udać to zoptymalizować używając mieszaniny listy i wektora. Konkretniej to listę wektorów - dostęp zdecydowanie szybszy od zwykłej listy, ale znowu jest strata na dodawaniu i usuwaniu elementów. Szybko się dodaje na początek i na koniec, ale w środku niestety już nie jest tak kolorowo. Dużo zależy od tego jakiej wielkości będą te wektory.

0

Mnie się wydaje że najbliżej byłby jakiś LinkedHashSet, ale nie wiem czy jakieś c++owe frameworki takie coś udostępniają.

0

Można użyć jakiegoś drzewa, np. B+tree (http://en.wikipedia.org/wiki/B%2B_tree), przykładowa implementacja: http://www.python.org/dev/peps/pep-3128/.

0

Drzewo b+ jest fajnym rozwiązaniem jednak dziala ono poprawnie dla uporządkowanych danych a ja mam ciąg o dużej liczbie obiektów powtarzających się(niestety nie cyklicznie) między którymi różnica nie jest duża(max 60).
Jeśli dobrze zrozumialem to hash table to nic innego jak tablica wskaźników na obiekty. Przyspieszyłoby to program(niestety i tak nie do złożoności n) gdyby obiekty były duże a moje obiekty są bardzo małe(1 bajt)
Macie może jakieś inne pomysly o możliwie małej złożoności. Mi przychodzi jedynie aby przy stworzyć takie "punkty kontrolne" odległości w których przy każdej operacji aktualizowana byłaby odleglosc tego obiektu od początku a pobierając odleglosc od jakiegoś obiektu nie będącego takim punktem cofamy się do najblizszego punktu kontrolnego. tylko że to niestety jest złożoność n^2

0

Śmiedzi mi o jakimś zadaniem z OI. Konkretnie: Litery. Dobra rada - nie szukaj liniówki.

0

Też mi coś tak śmierdziało, ale tak czytam i myślę do czego może być potrzebna taka struktura danych... Nigdy bym nie wpadł na takie rozwiązanie :P

0

Możesz całkiem porządnie przyspieszyć Vector, używając memcpy. Dostaniesz mnie więcej to, o co Ci chodzi.

0

A jeśli memcpy będzie zbyt wolne możesz podzielić zbiór na kilka wektorów. Tu diabeł tkwi w słowie "kilka", trzeba użyć sprytnego algorytmu który będzie wszystko odpowiednio ważył/rozdzielał aby otrzymać optymalne rezultaty.

0

a moglbym prosic o jakis przyklad: link albo kod?

0

W Literach wystarczy drzewo + tablica najzwyklejszych list jednokierunkowych. Nie trzeba wektorów, kolejek, stosów i żadnego tego typu zabaw. Niedawno wkleiłem rozwiązanie w którymś temacie na tym forum.

0

Coś pomiędzy:

typedef std::shared_ptr<MyClass> MyClassGuard;
typedef std::unordered_map<int, MyClassGuard> map;

1 użytkowników online, w tym zalogowanych: 0, gości: 1