데크는 Double-Ended Queue의 약자입니다. 양쪽 끝에서 효율적으로 요소를 추가하고 제거할 수 있는 특별한 유형의 데이터 구조입니다.
일반적으로 First In First Out을 따르는 일반 대기열과 달리 deque는 FIFO 및 LIFO 작업을 모두 지원합니다. 이는 작업 스케줄링 슬라이딩 윈도우 문제 및 실시간 데이터 처리와 같은 실제 응용 프로그램에서 매우 유연하고 유용합니다.
예:
Pythonfrom collections import deque # Declaring deque de = deque(['name''age''DOB']) print(de)
산출
deque(['name' 'age' 'DOB'])

데크가 필요한 이유
- 양쪽 끝에서 요소를 추가/제거하는 데 O(1) 시간을 지원합니다.
- 프런트엔드 작업의 경우 목록보다 더 효율적입니다.
- 큐(FIFO)와 스택(LIFO)의 역할을 모두 수행할 수 있습니다.
- 슬라이딩 윈도우 문제 및 실시간 데이터 처리를 예약하는 데 이상적입니다.
- 다음과 같은 강력한 내장 방법을 제공합니다. 왼쪽에 추가() 팝레프트() 그리고 회전().
제한된 Deque 입력 유형
- 입력 제한 데크 : 한 쪽 끝에서는 입력이 제한되지만 양쪽 끝에서는 삭제가 허용됩니다.
- 출력 제한 Deque : 출력은 한쪽 끝에서 제한되지만 삽입은 양쪽 끝에서 허용됩니다.
데크에 대한 작업
다음은 설명 및 해당 시간 복잡도와 함께 Python에서 기본 제공되는 deque 작업을 나열하는 표입니다.
굵은 글씨용 CSS
| 작업 | 설명 | 시간 복잡도 |
|---|---|---|
| 추가(x) | 추가x데크의 오른쪽 끝에 있습니다. | 오(1) |
| 왼쪽 추가(x) | 추가x데크의 왼쪽 끝에 있습니다. | 오(1) |
| 팝() | deque의 오른쪽 끝에서 요소를 제거하고 반환합니다. | 오(1) |
| 팝레프트() | deque의 왼쪽 끝에서 요소를 제거하고 반환합니다. | 오(1) |
| 확장(반복 가능) | 다음의 모든 요소를 추가합니다.iterable데크의 오른쪽 끝에 있습니다. | 괜찮은) |
| 확장왼쪽(반복 가능) | 다음의 모든 요소를 추가합니다.iterabledeque의 왼쪽 끝에 위치합니다(역순). | 괜찮은) |
| 제거(값) | 첫 번째 발생을 제거합니다.value데크에서. 레이즈ValueError발견되지 않으면. | 에) |
| 회전(n) | 데크를 회전합니다.n오른쪽으로 단계. 만약에n음수는 왼쪽으로 회전합니다. | 괜찮은) |
| 분명한() | 데크에서 모든 요소를 제거합니다. | 에) |
| 개수(값) | 발생 횟수를 계산합니다.value데크에서. | 에) |
| 인덱스(값) | 첫 번째로 나타나는 인덱스를 반환합니다.value데크에서. 레이즈ValueError발견되지 않으면. | 에) |
| 뒤집다() | deque의 요소를 제자리로 되돌립니다. | 에) |
대기열에서 항목 추가 및 삭제
- 추가(x): deque의 오른쪽 끝에 x를 추가합니다.
- 왼쪽에 추가(x): 데크의 왼쪽 끝에 x를 추가합니다.
- 확장(반복 가능): iterable의 모든 요소를 오른쪽 끝에 추가합니다.
- 확장왼쪽(반복 가능): iterable의 모든 요소를 왼쪽 끝에 추가합니다(역순으로).
- 제거(값): deque에서 지정된 값의 첫 번째 항목을 제거합니다. 값을 찾을 수 없으면 ValueError가 발생합니다.
- 팝(): 오른쪽 끝에서 요소를 제거하고 반환합니다.
- 팝왼쪽(): 왼쪽 끝에서 요소를 제거하고 반환합니다.
- 분명한(): 데크에서 모든 요소를 제거합니다.
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([])
항목 및 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): 이 방법은 deque를 n 단계만큼 회전시킵니다. 양수 n은 오른쪽으로 회전하고 음수 n은 왼쪽으로 회전합니다.
- 뒤집다(): 이 메서드는 deque의 요소 순서를 반대로 바꿉니다.
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])