JAVA 로 코딩테스트 문제를 풀면서 알고리즘을 공부하고 있다.
알고리즘을 공부하는게 단순 문제를 풀면 된다고 생각했지만,
언제 연결리스트를 써야할 지, 언제 배열을 쓰는게 더 효율적인지, 그리고 시간/공간 복잡도를 고려한다면 어떻게 최적화 할 수 있는지 알 수 없었다.
지금까지 거의 단순구조만을 이용해 if 문, for 문을 남발하며 문제를 풀었는데, 이것은 좋은 알고리즘이 아닌 것 같다.
좋은 알고리즘이란 무엇일까?
우선, 자료구조를 직접 구현하며 각각에 대한 이해도를 키워야 할 것 같다.
지난 열혈자료구조 글에서 추상자료형 (Abstract Data Type) 가 무엇인지 지갑과 지갑의 기능을 들어 설명했었는데,
기억이 사라져 다시 글을 보고 왔다.
typedef 지갑 {} 으로써 단순 C 언어적 측면에서 지갑 자료형을 정의할 수 있지만,
컴퓨터공학적인 측면에서는 지갑이라는 자료형을 구현하기 위해서 추상자료형(기능들의 나열)까지 정의해 주어야 한다.
그렇다면 지갑 말고, 어떤 자료형이 있을까?
미리 정의된 자료구조는 프로그래밍 언어에서 제공되어 사용하는 것,
사용자 정의 자료구조는 개발자가 정의 및 추상화하여 사용하는 것이다.
다음 게시글부터 사용자 정의 자료구조에 있는 자료형들을 구현해 본다.
알고리즘을 구현할 때, 이러한 자료구조들로 데이터를 구조화 한다.
데이터를 어떤 자료구조형으로 구조화 하느냐는 알고리즘의 성능에 영향을 미친다.
알고리즘을 실행하는데 필요한 시간/공간의 복잡도로 알고리즘 성능을 분석할 수 있고, 알고리즘을 실제 실행하는데 걸린 시간으로 그 성능을 측정해 볼 수 있다.
시간복잡도는 알고리즘 실행 횟수에 대한 함수로 그 경향을 봄으로써 예측해 볼 수 있고,
공간복잡도는 가변공간 + 고정공간의 합으로 계산한다.
'성장하는 중 입니다? > 자료구조' 카테고리의 다른 글
"pointer being freed was not allocated"의 늪에 빠졌습니다. (0) | 2021.07.02 |
---|---|
열혈자료구조 - 3.2 배열을 이용한 리스트의 구현 (2) | 2021.06.12 |
열혈자료구조 - 3.1 추상 자료형 (Abstract Data Type) (0) | 2021.06.12 |