Java & Kotlin
[Java 자료구조] 여러가지 자료 구조 (2)
Sue
2022. 2. 6. 22:23
비선형 자료구조
트리 (Tree)

- 부모 노드와 자식 노드간의 연결로 이루어진 자료구조를 말한다.
- 트리 중에서도 프로그래밍에서 가장 많이 사용되는 트리는 이진트리이다. (자식 노드 개수 =< 2)
- 이진트리 중 child 개수가 꽉 찬 트리를 포화 이진 트리(Full Binary Tree)라고 한다.
- 루트 노드를 시작으로 왼쪽에서 오른쪽으로 채워나간 트리를 완전 이진 트리(Complete Binary Tree)라고 한다.
이진 트리로 구현하는 자료구조
1) 힙(Heap)
- 완전 이진 트리로 구현
- max heap : 부모 노드 값 >= 자식 노드 값
- min heap : 부모 노드 값 <= 자식 노드 값
- max heap 또는 min heap에서 요소를 하나씩 꺼내면 큰 값(or 작은 값)부터 출력되어 정렬된다. (heap sort)
- priority queue : 우선 순위 높은 element부터 꺼냄
- 자료의 중복은 허용됨
2) 이진 검색 트리(Binary Search Tree)
- 자료(key)의 중복을 허용하지 않는다.
- 부모 노드 기준으로 left subtree는 작은 값(큰 값), right subtree는 큰 값(작은 값)을 가진다.
- 자료 검색 시 한 단계마다 절반씩 범위가 줄어듦으로 검색 성능은 O(logn)이다.

- 최악의 경우(skewed-tree)에는 자료의 개수에 따라 검색 시간이 dependent하므로 검색 성능은 O(n)이다.
- 이를 방지하기 위해 AVL과 같이 스스로 밸런스를 유지해주도록 구현한다.
- traversal(순회) 방식에는 preorder, inorder, postorder 방식이 있다.
- inorder traversal 탐색을 하면 lchild → parent → rchild 순으로 출력되므로 sorting된다.
그래프 (Graph)
- vertex(정점)와 edge(간선)의 집합 G = (V,E)
- 간선은 방향성이 있는 경우와 없는 경우가 있다.
- 그래프를 구현 하는 방법 : 인접 행렬(adjacency matrix), 인접 리스트(adjacency list)
- 그래프를 탐색하는 방법 : BFS, DFS

해싱 (Hashing)
- 검색을 위한 자료구조
- 키(key)에 대한 자료를 검색하기 위한 사전(dictionary) 개념의 자료구조
- 유일한 key에 대한 value를 쌍으로 저장한다.
- key에 대한 index를 반환하기 위해 해시 함수를 이용한다. index = h(key)
- 되도록 유일한 index를 반환하는 것이 해시 충돌(hash collision)을 방지할 수 있으므로 좋다.
- 해시 함수를 이용하여 인덱스 연산이 산술적으로 가능하기 때문에 검색 속도가 빠르다. O(1)
- 해시 충돌이 발생했을 경우 데이터를 추가, 삽입, 검색하는데 시간이 소요될 수 있다.
- array 형태로 저장되는 해시 테이블, 인덱스 array와 그에 대응되는 value 값으로 저장되는 체이닝으로 구현할 수 있다.
- 해시 테이블은 배열 형태로 저장되기 때문에 메모리 낭비가 발생할 수 있고 체이닝은 구현은 복잡하지만 슬롯이 부족하거나 메모리 낭비가 되는 일은 없다.