일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- request.path
- 클린 코드
- 글자 수
- request.GET
- 클린코드
- 선택 정렬
- queryset filter
- 정렬
- 효울적
- 자료구조
- 복수 외래키
- django
- is_ajax() not working
- Proxy_pass
- Djnago CSRF
- 알고리즘
- HTTP
- Trre heap
- 클린코드-함수
- django 시작하기
- render html
- CleanCode
- nginx
- reCAPTCHA V2
- 트리란
- check ajax
- Django Ajax
- 포맷팅
- 버블 정렬
- queryset
- Today
- Total
Yang 코딩 공부
5. 알고리즘의 복잡도 본문
알고리즘 복잡도란 해당 문제를 해결하는데 있어서 얼마나 많은 자원을 사용하는가를 나타낸다
이는 둘로 나뉜다
- 시간 복잡도 (Time Complexity)
- 문제의 데이타 크기와 이를 해결하는 데 걸리는 시간 사이의 관계
- 공간 복잡도 (Spzce Complexity)
- 문제의 크기와 이를 해결하는 데 필요한 메모리 공간 사이의 관계.
시간 복잡도를 알아 볼건데 이는 크게 둘로 나눈다.
- 평균 시간 복잡도 (Average Time Complexity)
- 임의의 입력 패턴을 가정했을 때 소요되는 시간의 평균
- 최악 시간 복잡도 (Worst-case Time Complexity)
- 가장 긴 시간을 소요하게 만드는 입력에 따라 소요되는 시간
복잡도를 흔하게 쓰는 표기법이 있는데
Big-O Notation
점근 표기법 (asymptotic notation) 의 하나로 어떤함수의 증가 양상을 다른 함수와의 비교로 표현한다.
O(logn), O(n), O(n^2), O(2^n) 등으로 표기한다.
수학적인 정의로 잘 나타내져 있지만 프로그래밍 입장에서 바라본다면
-> 입력의 크기가 n 일 때
O(logn) - 입력의 크기의 로그에 비례하는 시간 소요한다는 뜻
O(n) - 입력의 크기에 비례하는 시간 소요한다는 뜻
선형 시간 알고리즘 - O(n)
n개의 무작위로 나열된 수에서 최댓값을 찾기 위해 선형 탐색 알고리즘을 적용
L = [3,8,2,7,10,9]
가 있다고하면 최대값을 찾기위해서 끝까지 살펴봐야 알 수 있다.
따라서 Average case : O(n), Worst-case: O(n)으로 n에 비례하는 선형 시간 알고리즘임을 할 수있다.
로그 시간 알고리즘 - O(logn)
n 개의 크기 순으로 정렬된수에서 특정 값을 찾기 위해 이진 탐색 알고리즘을 적용 ( 선형 시간 알고리즘 보다 복잡도가 낮다 )
이차 시간 알고리즘 - O(n^2)
삽입 정렬(insertion sort)
회색은 이미 정렬되어 삽입된 것 흰색은 정렬되지 않고 삽입 예정인 주어진 리스트
Bast case : O(n) -> 모든 원소들이 이미 정렬되어 주어진 경우
Worst case : O(n^2) -> 모든 원소들이 정렬되지 않은 경우
보다 나은 (낮은) 복잡도를 가지는 정렬 알고리즘
병합 정렬(merge sort) - O(nlogn) 가 존재
알고리즘 순서
1. 정렬할 데이터를 반씩 나누어 각각 정렬시킨다. O(logn)
2. 정렬된 데이터를 두 묶음씩 한데 합친다 (작은 수를 앞 큰수를 뒤). 이과정을 반복하면 정렬 완료 O(n)
-> O(nlogn)
참고 : 입력 패턴에 따라 정렬 속도에 차이가 잇지만 정렬 문제에 대해 O(nlogn) 보다 낮은 복잡도를 갖는 알고리즘은 존재할 수 없음이 증명되어 있다.
복잡한 문제 - 배낭 문제 (Knapsack Problem)
배낭에는 15키로만 담을 수 있고 서로 다른 가치와 무게를 가진 아이템이 있다고 할때 어떤 물건들을 담아야 가장 높은 가치를 가지는지를 푸는 문제
'자료구조' 카테고리의 다른 글
7. 연결 리스트 2 (0) | 2022.08.11 |
---|---|
6. 연결 리스트 (Linked Lists) (1) (0) | 2022.07.21 |
4. 재귀 알고리즘 응용 (0) | 2022.07.20 |
3. 재귀 알고리즘 기초 (0) | 2022.07.20 |
2. 정렬(Sort), 탐색(Search) (0) | 2022.07.19 |