본문 바로가기
컴퓨터 사이언스 Computer Science/자료구조 & 알고리즘 Data Structure

[자료구조] 최고의 자료구조는 무엇일까?

by 이땡칠 2022. 8. 1.

* JavaScript 알고리즘 & 자료구조 마스터클래스 강의를 듣고 정리한 게시물입니다.

 

 

왜 이런 많은 자료 구조들이 존재하고, 그것들은 대체 무슨 일을 하는 것일까?

이진 검색 트리, 큐, 단방향 연결리스트, 비방향(undirected)/비비중(unweighted) 그래프 
이진 힙, 우선순위 큐, 방향 그래프, 해쉬 테이블, 양방향 연결리스트, 스택 등

 

특정 유형의 문제에 있어서 특정한 자료 구조가 효율적이기 때문입니다.

자료구조들은 모두 다른 일을 합니다.

 

일부 자료 구조는 매우 특화되어 있는 반면,

배열이나 자바스크립트 객체와 같이 자주 사용되고 있는 일부 자료구조들은 매우 일반적입니다.

이런 일반적인 자료 구조들의 경우 우리가 직접 구현할 필요가 없습니다. (무료로 제공되니까)

 

그러나 RB (Red and Black) 트리, 비방향 그래프, 혹은 그와 유사한 자료 구조로 작업해야 할 경우,

이들 자료구조가 보통 무료로 제공되지는 않기 때문에 직접 프로그래밍 언어로 구현해야 합니다.

 

 

어떤 요소가 자료 구조임을 나타낼 수 있을까?

자료 구조가 공통적으로 가지고 있는 특징은 값(value) 들의 모음이라는 것입니다. 

자료 구조들은 해당 데이터에 적용되는 값들 및 기능 혹은 작업들 사이의 관계를 포함합니다. 

 

예를 들어, 배열은 값들을 가지고 있고, 그 값들 사이의 관계(배열의 경우 순서) 역시 포함하고 있으며, 

포함된 값을 간의 상호 작용, 값들의 추가 방법, 이동 방법 등을 가지고 있습니다.

(push, pop, 정렬 등 모든 종류의 내장 메소드와 기능들)

 

 

우리가 왜 자료구조에 관심 가져야 할까?

1. 개발자로서 많은 시간을 보낼수록 고급 자료 구조 사용을 필요할 가능성이 많아진다.

더 효율적이고, 다른 관계를 표현할 무엇인가를 필요로 하게 됩니다.

더 이상 선형적이지 않고 더 복잡한 데이터를 다루게될 수 있으며,

데이터를 저장하기 위한 다른 방법이 필요할 수 있습니다.

 

예를 들어, 데이터베이스와 같이 그래프 또는 그래프 형식을 반환하는 API,

또는 라이브러리를 사용해 작업해야 될 수 있습니다.

 

2. 이미 내가 은연중에 많은 자료구조를 사용해왔을 수 있기 때문이다. 

자바스크립트에서 DOM을 사용해본 경험이 있다면, 우리는 이미 트리를 조작하거나 상호작용하고 있습니다. 

 

3. 인터뷰 때문이다.

이런 자료구조들은 많은 기술면접의 소재거리가 됩니다.

 

 

사실 "Best" 자료구조는 없다.

모든 자료구조는 서로 다른 일을 헙나다.

서로 다른 상황에서 특정한 자료구조는 탁월함을 가지게 됩니다. 

 

예를 들어, 지도나 위치 정보 관련 작업을 하고 있다면.

구글맵과 같은 방대한 작업을 필요로 하는 GPS 어플리케이션을 작성하고 있다면?

좀 더 간단한 예로 가까운 주유소, 가장 싼 거래 장소 등을 찾아줄 수 있는 코드를 작성하고 있다고 가정해봅시다. 

 

우리는 그래프를 사용할 수 있습니다. 

그래프가 타당한 자료구조일 겁니다. 

 

GPS 데이터와 위치 데이터를 표현할 수 있는 그래프를 이용해

특정 지점들과 그래프 사이의 최단 경로를 찾는 것에 대한 것에 대한 이야기입니다. 

 

단일 배열로 지도를 표현하는 것은 매우 어려운 작업입니다. 

 

 

-

만약 배열이지만 앞단으로 신속하게 삽입할 수 있고, 끝단에서 쉽게 제거할 수 있는

정렬된 리스트를 필요로 한다면 어떻게 해야 할까요? 

 

시작점에 삽입하거나 시작점으로부터 제거함에 있어 배열 구조는 매우 적절하지 않습니다.

그러기 위해서는 모든 것들에 대한 인덱스를 유지해야 합니다.

 

-

방대한 데이터 세트를 정렬해야 할 수도 있습니다.

수 백만에 달하는 데이터 지점들이 있고 삽입이나 제거는 양 끝단에서만 발생할 수 있다고 가정해보면,

이 경우에는 배열 사용은 적절하지 않습니다.

이 때는 연결 리스트가 매우 유용하게 사용될 수 있습니다.

 

 

 

댓글