본문 바로가기

과거공부모음

자료구조 알고리즘

자료구조

데이터 구조(Data Structure)는 컴퓨터 과학에서 데이터를 효율적으로 저장하고 조직화하고 관리하며 검색할 수 있는 방법이다. 데이터 구조는 알고리즘의 성능을 크게 향상시킬 수 있으며 프로그래밍에서 중요한 역할을 한다. 여러 종류의 데이터 구조가 있으며 각각의 데이터 구조는 특정한 목적에 따라 설계되어 사용된다.

 

일반적으로 사용되는 데이터 구조

  1. 배열(Array) : 같은 유형의 요소들을 연속된 메모리 공간에 저장하는 선형 데이터 구조 인덱스를 사용하여 빠른 검색과 수정이 가능 사용 예 : 같은반 학생들을 저장하는 데 사용할 수 있다.
  2. 연결 리스트(Linked List) : 노드들의 집합으로 각 노드가 다음 노드를 가리키는 포인터를 사용하여 연결되어 있는 선형 데이터 구조 동적 크기 조정이 가능하며 메모리의 비연속적인 공간을 활용 사용 예 : 음악 재생 목록처럼 빈번하게 노래를 추가하거나 삭제하는 경우 사용할 수 있다.
  3. 스택(Stack) : LIFO(Last-In-First-Out) 원칙을 따르는 선형 데이터 구조 데이터의 추가와 제거가 한쪽 끝에서만 발생 사용 예 : 일반적으로 함수 호출과 재귀적 알고리즘에서 사용한다
  4. 큐(Queue) : FIFO(First-In-First-Out) 원칙을 따르는 선형 데이터 구조 데이터의 추가는 한쪽 끝에서 제거는 다른 한쪽 끝에서 발생 사용 예 : 작업 대기열, 이벤트 처리, 스케줄링 등의 작업에서 사용된다.
  5. 트리(Tree) : 계층적 관계를 나타내는 비선형 데이터 구조 노드들이 트리 형태로 연결되어 있다. 이진 트리, B-트리 등 다양한 형태의 트리가 있으며 검색, 삽입, 삭제 등의 작업을 효율적으로 수행할 수 있다. 사용 예 : 파일 시스템, 조직도 같은 구조에서 사용할 수 있다.
  6. 그래프(Graph) : 객체들 간의 복잡한 관계를 나타내는 비선형 데이터 구조로 노드와 그 사이의 연결(간선)으로 구성 사용 예 : 소셜 네트워크 친구 관계, 네트워크, 지도, 경로 찾기 등 다양한 애플리케이션에서 사용된다.
  7. 해시 테이블(Hash Table) : 키-값 쌍을 저장하는 데이터 구조, 해시 함수를 사용하여 빠른 검색, 삽입, 삭제가 가능하다. 사용 예 : 전화번호부

각 데이터 구조는 특정 작업을 수행하기에 적합한 특성을 가지고 있다. 따라서 프로그램의 요구 사항과 특성에 따라 적절한 데이터 구조를 선택하는 것이 중요하다.

 

다음은 일부 데이터 구조와 그 성능 특성을 간략하게 설명한 내용이다.

  1. 배열(Array) : 정적 데이터 구조로, 선언 시 크기가 고정되어 있다. 인덱스를 사용해 O(1) 시간 내에 원소에 접근할 수 있지만, 중간에 원소를 삽입하거나 삭제하는 경우 최악의 경우 O(n) 시간이 소요된다.
  2. 연결 리스트(Linked List) : 동적 데이터 구조로, 노드를 추가하거나 삭제할 때 메모리를 동적으로 할당하거나 해제할 수 있다. 원소 검색은 O(n) 시간이 소요되지만, 삽입과 삭제가 O(1) 시간에 가능하다.(단, 노드에 대한 참조가 이미 알려진 경우).
  3. 스택(Stack) : 푸시(push)와 팝(pop) 연산이 O(1) 시간에 가능한 데이터 구조다. 주로 깊이 우선 탐색(DFS)이나 백트래킹 알고리즘에서 사용된다.
  4. 큐(Queue) : 인큐(enqueue)와 디큐(dequeue) 연산이 O(1) 시간에 가능한 데이터 구조다. 주로 너비 우선 탐색(BFS)이나 CPU 스케줄링 등에 사용된다.
  5. 트리(Tree) : 계층 구조를 갖는 데이터를 표현하기에 적합한 데이터 구조다. 이진 탐색 트리(Binary Search Tree)의 경우, 균형 잡힌 트리에서 검색, 삽입, 삭제 연산이 O(log n) 시간에 가능하다.
  6. 그래프(Graph) : 복잡한 객체 간 관계를 나타내기에 적합한 데이터 구조다. 그래프 알고리즘의 성능은 주로 그래프의 크기(노드 수와 간선 수)에 따라 달라진다.
  7. 해시 테이블(Hash Table) : 충돌(Collision)이 없는 경우, 검색, 삽입, 삭제 연산이 평균 O(1) 시간에 가능한 데이터 구조다. 그러나 충돌이 발생할 경우 성능이 저하될 수 있다.

데이터 구조의 선택은 프로그램의 성능과 효율성에 큰 영향을 미친다. 따라서 프로그래밍 문제를 해결할 때에는 사용할 데이터 구조를 신중하게 선택하는 것이 중요하다.

 

사용할 데이터 구조를 결정할 때 고려해야 할 몇 가지 기준

  1. 데이터의 크기와 형태: 데이터의 양과 형태에 따라 적합한 데이터 구조가 달라진다. 예를 들어 큰 데이터 집합을 정렬된 상태로 유지해야 하는 경우 이진 탐색 트리와 같은 구조를 사용하는 것이 좋다.
  2. 사용할 연산의 종류와 빈도: 어떤 연산이 자주 수행되는지 연산의 속도가 얼마나 중요한지를 고려하여 데이터 구조를 선택해야 한다. 예를 들어 빈번한 삽입과 삭제가 발생하는 경우 연결 리스트가 유용할 수 있다.
  3. 메모리 사용량: 프로그램의 메모리 사용량이 중요한 요소인 경우 메모리 효율성이 높은 데이터 구조를 선택해야 한다. 예를 들어 고정된 크기의 배열이나 연결 리스트는 동적으로 크기를 조절할 수 있어 메모리 사용량을 최적화할 수 있다.
  4. 복잡성: 데이터 구조의 복잡성은 코드의 가독성, 유지 보수성, 오류 발생 가능성에 영향을 미친다. 때문에 간단한 문제를 해결하는 경우 불필요하게 복잡한 데이터 구조를 사용하지 않는 것이 좋다.
  5. 확장성: 프로그램이 데이터 크기나 작업량 증가에 대응할 수 있도록 설계되어야 하는 경우, 확장성이 높은 데이터 구조를 사용하는 것이 좋다.

알고리즘

정렬 알고리즘

데이터를 특정 순서대로 정렬할 때 사용된다.

사용 예 : 학생들의 성적을 내침차순으로 정렬하는 경우

종류 : 버블 정렬, 선택 정렬, 삽입 정렬, 병합 정렬 등

 

검색 알고리즘

데이터 집합에서 특정 값을 찾을 때 사용된다.

사용 예 : 전화번호부에서 특정 사람의 전화번호를 찾는 경우

종류 : 선영 검색, 이진 검색 등

 

그래프 알고리즘

그래프를 이용한 문제를 해결할 때 사용된다.

사용 예 : 지도에서 두 지점 간의 최단 경로를 찾는 경우 사용한다.

종류 : 깊이 우선 탐색(DFS), 너비 우선 탐색(BFS) 등

동적 프로그래밍

중복되는 부분 문제를 효율적으로 해결하기 위해 사용된다.

사용 예 : 두 문자열 간의 최장 공통 부분 수열을 찾는 경우

종류 : 피보나치 수열 최장 공통 부분 수열 등

 

분할 정복

문제를 작은 부분 문제로 나누어 해결하고 그 결과를 결합하여 원래 문제를 해결하는 방법

사용 예 : 대규모 데이터 집합을 합병 정렬로 정렬하는 경우

종류 : 이진 검색, 병합 정렬, 퀵 정렬 등

'과거공부모음' 카테고리의 다른 글

개발 방법론  (0) 2023.04.19
웹 보안  (0) 2023.04.19
데이터베이스와 ORM  (0) 2023.04.18
RESTful API  (0) 2023.04.17
HTTP와 HTTPS  (0) 2023.04.17