Deque розшифровується як Double-Ended Queue. Це особливий тип структури даних, який дозволяє ефективно додавати та видаляти елементи з обох кінців.
На відміну від звичайних черг (які зазвичай слідують за схемою «Першим прийшов, першим вийшов»), двостороння чергу підтримує операції як FIFO, так і LIFO. Це робить його дуже гнучким і корисним у реальних програмах, таких як проблеми з розсувним вікном планування завдань і обробка даних у реальному часі.
приклад:
Pythonfrom collections import deque # Declaring deque de = deque(['name''age''DOB']) print(de)
Вихід
deque(['name' 'age' 'DOB'])

Навіщо нам потрібна deque
- Він підтримує час O(1) для додавання/видалення елементів з обох кінців.
- Це ефективніше, ніж списки для зовнішніх операцій.
- Він може працювати і як черга (FIFO), і як стек (LIFO).
- Ідеально підходить для планування проблем із ковзним вікном і обробки даних у реальному часі.
- Він пропонує потужні вбудовані методи, наприклад appendleft() popleft() і rotate().
Типи обмеженого введення Deque
- Deque з обмеженим введенням : Введення обмежено з одного боку, а видалення дозволено з обох кінців.
- Обмеження виведення Deque : вихід обмежений на одному кінці, але вставлення дозволено на обох кінцях.
Операції над deque
Ось таблиця зі списком вбудованих операцій deque в Python з описами та їх відповідними часовими складностями:
скільки клавіш має клавіатура
| Операція | опис | Часова складність |
|---|---|---|
| додати (x) | Додаєxдо правого кінця дека. | О(1) |
| appendleft(x) | Додаєxдо лівого кінця дека. | О(1) |
| поп() | Видаляє та повертає елемент із правого кінця ряду. | О(1) |
| popleft() | Видаляє та повертає елемент із лівого кінця двох рядів. | О(1) |
| розширити (ітерований) | Додає всі елементи зiterableдо правого кінця дека. | добре) |
| extendleft (ітераційний) | Додає всі елементи зiterableдо лівого кінця дека (у зворотному порядку). | добре) |
| видалити (значення) | Видаляє перше входженняvalueвід дек. ПіднімаєValueErrorякщо не знайдено. | O(n) |
| обертати (n) | Обертає декуnкроки вправо. Якщоnвід'ємне обертається вліво. | добре) |
| очистити() | Видаляє всі елементи з deque. | O(n) |
| кількість (значення) | Підраховує кількість випадківvalueв деке. | O(n) |
| індекс (значення) | Повертає індекс першого входженняvalueв деке. ПіднімаєValueErrorякщо не знайдено. | O(n) |
| зворотний() | Перевертає елементи дека на місце. | O(n) |
Додавання та видалення елементів із черги
- додати (x): Додає x у правий кінець двох рядків.
- appendleft(x): Додає x до лівого кінця двох рядів.
- розширити (ітерований): Додає всі елементи від iterable до правого кінця.
- extendleft (ітераційний): Додає всі елементи від iterable до лівого кінця (у зворотному порядку).
- видалити (значення): Видаляє перше входження вказаного значення з другої черги. Якщо значення не знайдено, виникає помилка ValueError.
- поп(): Видаляє та повертає елемент з правого кінця.
- popleft(): Видаляє та повертає елемент з лівого кінця.
- очистити(): Видаляє всі елементи з deque.
from collections import deque dq = deque([10 20 30]) # Add elements to the right dq.append(40) # Add elements to the left dq.appendleft(5) # extend(iterable) dq.extend([50 60 70]) print('After extend([50 60 70]):' dq) # extendleft(iterable) dq.extendleft([0 5]) print('After extendleft([0 5]):' dq) # remove method dq.remove(20) print('After remove(20):' dq) # Remove elements from the right dq.pop() # Remove elements from the left dq.popleft() print('After pop and popleft:' dq) # clear() - Removes all elements from the deque dq.clear() # deque: [] print('After clear():' dq)
Вихід:
After extend([50 60 70]): deque([5 10 20 30 40 50 60 70])
After extendleft([0 5]): deque([5 0 5 10 20 30 40 50 60 70])
After remove(20): deque([5 0 5 10 30 40 50 60 70])
After pop and popleft: deque([0 5 10 30 40 50 60])
After clear(): deque([])
Доступ до елемента та довжина чергової черговості
- Індексація: Доступ до елементів за позицією за додатними або від’ємними індексами.
- тільки(): Повертає кількість елементів у двох рядках.
import collections dq = collections.deque([1 2 3 3 4 2 4]) # Accessing elements by index print(dq[0]) print(dq[-1]) # Finding the length of the deque print(len(dq))
Вихід
1 4 7
Підрахунок ротації та розвороту двійки
- кількість (значення): Цей метод підраховує кількість входжень певного елемента в дві чергу.
- обертати (n): Цей метод обертає двічі на n кроків. Додатне n обертається вправо, а від’ємне n – ліворуч.
- зворотний(): Цей метод змінює порядок елементів у двох рядках.
from collections import deque # Create a deque dq = deque([10 20 30 40 50 20 30 20]) # 1. Counting occurrences of a value print(dq.count(20)) # Occurrences of 20 print(dq.count(30)) # Occurrences of 30 # 2. Rotating the deque dq.rotate(2) # Rotate the deque 2 steps to the right print(dq) dq.rotate(-3) # Rotate the deque 3 steps to the left print(dq) # 3. Reversing the deque dq.reverse() # Reverse the deque print(dq)
Вихід
3 2 deque([30 20 10 20 30 40 50 20]) deque([20 30 40 50 20 30 20 10]) deque([10 20 30 20 50 40 30 20])