일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 자바
- 프로그래밍 기초
- 백기선
- 프로그래밍
- 시간복잡도
- Java 기초
- 이진탐색알고리즘
- Java
- 자료구조
- 코딩테스트
- 인프런 자바강의
- 순차탐색알고리즘
- eclipse 스프링
- 알고리즘 기초
- 자바 스캐너
- 평균적인 경우
- 코딩테스트 기초
- 윤성우의 열혈구조
- c언어
- 윤성우의 열혈 자료구조
- Big-Oh
- java기초
- 빅-오
- 평균의경우
- 자바 기초
- 인프런 스프링
- Spring 기초
- 개발 기초
- 자료구조 기초
- 알고리즘
- Today
- Total
IT : 기초라는 뿌리
자료구조란 본문
본 글은 윤성우님의 "열혈자료구조" 책을 토대로 작성한 글입니다.
언어 베이스는 C언어입니다.
교재가 학습하는데 정말 많은 도움이 되었습니다.
제가 정리해서 쓴 글이라 본 서적에서 생략되어 있는 부분이 있지만 직접 구매하셔서 심도있는 공부 추천드립니다 (다른 책들도 가능합니다 !)
자료구조는 데이터를 표현하고 저장하는 방법에 대해서 설명합니다.
" 프로그램이란 데이터를 표현하고 그렇게 표현된 데이터를 처리하는 것이다. "
위에서 말하는 데이터 표현은 데이터 저장을 포함하는 개념입니다.
그리고 이렇게 데이터의 저장을 담당하는 것이 바로 자료구조입니다.
" 목적은 명확합니다. 자료를 더 효율적으로 저장하고, 관리하기 위해 사용하며, 잘 선택된 자료구조는 실행시간을 단축시켜주거나 메모리 용량의 절약을 이끌어 낼 수 있습니다. "
출처: https://andrew0409.tistory.com/148
[코인하는 프로그래머]
" 정수를 저장하기 위해서 int형 변수를 선언한다 "
" 개인정보를 저장하기 위한 목적으로 구조체를 정의한다. "
넓은 의미에서 int형 변수도 구조체의 정의도 자료구조에 속합니다. (배열또한)
하지만 앞으로 제가 공부할 자료구조는 저렇게 단순하지 않고 복잡한 형태의 자료구조를 배울 계획입니다. (두근두근)
아래는 기본적인 자료구조의 분류 입니다.
보시다시피 파일도 데이터를 저장하는 도구이기 때문에 자료구조에 포함됩니다.
저는 우선적으로 윤성우님의 열혈자료구조 책을 베이스로 선형구조와 비선형구조를 포스팅 하겠습니다.
선형구조
- 자료를 표현 및 저장하는 방식이 선형(linear)이다.
- 데이터를 나란히 혹은 일렬로 저장한다.
비선형구조
- 선형구조의 반대 나란히 저장하지 않는다.
* 실무에서는 자료구조를 직접 구현하지 않고 검증된 라이브러리를 쓴다고 합니다. 그리고 이것이 합리적인 선택입니다. (저도 동감하는 바입니다.)
왜냐하면 검증 라이브러리를 쓰는것이 안전과 성능면에서 우월하기 때문이죠(코테를 공부할때 느꼈던 부분)
자료구조의 선택 기준
- 자료의 처리 시간
- 자료의 크기
- 자료의 활용 빈도
- 자료의 갱신 정도
- 프로그램의 용이성
출처:
https://andrew0409.tistory.com/148
[코인하는 프로그래머]
" 어떤 정보를 리스트와 트리구조로 저장할 수 있다고 생각하자 그렇다면 나는 어느것을 선택할 것인가 ..? "
해당 명제를 해결하기 위해선 각각의 자료구조의 특성을 잘 이해하고 있어야 합니다. 그래야 필요에 맞게 쓸 수 있기 때문입니다.
그리고 선택을 하는데 있어서 자료구조의 구현 능력은 그리 중요하지 않을 수도 있습니다.
하지만 책에 나온내용과 같이 " 자료구조의 구현 경험은 프로그래밍 능력을 향상시켜 줄 것이다 " 2000% 동의하는 바입니다.
그렇기 때문에 저도 공부하는 것이죠
자료구조와 알고리즘
사실 저도 자료구조와 알고리즘의 개념 자체를 헷갈려 했습니다. 찾아보면 금방 나오는것을 알려고도 하지 않았죠(반성중...) 그렇지만 이제부터 다시 바로잡으려 합니다.
자료구조
- 데이터의 표현 및 저장법
알고리즘
- 표현 및 저장된 데이터를 대상으로 하는 문제의 해결 방법
해당 코드는 자료구조적 측면입니다.
int arr[10] = {1,2,3,4,5,6,7,8,9,10}; // 자료구조적 측면
해당 코드는 알고리즘적 측면입니다.
// 알고리즘적 측면
// 배열에 저장된 모든 값의 합을 구하는 알고리즘
for(int i=0;i<10;i++){
sum += arr[i];
}
이와 같이 자료구조가 결정되어야 그에 따른 효율적인 알고리즘을 결정할 수 있습니다. (자료구조와 알고리즘은 밀접한 관계를 갖는다.)
과연 자료구조가 배열이 아니었어도 반복문과 인덱스 값을 이용한 순차적 접근이 가능할까...? 이것은 배열이 아니면 달라져야 합니다. 더 합리적이고 타당한 방법으로 !!
쌓여있는 상자중에 머그컵이 들어있는 상자를 찾아보자.
쌓여있는 상자 : (자료구조)
머그컵을 찾는 문제 해결 : (알고리즘)
??? : 머그컵이 있을거 같은 상자를 꺼내 찾아보면 되지 않나 ㅋㅋㅋ (윤성우님 각색해봤습니다...ㅎㅎ)
(이러신분은 없을겁니다.)
핵심은
* 자료구조에 따라 알고리즘은 달라진다 => 저장방식에 따라 문제해결법은 달라진다
* 알고리즘은 자료구조에 의존적이다
* 우리는 문제 해결을 위해 타당한 방법을 생각해야한다 ...
이것입니다.
알고리즘 성능 분석 방법
- 이제 본 내용을 들어가기 전 마지막 단계입니다.
- 수학이 없어도 알고리즘 학습은 가능합니다. 하지만 있으면 더많은 의미를 부여하여 학습할 수 있습니다.
윤성우님의 열혈자료구조에서는 지수식 로그식만 알고 있어도 이해할 수 있게 풀이하셨습니다.
(긴장 !! 저는 수포자입니다.)
지수식, 로그식에 대한 기본 정의 : https://m.blog.naver.com/freewheel3/220853009691
* 모르시는 분들은 저기에서 한번 쑥 훑고 오세요.
해당 그림은 좌표평면상으로 지수식, 로그식을 표현한 그래프 입니다.
시간 복잡도와 공간 복잡도
아래를 한번 보시죠
" 잘동작하는것은 물론 좋은 성능까지 보장 받길 원함 "
" 자료구조와 알고리즘을 평가할 수 있어야함. "
" 모든 경우에서 항상 우월하고 만능키와 같은 자료구조와 알고리즘은 존재하지 않음 "
- 어떤 알고리즘이 어떤 상황에서 더 빠르고 또 느린가
- 어떤 알고리즘이 어떤 상황에서 메모리를 적게쓰고 또 많이 쓰나?
이렇듯 하나는 속도 하나는 메모리 사용량으로 성능을 평가합니다.
(속도 : 알고리즘의 수행시간 분석결과) > 시간 복잡도
(메모리 사용량 : 메모리 사용량 분석결과) > 공간 복잡도
메모리를 적게 쓰고 속도도 빨라야 최적의 알고리즘이라고 할 수 있습니다.
그런데 일반적으로는 메모리보단 실행속도를 우선시 하죠
* 특정 알고리즘에 대해서는 메모리도 고려되지만 이미 검증이 끝난 알고리즘의 적용 고려는 속도에 초점을 둡니다.
아.. 아니 그럼 속도는 어떻게 측정하죠 ...?
이것은 직접 저희가 시계를 들고 초 분으로 시간을 재고 기록해야 합니다 (맞는 소리입니다. 쳐맞는,, 각색입니다)
- 처리해야 할 데이터 양의 변화에 따른 속도의 증가 및 감소의 정도도 알아야 합니다.
- 알고리즘 수행속도 평가
* "연산 횟수 세기", "처리해야 할 데이터의 수 n에 대한 연산횟수의 함수 T(n) 구성"
말 그대로 연산횟수를 통해 알고리즘 빠르기를 판단합니다 => 횟수가 적어야 빠르다 !
즉, 알고리즘 별 연산횟수를 함수 T(n)의 형태로 구성하면 그래프를 통해 데이터 수의 변화에 따른 연산 횟수의 변화정도를 한눈에 파악 가능합니다.
아래 그림을 그려봤습니다.
위 그래프에 따른 시나리오 입니다. (책 내용을 인용했습니다.)
해당 그래프로 추측할 수 있습니다.
A : 데이터 수가 적으면 알고리즘 B가 더 빠르네?
B : 아 그럼 데이터 수가 늘어나면 알고리즘 A가 더 빠르겠다.
C : 데이터의 수가 적은 경우에는 알고리즘 B를 적용하고 많으면 A를 적용해야 합니다.
- 나름 합리적인 판단입니다. 중요한 것은 데이터수가 많아짐에 따른 연산횟수 증가 속도입니다.
A : 오 그럼 알고리즘 A가 좋네요?
- 그것은 사실입니다.
B : 그럼 알고리즘 B는 없앨까요?
- 큰일나는 소리입니다. A와 같이 안정적인 것은 B에 비해 구현난이도가 높습니다.
따라서, 데이터 수가 많지 않고 성능에 덜 민감한 경우라면 구현의 편의를 이유로 B를 선택하기도 합니다.
A, B : 엥 그럼 알고리즘 분야는 정답이 없나요 ? (부들부들 ....)
- 그것이 아니고 상황에 맞게 답을 내려야 합니다.
A, B : (삐익)
위에서 알 수 있듯 결론적으로
알고리즘 구현 능력에만 관심을 두는 것이 아닌, 종합적으로 사고하고 판단하는 능력이 중요하다
여기까지 책 안에서의 인트로였습니다.
구구절절 이론 내용만 적었는데요 복습겸 적는거라 노트에 정리된 내용을 옮겼습니다.
저는 첫 자료구조 서적을 윤성우의 열혈 자료구조로 시작해서 블로그 포스팅도 그렇게 되었는데요 다른 블로그 분들의 자료구조 내용들도 참고하면서 공부했습니다. 정말 많은 도움이 됩니다.
참 그리고 광고받거나 이런거 절대 아닙니다 .....
'자료구조' 카테고리의 다른 글
빅-오 표기법(Big-oh Notation) (0) | 2021.08.13 |
---|---|
이진 탐색 알고리즘(Binary Search) - 2(시간복잡도) (0) | 2021.08.12 |
이진 탐색 알고리즘(Binary Search) - 1 (0) | 2021.07.26 |
순차탐색 알고리즘 시간복잡도 평균적인 경우(Average case) (0) | 2021.07.26 |
순차탐색 알고리즘과 시간 복잡도 분석의 핵심요소 (0) | 2021.07.22 |