Array | LinkedList | |
특정 원소 조회 | O(1) | O(N) |
중간에 삽입 삭제 | O(N) | O(1) |
데이터 추가 | 데이터 추가시 모든 공간이 다 차버렸다면 새로운 메로리 공간을 할당받아야한다. | 모든 공간이 다 찼어도 맨 뒤의 노드만 동적으로 추가하면 된다. |
정리 | 데이터에 접근하는 경우가 빈번하다면 Array를 사용하자 | 삽입과 삭제가 빈번하다면 LinkedList를 사용하는 것이 좋다. |
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class LinkedList:
def __init__(self):
self.head = None
def append(self, val):
if not self.head:
self.head = ListNode(val, None)
return
node = self.head
while node.next:
node = node.next
node.next = ListNode(val, None)class Node:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Stack:
def __init__(self):
self.top = None
def push(self, value):
self.top = Node(value, self.top)
def pop(self):
if self.top is None:
return None
node = self.top
self.top = self.top.next
return node.val
def is_empty(self):
return self.top is Noneclass Queue:
def __init__(self):
self.front = None
def push(self, value):
if not self.front:
self.front = Node(value)
return
node = self.front
while node.next:
node = node.next
node.next = Node(value)
def pop(self):
if not self.front:
return None
node = self.front
self.front = self.front.next
return node.val
def is_empty(self):
return self.front is Noneclass HashNode:
def __init__(self, key=None, value=None):
self.key = key
self.value = value
self.next = None
class HashTable:
def __init__(self):
self.size = 10
self.table = [None] * self.size
def _hash_function(self, key):
return key % self.size
def put(self, key, value):
index = self._hash_function(key)
if self.table[index] is None:
self.table[index] = HashNode(key, value)
else:
node = self.table[index]
while node.next is not None:
node = node.next
node.next = HashNode(key, value)
def get(self, key):
index = self._hash_function(key)
node = self.table[index]
while node is not None:
if node.key == key:
return node.value
node = node.next
return -1
def remove(self, key):
index = self._hash_function(key)
node = self.table[index]
prev_node = None
while node is not None:
if node.key == key:
if prev_node is None:
self.table[index] = node.next
else:
prev_node.next = node.next
return
prev_node = node
node = node.nextclass BinaryMaxHeap:
def __init__(self):
# 계산 편의를 위해 0이 아닌 1번째 인덱스부터 사용한다.
self.items = [None]
def insert(self, k):
self.items.append(k)
self._percolate_up()
def _percolate_up(self):
# percolate: 스며들다.
cur = len(self.items) - 1
# left 라면 2*cur, right 라면 2*cur + 1 이므로 parent 는 항상 cur // 2
parent = cur // 2
while parent > 0:
if self.items[cur] > self.items[parent]:
self.items[cur], self.items[parent] = self.items[parent], self.items[cur]
cur = parent
parent = cur // 2
class BinaryMaxHeap:
def __init__(self):
# 계산 편의를 위해 0이 아닌 1번째 인덱스부터 사용한다.
self.items = [None]
def insert(self, k):
self.items.append(k)
self._percolate_up()
def _percolate_up(self):
# percolate: 스며들다.
cur = len(self.items) - 1
# left 라면 2*cur, right 라면 2*cur + 1 이므로 parent 는 항상 cur // 2
parent = cur // 2
while parent > 0:
if self.items[cur] > self.items[parent]:
self.items[cur], self.items[parent] = self.items[parent], self.items[cur]
cur = parent
parent = cur // 2
def extract(self):
if len(self.items) - 1 < 1:
return None
root = self.items[1]
self.items[1] = self.items[-1]
self.items.pop()
self._percolate_down(1)
return root
def _percolate_down(self, cur):
biggest = cur
left = 2 * cur
right = 2 * cur + 1
if left <= len(self.items) - 1 and self.items[left] > self.items[biggest]:
biggest = left
if right <= len(self.items) - 1 and self.items[right] > self.items[biggest]:
biggest = right
if biggest != cur:
self.items[cur], self.items[biggest] = self.items[biggest], self.items[cur]
self._percolate_down(biggest)