Я довольно хорошо знаю, где использовать стеки, очереди и деревья в программных приложениях, но я никогда раньше не использовал Deque (Double Ended Queue). Где бы я обычно встречал их в дикой природе? Будет ли это в тех же местах, что и в очереди, но с дополнительными gribbilies?
data-structures
Мировой инженер
источник
источник
Ответы:
Один из способов использования deque - это «старение» предметов. Обычно он используется как функция отмены или истории. Новое действие вставлено в деку. Самые старые предметы находятся на фронте. Ограничение на размер декы заставляет элементы в передней части быть удаленными в некоторый момент, когда новые элементы вставляются (старение самых старых элементов). Затем он обеспечивает быстрый способ доступа к обоим концам структуры, потому что вы мгновенно узнаете самые старые и самые новые элементы, чтобы либо удалить фронт, и совершить самое старое действие в O (1), либо отменить в O (1) время.
источник
Отличный вопрос. Я не могу вспомнить наш курс по CS 102, в котором упоминалось одно приложение для двусторонней очереди.
На сегодняшний день единственным известным мне приложением является планировщик кражи работы, упомянутый в статье в Википедии .
Это работает по существу следующим образом:
В нормальной однопоточной процедурной модели каждый вызов функции помещает запись активации в так называемый стек вызовов . Запись активации содержит локальные переменные и параметры этого вызова. После завершения вызова метода («возврата») последняя запись активации извлекается из стека вызовов.
Это особенно важно, потому что именно так реализована рекурсия: структура рекурсии представлена в текущем состоянии стека вызовов.
При распараллеливании рекурсивного алгоритма мы можем использовать это свойство, заменив стек вызовов очередью вызовов. Каждый поток в вычислении получает свою очередь вызовов, выдвигает и выскакивает записи активации, как при последовательном выполнении.
Но как только поток завершил свою работу (= его очередь вызовов пуста), он крадет работу из другого потока, удаляя запись активации из очереди вызовов этого потока, удаляя ее с «неправильного» конца.
По сути, очередь вызовов действует как два стека вызовов, которые теперь обслуживают два потока.
источник