Мы обсудили эффективную реализацию k стека в массиве . В этом посте обсуждается то же самое для очереди. Ниже приводится подробное изложение проблемы.
Создайте структуру данных kQueues, которая представляет k очередей. Реализация kQueues должна использовать только один массив, т.е. k очереди должны использовать один и тот же массив для хранения элементов. Следующие функции должны поддерживаться kQueues.
enqueue (int x, int qn) -> добавляет x к номеру очереди 'qn', где qn от 0 до k-1
dequeue (int qn) -> удаляет элемент из номера очереди 'qn', где qn от 0 до k-1
Способ 1 (разделить массив на слоты размером н / к)
Простой способ реализации k очередей — разделить массив на k слотов размером n / k каждый и зафиксировать слоты для разных очередей, т. Е. Использовать arr [0] для arr [n / k-1] для первой очереди. и от arr [n / k] до arr [2n / k-1] для queue2, где arr [] — это массив, который будет использоваться для реализации двух очередей, а размер массива равен n.
Проблема с этим методом — неэффективное использование пространства массива. Операция постановки в очередь может привести к переполнению, даже если в arr [] есть свободное место. Например, рассмотрите k как 2 и размер массива n как 6. Позвольте нам ставить 3 элемента в очередь первым и ничего не ставить во вторую очередь. Когда мы поместим 4-й элемент в первую очередь, произойдет переполнение, даже если у нас будет место еще для 3 элементов в массиве.
Метод 2 (Пространственно эффективная реализация)
Идея похожа на запись стека , здесь нам нужно использовать три дополнительных массива. В посте стека нам потребовалось два дополнительных массива, требуется еще один массив, потому что в очередях операции enqueue () и dequeue () выполняются с разных концов.
Ниже приведены три дополнительных массива:
1) front [] : имеет размер k и хранит индексы передних элементов во всех очередях.
2) Rear [] : размер k, в котором хранятся индексы задних элементов во всех очередях.
2) next [] : имеет размер n и хранит индексы следующего элемента для всех элементов в массиве arr [].
Здесь arr [] — фактический массив, в котором хранится k стеков.
Вместе с k очередями также поддерживается стек свободных слотов в arr []. Вершина этого стека хранится в переменной «free».
Все записи в переднем [] инициализируются как -1, чтобы указать, что все очереди пусты. Все записи next [i] инициализируются как i + 1, потому что все слоты изначально свободны и указывают на следующий слот. Вершина свободного стека 'free' инициализируется как 0.
Ниже приводится реализация вышеуказанной идеи на C ++.
|
Джава
|
Выход:
Dequeued element from queue 2 is 15 Dequeued element from queue 1 is 17 Dequeued element from queue 0 is 11
Временные сложности enqueue () и dequeue () составляют O (1).
Лучшая часть описанной выше реализации состоит в том, что, если в очереди есть доступный слот, то элемент может быть помещен в очередь в любой из очередей, т. Е. Не теряется место. Этот метод требует дополнительного места. Пространство может не быть проблемой, потому что элементы очереди, как правило, большие, например, очереди сотрудников, студентов и т. Д., Где каждый элемент имеет сотни байтов. Для таких больших очередей используемое дополнительное пространство сравнительно очень мало, поскольку в качестве дополнительного пространства мы используем три целочисленных массива.
Эта статья предоставлена Sachin . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме
Рекомендуемые посты:
- Реализация стека с использованием очередей
- Реализация стека с использованием одной очереди
- Реализуйте два стека в массиве
- Уровень прохождения заказа строка за строкой | Набор 2 (с использованием двух очередей)
- Реализация PriorityQueue через компаратор в Java
- Реализация стека и очереди с использованием Deque
- Зигзагообразный обход уровня дерева по одной очереди
- Найти элемент в массиве так, чтобы сумма левого массива была равна сумме правого массива
- Найти, является ли массив подмножеством другого массива | Добавлен метод 3
- Разделите 0 и 1 в массиве
- Головоломка с массивом продуктов
- Массив реализации очереди (Simple)
- Головоломка с массивом продуктов | Набор 2 (O (1) пробел)
- Найти второй по величине элемент в массиве
- Очередь | Набор 1 (Введение и реализация массива)
0.00 (0%) 0 votes