Этот вопрос основан на существующем вопросе о том, можно ли моделировать стек с использованием двух очередей с амортизированным раз на операцию стека. Ответ кажется неизвестным. Вот более конкретный вопрос, соответствующий особому случаю, когда сначала выполняются все операции PUSH, а затем все операции POP. Насколько эффективно можно изменить список из N элементов, используя две изначально пустые очереди? Юридические операции:
- Поставьте в очередь следующий элемент из списка ввода (в конец любой очереди).
- Удалите элемент из заголовка любой из очередей и поставьте его снова (в конец любой очереди).
- Удалите элемент из заголовка любой очереди и добавьте его в список вывода.
Если список ввода состоит из элементов , как делает минимальное количество операций , необходимым для генерации списка перевернутого выходного [ N , N - 1 , . , , , 2 , 1 ] вести себя? Доказательство того, что он растет быстрее, чем O ( N ), было бы особенно интересно, так как это решило бы исходный вопрос в отрицательной форме.
Обновление (15 января 2011 г.): проблема может быть решена в , как показано в представленных ответах и их комментариях; и нижняя оценка Ω ( N ) тривиальна. Можно ли улучшить эти границы?
Ответы:
Если N является степенью двойки, я полагаю, что операций O (N log N) достаточно даже для несколько более ограниченной проблемы, когда все элементы начинаются в одной из очередей и должны заканчиваться в обратном порядке в одной из очередей (без списки ввода и вывода).
В O (N) шагах можно начать со всех элементов в одной очереди, сыграть «один для вас, один для меня», чтобы разбить их на чередующиеся подмножества в другой очереди, а затем объединить их все обратно в одну очередь. С точки зрения двоичных представлений положений элементов, это реализует операцию поворота.
В O (N) шагах также можно извлечь пары элементов из одной очереди, поменять их местами, затем вернуть обратно, переворачивая все пары. В терминах двоичных представлений позиций элементов это дополняет младший бит позиции.
Повторяя O (log N) раз в случайном порядке и попарно меняем местами, мы можем дополнить все биты двоичных представлений позиций - это то же самое, что инвертировать список.
источник
Позволяет назвать две доступные очереди слева и справа. Вот основная идея этого алгоритма с предположением, что N четно:
Легко понять, как алгоритм должен работать для нечетных N.
источник