Sign In
TIL 웹개발

TIL 웹개발 - 자료구조

서경태
기본적인 자료구조
연결리스트
스택
해시테이블

연결리스트

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)

스택

LIFO (Last I First Out) : 마지막에 들어온 것이 먼저 나오는 구조
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 None

스택과 반대로 먼저 들어온 것이 먼저 나오는 구조
class 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 None

해시테이블

해시함수를 이용해 키를 값에 매핑하는 자료구조
class 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.next

힙은 데이터에서 최대값과 최소값을 빠르게 찾기 위해 고안된 완전 이진 트리(Complete Binary Tree)
최대 힙 삽입
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
최대 힙 추출
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)
Subscribe to 'kyugntae-ai'
Subscribe to my site to be the first to receive notifications and emails about the latest updates, including new posts.
Join Slashpage and subscribe to 'kyugntae-ai'!
Subscribe
👍