자료 구조(데이터 구조)는 컴퓨터 메모리를 더 효율적으로 관리하기 위해 새로 정의하는 구조체로 일종의 메모리 레이아웃 또는 지도로 생각하면 된다.
자료 구조 중에는 연결 리스트, 해시 테이블, 스택, 큐, 딕셔너리 등이 존재한다.
연결 리스트는 저장되어있는 값들이 여러군데에 나누어져 존재하지만
바로 다음 값의 메모리 주소를 기억하고 있어 배열과 비슷하게 값을 연이어 읽을 수 있는 자료 구조이다.
배열: 각 값이 메모리 상에서 연이어 저장되어 있다.(인덱스가 연속적이다.)
연결 리스트: 각 값이 메모리 상에서 따로 따로 저장되어 있다.
가장 첫번째 값인 1은 2의 메모리 주소를 저장 2는 3의 메모리 주소를 저장하는걸 확인할 수 있다.
장점
단점
그래프의 일종으로 정점과 간선을 이용하여 데이터의 배치 형태를 추상화한 자료구조이다.
연결 리스트를 활용한 데이터 구조인 트리는 각 요소가 여러개의 요소를 가리킨다.
트리 자료구조는 일반적으로 대상 정보의 각 항목들을 계층적으로 구조화할 때 사용하는 비선형 자료구조이다.
트리의 구조는 '데이터의 저장'의 의미보다는 '저장된 데이터를 더 효과적으로 탐색' 하기 위해서 사용된다.
리스트와 다르게 부모 자식의 계층적인 관계로 표현된다.
트리는 사이클이 없다.
최상위 계층의 노드를 루트노드라고 부른다.
트리에서 루트노드를 제외한 모든 노드는 단 하나의 부모노드를 가진다.
이진 검색 트리
트리 자료구조는 여러 가지 유형이 있는데, 그중 가장 기본이 되는 트리는 이진 트리(Binary Tree) 구조이다.
이진 트리는 2개 이하의 자식노드를 가진다. 자식노드가 없거나 1개의 자식노드만 가지는 것도 가능하다.
2개의 자식 노드 중 왼쪽의 노드를 Left Node, 오른쪽의 노드를 Right Node라고 한다.
키(key)에 데이터(value)를 저장하는 데이터 구조이다.
인스타그램의 해쉬태그 원리도 바로 이 해쉬테이블에서 파생된것이다.
성능이 뛰어나기 때문에 해쉬라는 키를 확장한 여러가지 함수, 알고리즘 기반으로 최근 블록체인 기술에서 많이 사용된다.
키를 해쉬 함수에 넣으면 데이터가 저장되어야 할 위치를 알 수 있다.
보통 배열로 Hash Table 사이즈 만큼 생성 후에 사용한다.
key를 통해 바로 데이터를 가져올 수 있기 때문에 속도가 획기적으로 빨라진다.
해시 테이블이 빠른 검색속도롤 제공하는 이유는 다음과 같다.
(Key, Value)가 ("John Smith", "521-1234")인 데이터를 크기가 16인 해시 테이블에 저장하는 과정
(1) index = hash_function("John Smith") % 16 연산을 통해 index 값을 계산한다.
(2) array[index] = "521-1234" 로 전화번호를 저장하게 된다.
이러한 구조로 데이터를 저장하면 Key값으로 데이터를 찾을 때 해시 함수를 1번만 수행하면 되므로 매우 빠르게 데이터를 저장/삭제/조회할 수 있다. 해시테이블의 평균 시간복잡도는 O(1)이다.