6 / 6 / 0
Регистрация: 19.10.2019
Сообщений: 439
|
|
1 | |
Как устроена std::deque внутри ?15.03.2020, 01:28. Просмотров 1326. Ответов 10
Метки нет Все метки)
(
Не могу себе представить возможную внутреннюю реализацию этого контенера, чтоб она удовлетворяла всем требованиям по вычислительной сложности.
The complexity (efficiency) of common operations on deques is as follows: Random access - constant O(1) Insertion or removal of elements at the end or beginning - constant O(1) Insertion or removal of elements - linear O(n) Из разных статей вычитал что примерная реализация это динамический массив из динамических массивов. Непонятно как он может расти при добавлении за константное время в ОБЕ! стороны так что при этом оставаться массивом из массива. Он жн не связанный список.
0
|
|
15.03.2020, 01:28 | |
Как работает std::deque?
std::deque Разделить std::deque на заданное количество деков |
|
![]() 8394 / 3934 / 859
Регистрация: 15.11.2014
Сообщений: 8,881
|
|
15.03.2020, 02:11 | 2 |
я как то особо этим вопросом не заморачивался, однако первое что приходит в голову:
дек - это не массив массивов. это - список векторов. добавление в конец амортизированно быстрая O(1) например, есть вектор: [1][2][3][][][][] пустые клетки - это резерв. пока он не исчерпался, всегда можно просто взять и добавить ещё один элемент: [1][2][3][4][][][] теперь добавляем элемент (нолик) в начало дека: [0][][][][][][] [1][2][3][4][][][] что бы не нужно было сдвигать элементы вправо, можно просто вставить ещё один вектор "перед" текущим. а внешне очередность получается: ([0])([1][2][3][4]) круглыми скобками я выделил вектора. таким образом вставка в попу - быстро-амортизированная операция. вставка в голову - это вставка в попу предыдущему в списке.
0
|
6 / 6 / 0
Регистрация: 19.10.2019
Сообщений: 439
|
|
15.03.2020, 02:43 [ТС] | 3 |
hoggy, Если дека это список векторов, то почему доступ к элементу за константное время ?
0
|
3053 / 1458 / 492
Регистрация: 29.11.2010
Сообщений: 2,888
|
|
15.03.2020, 03:46 | 4 |
Можно посмотреть на GCC реализацию на сайте gnu: https://gcc.gnu.org/onlinedocs... 02018.html
0
|
14016 / 7504 / 1774
Регистрация: 30.01.2014
Сообщений: 12,559
|
|
15.03.2020, 03:47 | 5 |
Вот там же, откуда вы взяли информацию о константной сложности индексации, написано почему: строится дополнительный индекс для этого (он индексирует уже элементы списка).
0
|
3053 / 1458 / 492
Регистрация: 29.11.2010
Сообщений: 2,888
|
|
15.03.2020, 03:48 | 6 |
А в чём противоречие? Достаём из первого измерения по индексу за константу плюс из второго измерения сам элемент за константу. Константа плюс константа равно константа.
0
|
14016 / 7504 / 1774
Регистрация: 30.01.2014
Сообщений: 12,559
|
|
15.03.2020, 03:54 | 7 |
Изначально противоречие в том, что у списка нет индекса
![]() Но его, как я уже сказал, можно построить дополнительно. Реализация в GNU, кстати, больше похожа на вектор векторов, чем на список векторов.
0
|
3053 / 1458 / 492
Регистрация: 29.11.2010
Сообщений: 2,888
|
|
15.03.2020, 03:58 | 8 |
В вижуал студии более хитро, но тоже никакого списка векторов не наблюдается.
Откуда инфа про список векторов?
0
|
6 / 6 / 0
Регистрация: 19.10.2019
Сообщений: 439
|
|
15.03.2020, 03:59 [ТС] | 9 |
Что такое "дополнительный индекс" ? динамически массив в дополнении к списку ? А вставка тогда как может быть за константное время тогда ?
0
|
14016 / 7504 / 1774
Регистрация: 30.01.2014
Сообщений: 12,559
|
|
15.03.2020, 04:02 | 10 |
Ну это каноничная, наивная реализация этой структуры.
Обычно новичкам ее объясняют именно так. Для автора: https://stackoverflow.com/ques... que-in-stl Думаю, снимет оставшиеся вопросы. Добавлено через 1 минуту Обычно тут понимается амортизированная константа, а не честная константа.
0
|
Тематические курсы и обучение профессиям онлайн Профессия Разработчик на C++ (Skillbox) Архитектор ПО (Skillbox) Профессия Тестировщик (Skillbox) |
3053 / 1458 / 492
Регистрация: 29.11.2010
Сообщений: 2,888
|
|
15.03.2020, 04:02 | 11 |
0
|
15.03.2020, 04:02 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь. Перемещение элементов внутри deque Как устроена рекурсия? как устроена динамическая идентификация типов
Std::map или string внутри класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |