위로
아래
프로그래밍의 본질
프로그래밍의 본질 : 알고리즘적 사고와 프로그래밍 언어의 문법으로 문제를 해결하는 것. 코딩은 단지 언어일 뿐.
좋은 알고리즘
좋은 알고리즘의 기준
- 알고리즘은 명확하며 모호하지 않아야 한다.
- 단순하고 직관적이어야 하다.
- 다른 프로그래머들이 모를만한 난해한 기술은 쓰지 않는다.
데이터
데이터 : 컴퓨터에 저장되어 있거나 컴퓨터가 가공 및 처리하는 모든 것
정보 : 가공이나 처리가 끝난 데이터.
데이터 구조 : 데이터를 구성하고 저장하는 방법. 데이터를 식별하는 방법을 제공하고 데이터의 관계를 보여준다.알고리즘이 데이터를 빠르게 사용할 수 있도록 데이터의 구조를 단순화시켜놓아야 한다.
알고리즘 : 정해진 순서대로 문제를 해결하는 논리적인 절차.
컴퓨터는 데이터를 입력 받고 처리 과정을 가진 후 출력한다. 올바른 데이터를 입력했으나 무의미한 출력이 나올 경우는 2가지다.
- 알고리즘이 잘못되어서 문제 해결 과정에서 오류가 난다.
- 처리할 데이터의 관리가 제대로 이루어지지 않아 오류가 난다.
알고리즘 설계와 분석
알고리즘을 설계하는 것과 분석하는 것은 별개의 과정.
- 알고리즘 설계의 세 가지 유형
- 분할 정복 알고리즘 ( divide and conque algorithm) : 큰 문제를 여러 개의 작은 문제로 나눠 해결하고 결과를 결합해 하나의 해결 방법을 얻는 알고리즘.
- 탐욕 알고리즘 (greedy algorithrm) : 근사치 알고리즘. 해당 순간의 최상의 결정(가장 적합한 동작)을 내려서 결과적으로 모두 종합했을 때 전체 문제의 최상의 결정에 가까운 결론을 내리는 알고리즘. (방문 판매원 문졔)
- 동적 프로그래밍 ( Dynamin programming) : 최적화 알고리즘. 과거에 내린 결정이 앞으로의 결정에 영향을 주는 알고리즘. 문제를 해결하는 다양한 해결 방법을 찾아서 저장한 후, 나중에 재사용 한다. (음성인식, 유전자 염기서열 분석, 연쇄 행렬 곱셈에 주로 사용)
- 알고리즘 분석
- 시간 복잡도 (time complexity) : 알고리즘이 문제를 해결할 때 걸리는 시간. 알고리즘의 성능이 얼마나 효율적인지 알 수 있는 가장 일반적인 방법.
- 시간 복잡도를 측정하는 실제적인 방법 : 입출력 데이터의 양이 알고리즘 동작에 미치는 영향을 관찰, 기록하는 것. 그러나 정확성이 떨어지고 사용 범위가 제한적이다.
- 시간 복잡도를 측정하는 수학적인 방법 : 점근적 분석. 알고리즘의 성능이 최악이 되는 경계를 판단하거나, 알고리즘의 평균 성능을 찾는다. 알고리즘 사이의 점근적 증가율을 비교하기 위해 빅 오 표기법을 사용한다. 실제적인 방법보다 시간을 절약할 수 있다.
- 공간 복잡도 (space complexity) : 알고리즘이 문제를 해결할 때 점유하는 컴퓨터의 메모리 공간. 널리 쓰이지는 않고, 자원이 제한된 시스템에서 동작하는 프로그램을 구현하는 등 특별한 경우에 사용하는 방법.
- 시간 복잡도 (time complexity) : 알고리즘이 문제를 해결할 때 걸리는 시간. 알고리즘의 성능이 얼마나 효율적인지 알 수 있는 가장 일반적인 방법.
빅 오 표기법
빅 오 표기법 특징
- O : 시간 복잡도의 정도를 나타내는 복잡도의 차수
- 알고리즘을 실행하는데 걸리는 최대 시간을 측정.
- 알고리즘의 실행 시간이 최악인 경우를 나타내는 방법.
빅 오 표기법 종류 ( 위에서부터 알고리즘 성능이 좋은 순)
- O(1) : 상수형 알고리즘. 데이터 입력량과 무관하게 실행시간이 일정.
- O(logn) : 로그형 알고리즘. 시간이 선형적으로 증가하면 n이 기하급수적으로 증가. 데이터 입력량이 늘어날수록 단위 입력당 실행시간이 줄어든다.
- O(n) : 선형 알고리즘. 데이터 입력량에 비례하여 실행 시간이 늘어난다.
- O(nlogn) : 선형-로그형 알고리즘. 데이터 입력량이 n배 늘어나면 실행 시간이 n배 조금 넘게 늘어난다.
- O(n^2) : 2차 알고리즘. 데이터 입력량의 제곱에 비례하여 실행 시간이 늘어난다.
- O(2*n) : 지수형 알고리즘. 데이터 입력이 추가될 때마다 실행 시간이 2배로 늘어난다.
- O(n!) : 팩토리얼(계승)형 알고리즘. 데이터 입력이 추가될 때마다 실행 시간이 n배로 늘어난다.
재귀
재귀
- 재귀함수 : 자기 자신을 호출하는 함수. 특정 조건을 충족할 때까지 끊임없이 동작한다.
- 최대 재귀 깊이(maximum recursion depth) : 컴퓨터의 가용 메모리를 한계까지 호출한 재귀함수의 횟수
- 스택 오버플로 에러 (stack overflow error) : 최대 재귀 깊이를 초과해 발생한 에러
- 반복과는 다르다