데이터 구조 훑어보기
- Published on
프로그래밍의 본질은 문제를 해결하는 것이며, 그 문제를 해결하는 수단으로
알고리즘적 사고
와프로그래밍 언어의 문법
을 사용합니다. (코드없는 데이터구조와 알고리즘 p.26)
이 문장을 읽고 '나는 그동안 문제 해결 방법으로 프로그래밍 언어의 문법만 간신히 사용하고 있었구나...'라고 생각 했습니다. 그럼 알고리즘적 사고는 무엇일까, 궁금한 마음이 들었고 이에 대해 조금씩 알아보려고 합니다.
알고리즘이 무엇인지에 이해하기 위해서는 알고리즘과 상호 보완적 개념인 데이터 구조
에 대해서 알아둘 필요가 있습니다. 오늘은 데이터 구조란 무엇인지 그리고 데이터 구조에는 어떤것들이 있는지 넓고 얕게 알아보겠습니다.
데이터 구조
란, 데이터를 구성하고 저장하는 방법을 설명하며, 데이터를 식별하는 방법을 제공하고, 데이터의 관계를 보여주는 개념입니다.
데이터 구조의 4가지 유형인 선형 데이터
, 트리 데이터
, 해시 데이터
, 그래프
에 대해서 알아보겠습니다.
선형 데이터 구조
는 데이터 구조를 구성하는 요소들이 서로 인접해 순차적인 방식으로 정렬되어있는 데이터 구조를 뜻합니다.
선형 데이터 구조를 갖는 배열
, 리스트
, 스택
, 큐
에 대해 알아봅시다.
단방향 연결 리스트
, 양방향 연결 리스트
, 순환형 연결 리스트
로 구분할 수 있습니다.(1) 단방향 연결 리스트
(2) 양방향 연결 리스트
(3) 순환 연결 리스트
스택
은 추가된 요소를 사용 가능한 메모리의 가장 앞 주소에 배치하는 데이터 구조입니다.푸시
(push)라고하며, 요소를 삭제하는 동작을 팝
(pop)이라고 합니다.큐
는 각 요소에 우선순위를 부여하는 데이터 구조입니다.인큐
(enqueue)라고하며, 요소를 삭제하는 동작을 데큐
(dequeue)라고 합니다.트리 데이터 구조
는 데이터를 계층으로 정렬하는 데이터 구조입니다. 트리 데이터 구조는 루트 노드
를 기준으로 구성되며 하위에 부모 노드
와 자식 노드
를 갖으며, 노드를 연결하는 선을 에지(edge)
라고 합니다.
트리 데이터 구조를 갖는 이진 트리
, AVL트리
, RB트리
, B트리
, 힙
에 대해서 알아봅시다.
최대힙
은 루트 노드가 힙에서 가장 큰 값을 갖으며 부모노드는 자식노드와 같거나 큰 값을 갖습니다.최소힙
은 루트 노드가 힙에서 가장 작은 값을 갖으며, 부모노드가 자식노드와 같거나 작은 값을 갖습니다.해시 데이터 구조
를 이해하기 위해서는 해시와 해시 함수에 대해서 알아야 합니다. 해시
는 어떤 길이의 임의 데이터를 고정 길이의 데이터로 매핑하는 것을 뜻하며, 해시함수
는 해시를 실행하려고 하나의 값을 다른 값으로 변환하는 상자를 뜻합니다.
해시 데이터 구조인 해시 테이블
과 해시 테이블의 해시 충돌 문제를 해결하기 위한 체이닝
방식에 대해 알아봅시다.
그러나, 해시값과 배열의 크기로 인해 해시 충돌
이 발생 할 수 있습니다. 이를 해결하기 위해 체이닝
이라는 방식으로 해시 테이블을 구현할 수 있습니다.
체이닝
은 요소를 단순 배열이 아닌 연결 리스트인 배열에 저장하는 방식으로 구현됩니다.그래프
는 노드 사이의 연결을 보여주는 데이터 구조입니다. 그래프는 루트 노드가 없는 트리같이 생겼으며, 부모 노드 또는 자식 노드로 식별 할 수 있는 노드를 찾을 수 없습니다. 그래프의 노드는 객체
혹은 정점
이라고 하며 이를 연결하는 선을 에지(Edge)
라고 합니다.
무향 가중치 그래프
, 유향 가중치 그래프
로 나눌 수 있습니다.관계형 데이터베이스
는 행과 열로 구성된 테이블에 데이터를 저장하는 데이터베이스 입니다.
관계형 데이터베이스를 이용해 데이터를 검색하기 위해서는 여러 데이터베이스를 연결해서 검색하는 조인(join)을 사용하는데 테이블 사이의 조인이 너무 많으면 검색 속도가 느려집니다. 그래프 데이터베이스
는 테이블이 아닌 데이터 중심으로 데이터가 직접 연결되므로 관계형 데이터베이스에 비해 검색 속도가 상대적으로 빠릅니다.
아래는 SNS의 친구 관계를 관계형 데이터베이스와 그래프 데이터베이스로 나타내 비교한 것입니다.
트리 데이터
는 루트 노드로 시작해 부모 노드와 자식 노드로 이루어져 있습니다. 그래프
는 루트 노드가 없는 트리처럼 생겼으며, 부모 노드 혹은 자식 노드로 식별할 수 있는 노드가 없습니다.
데이터 구조를 한번 훑어보니 머릿속에 흝어져 있던 지식들이 조금은 명확해진것 같습니다. 다음 글에서는 오늘 배운 데이터 구조에 대한 지식을 기반으로 알고리즘
에 대해 얉고 넓게 알아보도록 하겠습니다 :-)
코드 없는 알고리즘과 데이터 구조
(암스트롱 수베로 지음/류태호 옮김/동양북스) 책을 읽고 일부 내용을 보강하여 작성한 글입니다.