01.30 알고리즘
2023. 1. 30. 19:44ㆍ개발일지
알고리즘에 대한 조건
- 알고리즘에 대한 조건
- 입력 : 외부에서 제공되는 자료
- 출력 : 적어도 2개 이상의 서로 다른 결과 출력
- 명확성 : 수행과정은 무엇을 하기 위한 것인지 명확하게 정의
- 유한성 : 알고리즘의 명령어 대로 수행했을 때 처리된 후 종료
- 효율성 : 시-공간적 효율성을 가져야 하며 명백하게 실행가능
좋은 알고리즘이란?
- 문제를 정확히 해결해야 합니다.
- 알고리즘의 가장 중요한 역할은 문제를 정확히 해결하는 것입니다.
- 빠르게 처리해야 합니다.
- 신속, 정확! 어떤 일이든 빠르고 정확하게 해결한다는 건 그만큼 시간이라는 자원을 아낄 수 있다는 뜻이며, 같은 연산도 더 빠르게 수행할 수 있게 해준다면 아주 좋은 알고리즘입니다.
- 최소의 자원으로 최대의 효율을 내야합니다.
- 문제 해결이라는 목적에 필요한 기능만 수행하면서 불필요한 자원(컴퓨터의 메모리 공간 또는 연산 시간)을 낭비하지 않는 게 좋은 알고리즘입니다.
- 단순 명료해야 합니다.
- 누구나 문제를 해결하는 과정을 보는 것만으로 쉽게 이해할 수 있어야 이 알고리즘이 어떤 문제를 어떻게 해결하는지 금세 파악할 수 있으며, 또 문제가 생겼을 때 수정하거나 보완할 수 있기 때문입니다.
시간 복잡도
- 알고리즘이 특정 크기 입력에 대한 수행 시간을 의미
- 알고리즘이 수행하는 필요 연산 횟수
정렬 알고리즘 | 시간 복잡도 |
Bubble Sort (버블 정렬) | O(n^2) |
Selection Sort (선택 정렬) | O(n^2) |
Insertion Sort (삽입 정렬) | O(n^2) |
Quick Sort (퀵 정렬) | 평균 : O(nlogn) / 최악 : O(n^2) |
Merge Sort (병합 정렬) | O(nlogn) |
Radix Sort (기수 정렬) | O(kn) / k : 최대 데이터의 자릿수 |
Arrays.sort() | 평균 : O(nlogn) / 최악 : O(n^2) |
Collections.sort() | O(nlong) |
공간 복잡도
- 공간 복잡도를 표기할 때도 빅오 표기법을 이용합니다. 일반적으로 메모리 사용량 기준은 MB 단위로 제시됩니다.
- 코딩 테스트에서 보통 메모리 사용량은 128~512MB 정도로 제한하며, 일반적인 경우 데이터의 개수가 1,000만 단위가 넘지 않도록 알고리즘을 설계해야 합니다.
수행 시간 측정 코드
///////////////////// 시간차이(밀리세컨즈) : 58 /////////////////////
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int []arr = new int [100_000_000];
for(int i=0; i<100_000_000; i++) {
arr[i] = (int) Math.random();
}
long before = System.currentTimeMillis(); //코드 실행 전 시간
//실행할 소스코드
Arrays.sort(arr);
long after = System.currentTimeMillis(); // 코드 실행 후 시간
long diff = (after - before); //두 시간에 차이
System.out.println("시간차이(밀리세컨즈) : "+diff);
}
}
///////////////// Used Memory(MB) : 511 ////////////////////
public class Main {
public static void main(String[] args) {
int []arr = new int [100_000_000];
for(int i=0; i<100_000_000; i++) {
arr[i] = (int) Math.random();
}
// Garbage Collection으로 메모리 초기화
System.gc();
// 실행전 메모리 사용량 조회
long before = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
System.out.println("Used Memory : " + before);
// 프로그램 소스코드
Arrays.sort(arr);
// Garbage Collection으로 메모리 정리
System.gc();
// 실행 후 메모리 사용량 조회
long after = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
// 메모리 사용량 측정
long usedMemory = (before - after)/1024;
System.out.println("Used Memory(MB): " + usedMemory);
}
}
'개발일지' 카테고리의 다른 글
02.01 그리디 알고리즘 1 (JAVA) (0) | 2023.02.01 |
---|---|
01.31 모의고사(JAVA) (0) | 2023.01.31 |
01.28 TIL (0) | 2023.01.28 |
01.27 TIL (1) | 2023.01.27 |
01.26 SOLID (0) | 2023.01.26 |