І на Python
Deque розшифровується як Double-Ended Queue. Це особливий тип структури даних, який дозволяє ефективно додавати та видаляти елементи з обох кінців.
На відміну від звичайних черг (які зазвичай слідують за схемою «Першим прийшов, першим вийшов»), двостороння чергу підтримує операції як FIFO, так і LIFO. Це робить його дуже гнучким і корисним у реальних програмах, таких як проблеми з розсувним вікном планування завдань і обробка даних у реальному часі.
приклад:
Python from 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])