Queue의 활용 예) 운영 체제 시스템 내부, 네트워킹 시스템 내부 ..
1) 배열 : Python의 list
2) 연결 리스트 : Doubly Linked List
# 배열 queue
class ArrayQueue:
def __init__(self):
self.data = []
def size(self):
return len(self.data)
def isEmpty(self):
return self.size() == 0
# 한 쪽에서 데이터를 넣는다.
def enqueue(self, item):
self.data.append(item)
# 반대 쪽에서 데이터를 꺼낸 후 반환한다.
def dequeue(self):
return self.data.pop(0)
# 가장 앞의 데이터를 반환한다.
def peek(self):
return self.data[0]
# 연결 리스트 queue
from doublylinkedlist import *
class DoublyLinkedListQueue:
def __init__(self):
self.data = DoublyLinkedList()
def size(self):
def isEmpty(self):
# 한 쪽에서 데이터를 넣는다.
def enqueue(self, item):
# 반대 쪽에서 데이터를 꺼낸 후 반환한다.
def dequeue(self):
# 가장 앞의 데이터를 반환한다.
def peek(self):
배열 queue의 연산별 시간 복잡도
연산 종류 | 시간 복잡도 |
---|---|
size() | O(1) |
isEmpty() | O(1) |
enqueue(x) | O(1) |
dequeue() | O(n) |
peek() | O(1) |
class CircularQueue:
def __init__(self, n):
self.maxCount = n # 데이터의 최대 저장 개수 n.
self.count = 0
self.data = [None]*n
self.front = -1 # 데이터를 추출하기 위한 pointer
self.rear = -1 # 데이터를 입력하기 위한 pointer
def size(self):
def isEmpty(self):
def isFull(self):
def enqueue(self, x):
def dequeue(self):
def peek(self):
구현 방식)
일반적으로 1번의 방법이 더 유리하다. 2의 방식으로 할 경우, 시간이 더 소모될 수 있다.
구현 자료구조)
from doublylinkedlist import *
class PriorityQueue:
def __init__(self, x):
self.queue = DoublyLinkedList()
def size(self):
def isEmpty(self):
def isFull(self):
def enqueue(self, x):
# 데이터를 우선순위 맞춰서 저장함.
def dequeue(self):
def peek(self):
class Node:
def __init__(self, item):
self.data = item
self.left = None
self.right = None
def size(self):
# 현재 subtree의 포함된 node의 수를 return.
# recursive한 방법으로 구현.
# return left subtree size + 1 + right subtree size
def depth(self):
# 현재 subtree의 depth를 return
# left subtree와 right subtree의 depth 중 더 큰 것 + 1를 return
def inorder(self):
# left-root-right 순서로 방문
def preorder(self):
# root-left-right 순서로 방문
def postorder(self):
# left-right-root 순서로 방문
class BinaryTree:
def __init__(self, r):
self.root = r # root node를 저장
def size(self):
def depth(self):
def inorderTraversal(self):
def preorderTraversal(self):
def postorderTraversal(self):
class Node:
def __init__(self, item):
self.data = item
self.left = None
self.right = None
def size(self):
# 현재 subtree의 포함된 node의 수를 return.
# recursive한 방법으로 구현.
# return left subtree size + 1 + right subtree size
def depth(self):
# 현재 subtree의 depth를 return
# left subtree와 right subtree의 depth 중 더 큰 것 + 1를 return
def inorder(self):
# left-root-right 순서로 방문
def preorder(self):
# root-left-right 순서로 방문
def postorder(self):
# left-right-root 순서로 방문
class BinaryTree:
def __init__(self, r):
self.root = r # root node를 저장
def size(self):
def depth(self):
def inorderTraversal(self):
def preorderTraversal(self):
def postorderTraversal(self):
def bft(self):
# root노드가 존재한다면 queue에 root 노드를 enqueue한다.
# queue가 빌 때까지 다음 과정들을 반복한다.
# 1. queue에 들어 있는 노드를 dequeue한 후, 해당 노드를 방문.
# 2. 왼쪽 노드가 존재하면 왼쪽 노드를 queue에 enqueue한다.
# 3. 오른쪽 노드가 존재하면 오른쪽 노드를 queue에 enqueue한다.
이진 탐색 트리의 장단점은 다음과 같다.
이진 탐색 트리의 구성 요소)
class Node:
def __init__(self, key, data):
self.key = key
self.value = data
self.left = None
self.right = None
def inorder(self):
def min(self):
def max(self):
def lookup(self, key, parent=None):
def insert(self, key, data):
def countChildren(self):
class BinSearchTree:
def __init__(self):
self.root = None
def inorder(self):
def min(self):
# 최소 key값을 갖는 node를 return.
def max(self):
# 최대 key값을 갖는 node를 return.
def lookup(self, key):
# 해당 key값을 갖는 node와 부도 노드를 return.
# 없으면 None return.
def insert(self, key, data):
def remove(self, key):
# key를 이용해서 노드를 찾는다.
# 삭제한 경우 True, 해당 키의 노드가 없는 경우 False
비교 | 이진 탐색 트리 | 힙 |
---|---|---|
원소들의 완전한 정렬 | O | X, 느슨한 정렬 |
특정 key 값의 탐색 속도 | 빠름 | 느림 |
제약 조건 | X | 완전 이진 트리이어야 함 |
삽입, 삭제 속도 | 빠름, O(log(n)) | |
완전 이진 트리의 노드들의 index 특징)
class MaxHeap:
def __init__(self):
self.data = [None] # 빈 maxheap 생성.
def insert(self, item):
# 맨 마지막에 해당 item을 추가한다.
# 해당 데이터 원소를 부모 노드와 비교하며 최대 비교 회수: log_2(n)
# 부모 노드보다 값이 크다면 switch한다.
def remove(self):
# 1. 루트 노드를 제거한다.
# 2. 트리의 마지막 노드를 임시로 루트 노드에 배치한다.
# 3. 자식 노드들과 비교하며 아래로 이동한다.
# 3-1. 왼쪽과 오른쪽 자식 중 큰 값을 기준으로 switch한다.
def maxHeapify(self, i):
Max/Min Heap의 응용)