Каков эффективный способ реализации очереди? - PullRequest
7 голосов
/ 23 июля 2010

Каков эффективный способ реализации очереди, чтобы узнать, как она реализована?

РЕДАКТИРОВАТЬ: я изучил stor :: queue, чтобы узнать, как она реализована, но код шаблоназатрудняет понимание.В конце концов, существует более эффективный способ, чем наличие связанного списка.

Ответы [ 9 ]

12 голосов
/ 23 июля 2010

Самый эффективный способ - это заставить кого-то сделать это.

И в C ++, и в C # (и .NET и др.) Есть один в их собственных библиотеках.

5 голосов
/ 24 июля 2010

Конечно, для любого производственного кода вы должны полагаться на надежную реализацию библиотеки, которая уже выдержала испытание временем.

Тем не менее, для самообучения может быть весело написать его самостоятельно.Я делал это раньше.

Самый эффективный из известных мне способов заключается в том, чтобы использовать подход, аналогичный тому, что делает большинство коллекций с изменяемым размером внутри: хранить массив, размер которого увеличивается (обычно удваивается) по мере необходимостиразмер коллекции достигает длины массива.

Очередь немного отличается от обычной коллекции, потому что вы хотите иметь возможность выскакивать с противоположного конца от того места, куда выталкиваются элементы.

Очевидно, что убрать первый элемент и сдвинуть все остальные элементы на один индекс будет дорого и бессмысленно.Поэтому вместо этого вы сами отслеживаете начальные и конечные индексы.Когда коллекция достигает конца массива, вы используете %, чтобы начать выталкивать элементы обратно в начало.

Ключ просто обрабатывает вашу математику, чтобы вы обрабатывали все случаи, например, правильно увеличивали массивкогда очередь заполнена, правильные проверки границ, увеличение начального индекса (или возврат к нулю) для каждого всплывающего окна и т. д.

Очевидно, что описанный выше дизайн имеет много ограничений: безопасность потоков, например.Но для простой, однопоточной, эффективной реализации это довольно хорошая отправная точка.

Удачи - и я также рекомендую опубликовать ваш код, если / когда у вас есть тот, который, по вашему мнению, работает!

4 голосов
/ 23 июля 2010

В самом общем смысле, связанный список будет вашим лучшим выбором, если вы сохраните указатель front и rear.В этом случае вставка и удаление очереди является операцией O(1).Вы также можете реализовать один, используя массив и поддерживая индексы для передней и задней части.Математика немного сложнее (когда вы вставляете или удаляете, вы должны принять во внимание «перенос», чтобы избежать выхода за пределы).

3 голосов
/ 24 июля 2010

Если вы можете принять максимальный размер для очереди, кольцевой буфер является суперэффективным Поскольку библиотечные функции не могут принимать максимальный размер, они не используют эту технику.

1 голос
/ 24 июля 2010

Понимаете ли вы , как работает очередь ?

Понимаете ли вы , как работает очередь stl ?

Понимаете ли вы, что «самый эффективный» - это абстрактное понятие, которое не может быть верным для каждого случая?

Если вы все это получите, к вам придет «самый эффективный алгоритм очереди c ++»

1 голос
/ 23 июля 2010

Для C ++ stl :: queue <>.

0 голосов
/ 24 июля 2010

Если ваша главная цель - узнать, как это реализовано, вам следует работать со связанными списками. С ними интересно работать, и они действительно отличаются от последовательных массивов и многому учат память.

0 голосов
/ 24 июля 2010

Сколько потоков может читать вашу очередь одновременно? Сколько может писать это сразу? Может ли один поток читать, а другой пишет? Вы хотите предварительно выделить место для максимального размера очереди? Вам нужен способ блокировать считыватель во время ожидания данных или блокировать писатель, когда очередь заполнена? Сколько объектов в секунду вы ожидаете передать через очередь?

Оптимальный подход будет зависеть от ответов на эти вопросы.

0 голосов
/ 24 июля 2010

Если вам нужна реализация очереди с поддержкой потоков, вы можете попробовать моя собственная библиотека .Это еще не завершено, но хорошо документировано.

Редактировать: это связано со связанными списками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...