코딩테스트 문제를 보다 효율적으로 풀기 위해 '자료구조가 왜 존재하는지', '어떤 종류의 개념들이 있는지'에 대해 간단히 정리하고자 한다.
"현실을 프로그래밍적으로 표현한 것"
데이터 값의 모임, 데이터 간의 관계, 데이터에 적용할 수 있는 함수나 명령을 자료구조라고 한다. 자료구조를 통해 보다 효율적인 알고리즘을 사용할 수 있고 큰 데이터를 효율적으로 관리할 수 있기 때문에, 코드로 로직을 구성할 때 참고하면 도움을 받을 수 있다.
Key, Value로 데이터를 저장하는 자료구조 중 하나이다.
검색 속도가 빠르다는 장점이 있다.
HashFunction(Key) -> Hash Code -> Index(HashValue) -> Value
해시충돌을 최소화하는 것이 좋은 해시 알고리즘이다.
발생원인:
1. different keys -> same code
2. different code -> same index
알고리즘의 성능을 수학적으로 표현해주는 표기법이다. 시간 복잡도를 판별할 때 많이 사용된다.
- 장점
-> 알고리즘의 시간, 공간 복잡도 표기.
-> 데이터 및 사용자 증가율에 따른 알고리즘 성능 예측.
입력데이터의 크기에 상관 없이, 언제나 일정한 시간이 걸리는 알고리즘
입력데이터의 크기만큼 시간이 걸리는 알고리즘
for문을 2 번 겹쳤을 때가 대표적인 예시로, i x j만큼 시간이 걸리는 알고리즘
n을 m만큼 돌릴 때, 그만큼의 시간이 걸리는 알고리즘
3차원이다. n x n x n만큼의 시간이 걸리는 알고리즘
Fibonacci 함수가 대표적인 예다.
1, 1, 2, 3, 5, 8, 13 등 다음 숫자를 구하기 위해서는 n-1, n-2 수가 필요하기 때문에, 재귀함수를 통해 피보나치 수열을 구할 수 있다.
검색시마다 판별할 데이터의 1/2이 줄어드는 알고리즘
2진 검색이 대표적이다.
속도가 현저히 빠르고, 데이터가 증가해도 성능이 좋다는 장점이 있다.
Big-O 표기법에서 상수는 과감하게 버린다.
빅-오 표기법은 데이터 증가에 따른 처리시간의 증가율을 예측하고자 만들어진 표기법이다. 따라서 증가하지 않는 숫자는 신경쓰지 않기 때문에 고정된 상수도 신경쓰지 않는다.
계층구조를 표현할 때 사용하는 자료구조이다.
왼쪽 자식노드 값 < 부모노드 값 < 오른쪽 자식노드 값
만약 새로운 노드가 삽입되면, 위랑 동일하게 노드 순서를 변경한다.
각각의 노드를 정확히 한 번만, 체계적인 방법으로 방문하는 과정이다.
아래는 노드 방문 순서에 따른 분류이다.
부모노드 -> 왼쪽 자식노드 -> 오른쪽 자식노드
왼쪽 자식노드 -> 부모노드 -> 오른쪽 자식노드
왼쪽 자식노드 -> 오른쪽 자식노드 -> 부모노드
Array = fixed, static array
List = dynamic array
노드에는 링크 필드와 데이터 필드가 있다. 이 링크의 수와 흐름을 기준으로 List는 세 가지로 분류된다.
링크 1개 / 한 방향 이동
링크 2개 / 양방향 이동
링크 1개 혹은 2개 / 환형 이동 (마지막 노드가 첫 번째 노드를 가리켜서 계속 회전한다.)
중간에 한 요소를 삭제하거나 추가할 때, 링크 연결만 변경해주면 된다. 아무것도 링크가 연결되지 않은 요소는 가비지 컬렉팅에 의해 삭제된다.
우선순위가 가장 높은 데이터를 가장 먼저 삭제하는 자료구조이다. 데이터를 우선순위에 따라 처리하고 싶을 때 사용한다.
(자료구조 -> 추출되는 데이터)
1. Stack -> 가장 나중에 삽입된 데이터
2. Queue -> 가장 먼저 삽입된 데이터
3. Priority Queue -> 가장 우선순위가 높은 데이터
프로그램을 작성할 때, 각 모듈이 작동하는 논리를 표현하기 위한 언어이다. 특정 문법이 아닌 일반언어로 코드를 흉내내어 알고리즘을 작성한 코드를 말한다.