Jestem studentem pracującym nad małym projektem na kursie obliczeniowym o wysokiej wydajności, a więc efektywność to kluczowy problem.Czy istnieje struktura danych przypominająca tablicę, która może rosnąć po obu stronach?
Powiedzmy, że mam wektor N floats i chcę usunąć najmniejsze n elementów i największe n elementów. Istnieją dwa proste sposoby osiągnięcia tego celu:
sort in ascending order // O(NlogN)
remove the last n elements // O(1)
invert elements order // O(N)
remove the last n elements // O(1)
B
sort in ascending order // O(NlogN)
remove the last n elements // O(1)
remove the first n elements // O(N)
In A Odwracanie elementów zamówić wymagają wymiany wszystkich elementów, natomiast w B usunięcie pierwsze n elementów wymagają przesunięcia wszystkich pozostałych, aby zajęły pozycje pozostawione puste. Użycie std :: remove dałoby ten sam problem.
Gdybym mógł usunąć pierwsze n elementów za darmo, rozwiązanie B byłoby tańsze. To powinno być łatwe do osiągnięcia, jeżeli zamiast mieć wektor, tj. Tablicę z pustą przestrzenią po vector::end()
, będę miał pojemnik z pewną wolną przestrzenią również przed vector::begin()
.
Więc pytanie brzmi: czy istnieją już takie tablicę podobną (czyli pamięć ciągły, bez związane listy) w niektórych bibliotekach (STL, Boost), który pozwala na O (1) wstawianie/usuwanie na obu stronach szyk?
Jeśli nie, to czy uważasz, że istnieją lepsze rozwiązania niż tworzenie takiej struktury danych?
yeap 'std :: deque'. – 101010
@ 40two: Myślę, że 'deque' jest połączoną listą w tyle. – deepmax
Od cpluplus: "elementy deque mogą być rozproszone w różnych porcjach przechowywania". Nadal jest to bardzo dobra sugestia! – Fabio