문법/Python

[Python]Deque

jungmin.park 2023. 10. 19. 11:26

Deque

* 앞과 뒤에서 데이터를  처리할 수 있는 양방향 자료형

* stack(스택)처럼 써도 되고 queue(큐)처럼 써도 된다.

* from colections import deque 추가해서 사용하면 된다.

 

Deque 시간복잡도에 관해

Python 리스트와 Deque의 차이

 

* List 시간 복잡도

Average Case Amortized Worst Case
Copy O(n) O(n)
Append[1] O(1) O(1)
Pop last O(1) O(1)
Pop intermediate[2] O(n) O(n)
Insert O(n) O(n)
Get Item O(1) O(1)
Set Item O(1) O(1)
Delete Item O(n) O(n)
Iteration O(n) O(n)
Get Slice O(k) O(k)
Del Slice O(n) O(n)
Set Slice O(k+n) O(k+n)
Extend[1] O(k) O(k)
Sort O(n log n) O(n log n)
Multiply O(nk) O(nk)
x in s O(n)
min(s), max(s) O(n)
Get Length O(1) O(1)

* Deque의 시간 복잡도

Operation Average Case Amortized Worst Case
Copy O(n) O(n)
append O(1) O(1)
appendleft O(1) O(1)
pop O(1) O(1)
popleft O(1) O(1)
extend O(k) O(k)
extendleft O(k) O(k)
rotate O(k) O(k)
remove O(n) O(n)
Get Length O(1) O(1)

-> list와 deque의 삽입과 .pop에 대한 시간복잡도를 보았을때 deque는 O(1) 이라는 시간복잡도를 가지지만 list O(n) 시간복잡도를 가지고 있다.

 


deque 메소드

메소드 설명
append(x) 데크의 오른쪽(마지막)에 x를 추가한다.
appendleft(x) 데크의 왼쪽에 x를 추가한다.
clear() 데크에서 모든 요소를 제거하고 길이가 0인 상태로 만든다.
copy() 데크의 얕은 복사본을 만든다.
count(x) x 와 같은 데크 요소의 수를 센다.
extend(iterable) iterable 인자에서 온 요소를 추가하여 데크의 오른쪽으로 확장한다.
extendleft(iterable) iterable에서 온 요소를 추가하여 데크의 왼쪽으로 확장한다.
일련의 왼쪽 추가는 iterable 인자에 있는 요소의 순서를 뒤지븐 결과를 준다.
index(x[, start[, stop]]) 데크에 있는 x의 위치를 반환한다.
(인덱스 start 또는 그 이후, 그리고 인덱스 stop 이전)
첫 번째 일치를 반환
찾을 수 없으면 ValueError를 발생시킨다. (버전 3.5 추가)
insert(i, x) x를 데크의 위치에 삽입
삽입으로 인해 제한된 길이의 데크가 maxlen 이상으로 커지면 -> IndexError 발생 (버전 3.5 추가)
pop() 데이터 O :데크의 오른쪽에서 요소를 제거하고 반환
데이터 X : IndexError 발생
popleft() 데이터 O : 데크의 왼쪽에서 요소를 제거하고 반환
데이터 X : IndexError 발생
remove(value) 데이터 O :  value의 첫번째 항목을 제거한다. 반환 X
데이터 X : ValueError  발생
reverse() 데크의 요소들을 제자리에서 순서를 뒤집고 None 반환
rotate(n=1) n이 양수이면, 오른쪽으로 회전
= d.appendleft(d.pop)) 
n이 음수이면, 왼쪽으로 회전
= d.append(d.popleft())와 동등
maxlen 데크의 최대 크기 또는 제한이 없으면 None

 


append, appendleft

from collections import deque


deque = deque([chr(i) for i in range(ord('a'), ord('f'))])
print(deque)

deque.append('f')
print(deque)

deque.appendleft('z')
print(deque)

실행 결과

deque(['a', 'b', 'c', 'd', 'e'])
deque(['a', 'b', 'c', 'd', 'e', 'f'])
deque(['z', 'a', 'b', 'c', 'd', 'e', 'f'])

 

clear()

deque = deque([chr(i) for i in range(ord('a'), ord('f'))])
print(deque)

deque.clear()
print(deque)

실행결과

deque(['a', 'b', 'c', 'd', 'e'])
deque([])

 

copy() -> 주소를 참조하는 것이 아닌 단순 복사를 하는 것

deque = deque([chr(i) for i in range(ord('a'), ord('f'))])

print(deque.copy())
print(deque)

실행결과

deque(['a', 'b', 'c', 'd', 'e'])
deque(['a', 'b', 'c', 'd', 'e'])

 

count(x)

deque = deque([chr(i) for i in range(ord('a'), ord('f'))])
deque.appendleft('a')
print(deque)
print(deque.count('a'))

실행결과

deque(['a', 'a', 'b', 'c', 'd', 'e'])
2

extend(iterable), extendleft(iterable)

deque = deque([chr(i) for i in range(ord('a'), ord('f'))])

print(len(deque))
deque.extend(['j','j'])
print(deque)
deque.extendleft(['a','a'])
print(deque)
5
deque(['a', 'b', 'c', 'd', 'e', 'j', 'j'])
deque(['a', 'a', 'a', 'b', 'c', 'd', 'e', 'j', 'j'])

index(x[, start[, stop])

deque = deque([chr(i) for i in range(ord('a'), ord('f'))])
print(deque.index('d', 0, len(deque)-1))

실행결과

3

insert(i, x)

deque = deque([chr(i) for i in range(ord('a'), ord('f'))])
print(deque)
deque.insert(4, 'j')
print(deque)

실행결과

deque(['a', 'b', 'c', 'd', 'e'])
deque(['a', 'b', 'c', 'd', 'j', 'e'])

 

pop(), popleft()

deque = deque([chr(i) for i in range(ord('a'), ord('f'))])
deque.pop()
print(deque)
deque.popleft()
print(deque)

실행결과

deque(['a', 'b', 'c', 'd'])
deque(['b', 'c', 'd'])

remove(value)

deque = deque([chr(i) for i in range(ord('a'), ord('f'))])
print(deque)
deque.remove('b')
print(deque)

실행결과

deque(['a', 'b', 'c', 'd', 'e'])
deque(['a', 'c', 'd', 'e'])

 

reverse()

deque = deque([chr(i) for i in range(ord('a'), ord('f'))])
print(deque)

deque.reverse()
print(deque)

실행결과

deque(['a', 'b', 'c', 'd', 'e'])
deque(['e', 'd', 'c', 'b', 'a'])

 

rotate(n)

deque = deque([chr(i) for i in range(ord('a'), ord('f'))])
deque.rotate(-2)
print(deque)

deque.rotate(3)
print(deque)

실행결과

deque(['c', 'd', 'e', 'a', 'b'])
deque(['e', 'a', 'b', 'c', 'd'])