Рубрики
Без рубрики

Структура данных очереди

Примечания о том, что такое очередь, как это работает, а также реализация Python. Теги с Python, алгоритмы, информатики.

Этот пост был впервые опубликован в моем блоге: Структура данных очереди

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

Аналогия была бы простой линией людей, ожидающих следующего поезда. В контексте программного обеспечения пример является приемом веб-сервера и ответы на запросы.

Основные методы API являются enqueue (добавить) и Dequeue (Удалить). Но мы также можем добавить другие методы как часть реализации API: Размер , спереди , назад и is_empty Отказ

Мы можем создать Очередь Класс как обертка и используйте список Python для хранения данных очереди. Этот класс будет реализовать enqueue , детенция , Размер , спереди , назад и is_empty методы.

Первый шаг состоит в том, чтобы создать определение класса и о том, как мы ушли в магазин наших предметов.

class Queue:
    def __init__(self):
        self.items = []

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

Для enqueue Метод, нам просто нужно использовать список Добавить Способ добавить новые предметы. Новые товары будут размещены в последнем индексе этого предметы список. Таким образом, передний пункт из очереди всегда будет первым элементом.

def enqueue(self, item):
    self.items.append(item)

Получает новый предмет и добавляет его в список.

Размер Способ подсчитывает только количество элементов очереди с помощью Лен функция.

def size(self):
    return len(self.items)

Идея is_empty Метод – проверять, есть ли список или нет элементов в нем. Если у него есть, возвращает Ложь Отказ В противном случае Правда Отказ Подсчитать количество предметов в очереди, мы можем просто использовать Размер Метод уже реализован.

def is_empty(self):
    return self.size() == 0

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

def dequeue(self):
    return self.items.pop(0)

Но нам нужно справиться с пустотой очереди. Для пустого списка поп Метод поднимает исключение IndexError: какашка из пустого списка Отказ Таким образом, мы можем создать класс исключения для обработки этой проблемы.

class Emptiness(Exception):
    pass

И использует его, когда список пуст:

def dequeue(self):
    if self.is_empty():
        raise Emptiness('The Queue is empty')

    return self.items.dequeue()

Если он пуст, мы поднимаем это исключение. В противном случае мы можем ускорить передний элемент из очереди.

Мы используем эту же стратегию пустоты для спереди Метод:

def front(self):
    if self.is_empty():
        raise Emptiness('The Queue is empty')

    return self.items[0]

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

Также такая же стратегия пустоты для назад Метод:

def back(self):
    if self.is_empty():
        raise Emptiness('The Queue is empty')

    return self.items[-1]

Если у него есть хотя бы один элемент, мы получаем обратный элемент, последний добавленный элемент в очереди.

Обработка очереди

Я создал некоторые функции помощника, чтобы помочь проверить использование очереди.

def test_enqueue(queue, item):
    queue.enqueue(item)
    print(queue.items)


def test_dequeue(queue):
    queue.dequeue()
    print(queue.items)


def test_emptiness(queue):
    is_empty = queue.is_empty()
    print(is_empty)


def test_size(queue):
    size = queue.size()
    print(size)


def test_front(queue):
    front = queue.front()
    print(front)


def test_back(queue):
    back = queue.back()
    print(back)

Они в основном вызывают метод очереди и распечатывают ожидаемый результат от вызова метода.

Использование будет чем-то вроде:

queue = Queue()

test_emptiness(queue)  # True
test_size(queue)  # 0

test_enqueue(queue, 1)  # [1]
test_enqueue(queue, 2)  # [1, 2]
test_enqueue(queue, 3)  # [1, 2, 3]
test_enqueue(queue, 4)  # [1, 2, 3, 4]
test_enqueue(queue, 5)  # [1, 2, 3, 4, 5]

test_emptiness(queue)  # False
test_size(queue)  # 5
test_front(queue)  # 1
test_back(queue)  # 5

test_dequeue(queue)  # [2, 3, 4, 5]
test_dequeue(queue)  # [3, 4, 5]
test_dequeue(queue)  # [4, 5]
test_dequeue(queue)  # [5]

test_emptiness(queue)  # False
test_size(queue)  # 1
test_front(queue)  # 5
test_back(queue)  # 5

test_dequeue(queue)  # []

test_emptiness(queue)  # True
test_size(queue)  # 0

Сначала мы создали новую очередь из Очередь класс.

  • Так что теперь мы можем проверить свою пустоту: Да, это!
  • Убедитесь, что размер: 0.
  • Enqueue 5 новых предметов в очередь: [1, 2, 3, 4, 5] Отказ
  • Проверить пустоту снова: не больше!
  • Проверьте размер: 5.
  • Получите передний элемент: 1, потому что это был первый добавленный элемент.
  • Получите обратный элемент: 5, потому что это был последний добавленный элемент.
  • Удалить 4 предмета: 1, 2, 3 и 4.
  • Проверьте пустоту: еще не пусто!
  • Размер 1, а задняя часть и спереди одинаковы: 5
  • Удалить оставшийся предмет.
  • Проверьте пустоту: сейчас пусто!
  • Размер вернулся к 0.

Еще один способ тестирования

Enqueue 5 Новые предметы:

queue = Queue()
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
queue.enqueue(4)
queue.enqueue(5)

Петлю через предметы и распечатать каждого.

for item in queue.items:
    print(item)

Тестовый спереди и обратно.

test_front(queue) # 1
test_back(queue) # 5

Удалить все.

while not queue.is_empty():
    queue.dequeue()

Размер теста.

test_size(queue) # 0

Время выполнения и космические сложности

Теперь о пространстве и сложностях времени выполнения для каждого метода реализован.

Пространство довольно простое. Это список, так что это На) где n Это текущее количество предметов в стеке.

Время выполнения для каждого метода – O (1) постоянное время.

Ресурсы

Оригинал: “https://dev.to/teekay/queue-data-structure-2iog”