선형 자료구조에 해당하는 배열, 연결리스트, 스택, 큐, 데크, 우선순위 큐, 해시테이블에 대해 간단히 정리하고 자료구조, 자료형, 추상 자료형의 차이점에 대해 명확히 알아보자 🕵 💭
추상 자료형(Avstract Data Type)의 실제 구현 대부분은 배열 또는 연결 리스트를 기반으로 한다. 예를 들어 스택은 연결 리스트로 구현하고, 큐는 배열로 구현하는 식이다. 물론 반대의 경우도 충분히 가능하다.
O(1)
O(n)
스택과 큐는 각각의 특징이 뚜렷하지만 별도로 구분해 사용하기가 번거로운 만큼, 한 번에 두 자료형의 특징을 모두 갖고 있는 복합 추상 자료형이 있다면 훨씬 더 편하게 사용할 수 있을 것이다.
collections
모듈에서 deque
라는 이름으로 지원한다.데크와 동일하게 스택과 큐의 연산을 모두 갖고 있는 복합 추상 자료형이다
추출 순서가 일정하게 정해져 있지 않다. 즉, 스택과 큐와 유사하지만 추가로 각 요소의 '우선순위'와 연관되어 있다고 생각하면 된다. 그래서 데이터를 제거할 때 가장 작은 값 먼저 제거된다
결국 내부적으로 정렬하는 매커니즘을 갖고 있다는 뜻인데, 이는 heapq
을 통해 구현되어있다.
파이썬은 우선순위 큐를 queue
모듈에서 PriorityQueue
라는 이름으로 지원한다.
from queue import PriorityQueue
q = PriorityQueue()
q1 = PriorityQueue(maxsize=10) # maxsize를 활용하면 삽입할 수 있는 원소 크기 제한 가능
q.put(3) # 원소를 넣는 과정
q.put(4)
q.put(1)
q1.put((1, 'apple')) # (우선순위, 값)의 형태로 저장할 수도 있음
# 원소 삭제 및 반환
q.get() # 1
q1.get()[1] # (우선순위, 값)의 형태에서 값 반환
heapq
을 import해서 사용하여도 된다.
import heapq
hq = []
heapq.heappush(hq, 4)
heapq.heappush(hq, 1)
heapq.heappush(hq, 3)
heapq.heappush(hq, 7)
heapq.heappop(hq) # 1
자료구조 및 알고리즘을 공부하다보면 자료구조(Data Structure), 자료형(Data type), 추상 자료형(Abstract Data Type) 이라는 용어들이 여러 차례 번갈아 등장한다. 각 단어는 서로 비슷해 보이지만 분명한 차이가 있는 만큼 각각의 정의에 대해 명확하게 구분할 수 있도록 살펴보자
먼저, 컴퓨터과학에서 자료구조란 데이터에 효율적으로 접근하고 조작하기 위한 데이터의 조직, 관리, 저장 구조를 말한다. 우리가 일반적으로 얘기하는 학문으로서의 자료구조를 일컫는다.
보통 자료형과 자료구조를 많이 혼동하는데, 자료형
이란 컴파일러 또는 인터프리터에게 프로그래머가 데이터를 어떻게 사용하는지를 알려주는 일종의 데이터 속성(Attribute)이다. 좀 더 쉽게 말하자면 자료형은 자료구조에 비해 훨씬 더 구체적이며, 특정 언어에서 자료형이라 함은 정수(integer), 실수(floatinf-point Number), 문자열(string) 등 해당 언어에서 지원하는 원시 자료형(Primitive Data Type)까지 포함하는 모든 자료의 유형을 말한다.
자료구조
는 일반적으로 원시 자료형을 기반으로 하는 배열, 연결 리스트, 객체 등을 말하며, 자료형의 관점에서 보자면 여러 원시 자료형을 조합한 자료구조는 복합 자료형(Comopositive Data Type)이 된다.
마지막으로 추상 자료형
은 일반적으로 줄여서 ADT라 부르며 자료형에 대한 수학적 모델을 지칭한다. 좀 더 쉽게 정리하자면, ADT란 해당 유형의 자료에 대한 연산들을 명기한 것이다. ADR는 행동만을 정의할 뿐 실제 구현 방법은 명시하지 않는다. ⭐️ 이런 점에서 자료구조와는 다르다. OOP에 대한 경험이 있다면 추상화(Abstraction)를 떠올리면 이해하기 쉬울 것이다. 추상화는 필수적인 속성만 보여주고, 불필요한 정보는 감추는 것을 의미하는데 이처럼 인터페이스만 보여주고 실제 구현은 보여주지 않는다는 점에서 ADT는 OOP의 추상화와 비슷한 개념이라 할 수 있다.