계속지나가기
코딩스뮤
계속지나가기
전체 방문자
오늘
어제
  • 코딩스뮤:)
    • Algorithm
      • 백준 문제풀이
      • 프로그래머스 문제풀이
      • 알고리즘 이론
      • 자료구조
      • SW Expert Academy
    • 인공지능(AI)
      • LLMs
      • 자연어처리(NLP)
      • 컴퓨터비전(CV)
      • 딥러닝(DL)
      • 머신러닝(ML)
      • 인공지능기초수학
      • 선형대수학
    • 컴퓨터 세팅
    • Computer Science
      • 유닉스프로그래밍
      • 프로그래밍언어론
      • 디자인패턴
      • 클린코드
      • SW 영어
      • 리눅스
      • 논리회로
    • Server
      • Docker

블로그 메뉴

  • 홈
  • Who Am I(CV)
  • 태그

공지사항

인기 글

태그

  • 컴퓨터비전
  • 결정경계
  • 군집화
  • NLP
  • 네트워크플로우
  • ComputerVision
  • ML
  • 손실함수
  • 머신러닝
  • LM
  • 알고리즘
  • 언어모델
  • 에지검출
  • 최대유량
  • networkflow
  • 경사하강법
  • DigitalImageProcessing
  • machinelearning
  • 파이썬 클린코드
  • 디지털이미지처리
  • SIFT
  • 비지도학습
  • 지도학습
  • 비용함수
  • 선형회귀
  • f1-score
  • MaximumFlow
  • 패턴인식
  • DIP
  • 기계학습

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
계속지나가기

코딩스뮤

파이썬으로 구현하는 덱(Deque)
Algorithm/자료구조

파이썬으로 구현하는 덱(Deque)

2021. 12. 26. 13:06
반응형

덱(Deque)이란?

double-ended queue로, 큐의 앞과 뒤 모두에서 삽입 및 삭제가 가능한 큐를 의미한다. 덱은 원형 큐(Circular Queue)를 확장하면 손쉽게 구현할 수 있다.

 

원형 큐 구현에 관해서는 해당 게시글을 참고하시면 좋습니다

https://codingsmu.tistory.com/123

 

파이썬으로 구현하는 원형 큐(Circular Queue)

원형 큐(Circular Queue)란? 배열로 구현 된 선형 큐(Linear Queue)의 경우 데이터의 삽입/삭제 시 데이터들을 앞으로/뒤로 당겨주는 과정이 필요해 최악의 경우 O(n)의 시간복잡도를 가지게 된다. 이러한

codingsmu.tistory.com

 

 

0. 멤버 변수&초기화

먼저 덱 클래스의 멤버 변수(member variable)와 초기화 과정을 보자

class Deque:

    rear = 0
    front = 0
    MAX_SIZE = 100
    deq = list()
    
    def __init__(self):
    	self.rear = 0
        self.front = 0
        self.deq = [0 for i in range(self.MAXSIZE)]

추가로, 현재 덱의 front/rear 값을 반환하는 함수도 편의를 위해 같이 구현하도록 하자

def get_front(self):
	if is_empty():
    	print("ERROR: EMPTY")
        return -1
    front = (self.front+1) % MAX_SIZE
    return self.deq[front]
    
    
def get_rear(self):
	if is_empty():
    	print("ERROR: EMPTY")
        return -1
    return self.deq[self.rear]

 

1. 공백 상태

덱이 비워져 있는 경우 rear == front 이다

def is_empty(self):
	if self.rear == self.front:
    	return True
    return False

 

 

2. 포화 상태

앞에서, 공백 상태를 front == rear로 구분하기 때문에 포화상태의 경우 위의 사진처럼 한 칸이 비어있다.

따라서 배열에 한 칸을 비움으로써 공백 상태와 포화 상태를 구분하기로 한다

def is_full(self):
	if (self.rear+1)%self.MAX_SIZE == self.front:
    	return True
    return False

 

 

 

3. 데이터 삽입

3-1. 뒤(rear)에서 삽입

덱에 A B C D를 순서대로 후단에 삽입했을 때 동작 과정

rear에서 삽입이 이루어지므로, front는 값의 변경이 없고 rear += 1을 하며 데이터를 삽입한다

def add_rear(self, x):
	if is_full():
    	print("ERROR: FULL")
        return
    self.rear = (self.rear+1)%(self.MAX_SIZE)
    self.queue[self.rear] = x

 

3-2. 앞(front)에서 삽입

front 변수는 항상 공백을 가리켜야 하므로 앞에서 삽입이 이루어질 때, 한칸씩 차이를 두고 데이터를 삽입해야 한다

이 경우 front에서 삽입이 이루어지므로, rear는 값의 변경이 없고 front -= 1을 하며 데이터를 삽입한다

단, 여기서 주의해야 할 점은 3-1에서 처럼, self.front = (self.front - 1) % MAX_SIZE 연산을 하면 안된다는 점이다.

이 경우, front 변수가 0일 때, 위의 수식을 계산하면 -1이 나와 배열의 인덱스 범위를 벗어나게 된다

따라서, front 변수 업데이트 시  self.front = (self.front - 1 + MAX_SIZE) % MAX_SIZE를 해줘야 한다.

def add_front(self, x):
	if is_full():
    	print("ERROR: FULL")
        return
    self.deq[self.front] = x
    self.front = (self.front - 1 + MAX_SIZE) % MAX_SIZE

 

 

 

4. 데이터 삭제

4-1. 앞(front)에서 삭제

front에서 삭제가 일어날 경우, rear 값의 변경이 없고 front += 1을 하며 데이터를 삭제한다

def del_front(self):
	if is_empty():
    	print("ERROR: EMPTY")
        return
    self.front = (self.front +1) % MAX_SIZE
    return self.queue[self.front]

 

4-2. 뒤(rear)에서 삭제

rear에서 삭제가 일어날 경우, front 값의 변경이 없고, rear -=1을 하며 데이터를 삭제한다

단, 여기서 주의해야 할 점은 4-1에서 처럼, self.rear = (self.rear - 1) % MAX_SIZE 연산을 하면 안된다는 점이다.

이 경우, rear 변수가 0일 때, 위의 수식을 계산하면 -1이 나와 배열의 인덱스 범위를 벗어나게 된다

따라서, rear 변수 업데이트 시  self.rear = (self.rear - 1 + MAX_SIZE) % MAX_SIZE를 해줘야 한다.

def del_rear(self):
	if is_empty():
    	print("ERROR: EMPTY")
        return
    tmp = self.deq[self.rear]
    self.rear = (self.rear - 1 + MAX_SIZE) % MAX_SIZE
    return tmp

 

 

 

Optional. (Print 함수)

추가로, 현재 큐에 저장된 요소를 출력해주는 함수는 아래와 같다

def deque_print(self):
	i = (self.front+1) % MAX_SIZE
    if is_empty():
    	print("ERROR: EMPTY")
        return
    while i != self.rear:
    	print(self.deq[i], ' ')
        i = (i+1) % MAX_SIZE
    print(self.deq[i])
반응형

'Algorithm > 자료구조' 카테고리의 다른 글

파이썬으로 구현하는 퀵 정렬(Qucik Sort)  (0) 2022.03.17
파이썬으로 구현하는 병합정렬(Merge Sort)  (4) 2022.03.13
파이썬으로 구현하는 원형 큐(Circular Queue)  (2) 2021.12.26
[이론] 우선순위 큐 (Priority Queue)  (0) 2021.07.15
[이론] 힙(Heap)  (0) 2021.07.15
    'Algorithm/자료구조' 카테고리의 다른 글
    • 파이썬으로 구현하는 퀵 정렬(Qucik Sort)
    • 파이썬으로 구현하는 병합정렬(Merge Sort)
    • 파이썬으로 구현하는 원형 큐(Circular Queue)
    • [이론] 우선순위 큐 (Priority Queue)
    계속지나가기
    계속지나가기
    NLP Engineer

    티스토리툴바