scalabook

Форк
0
88 строк · 3.3 Кб

Очереди

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

По отношению к очередям применяют понятия начало (front) и конец (rear) очереди.

Структура такого типа определяет набор правил:

  • Элемент, который вставляется первым, удаляется первым - First in First Out (FIFO).
  • Элемент, вставленный последним, покидает очередь последним.

Временная сложность вставки и удаления элемента в очередь составляет O(1).

В Scala присутствует стандартная релизация очереди, описанная в соответствующем разделе.

Оценка:

  • Первый элемент очереди (frontOption
    )
    • Время - O(1)
    • Память - O(1)
  • Конец очереди (rearOption
    )
    • Время - O(1)
    • Память - O(1)
  • Проверка очереди на пустоту (isEmpty
    )
    • Время - O(1)
    • Память - O(1)
  • Добавление элемента в очередь (enqueue
    )
    • Время - O(1)
    • Память - O(1)
  • Удаление элемента из очереди (dequeue
    )
    • Время - O(1)
    • Память - O(1)

Код:

final class Queue[+A](in: List[A], out: List[A]):
def frontOption: Option[A] = dequeue.map(_._1)
def rearOption: Option[Queue[A]] = dequeue.map(_._2)
lazy val isEmpty: Boolean = in.isEmpty && out.isEmpty
def enqueue[B >: A](x: B): Queue[B] = Queue(x :: in, out)
def dequeue: Option[(A, Queue[A])] = out match
case hd :: tl => Some((hd, Queue(in, tl)))
case Nil => in.reverse match
case hd :: tl => Some((hd, Queue(Nil, tl)))
case Nil => None
object Queue:
def empty[A]: Queue[A] = Queue(Nil, Nil)

Пример:

val emptyQueue: Queue[Int] = Queue.empty[Int]
val nonEmptyQueue: Queue[Int] = emptyQueue.enqueue(1).enqueue(2)
emptyQueue.frontOption // None
nonEmptyQueue.frontOption // Some(1)
emptyQueue.rearOption // None
nonEmptyQueue.rearOption // Some(Queue(2))
emptyQueue.isEmpty) // true
nonEmptyQueue.isEmpty) // false
emptyQueue.enqueue(5)) // Queue(5)
nonEmptyQueue.enqueue(5)) // Queue(1,2,5)
emptyQueue.dequeue) // None
nonEmptyQueue.dequeue) // Some((1,Queue(2)))

Ссылки:

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.