-
[n524] 알고리즘 (2)AI 부트캠프 2022. 1. 28. 10:21
Divide and Conquer(분할 정복) 방법
- 분할과 정보는 큰 문제를 작은 단위로 나눠서 푸는 알고리즘 방법이다.
- 재귀 호출과의 차이점은 재귀의 경우 같은 함수 코드를 재호출 하는 것이며, 분할 정복은 비슷한 작업을 재진행 하는 점이다. 즉, 분할 정복은 같은 함수 코드를 재호출 하는 것은 아닐 수 있다.
- 문제 분할을 스텝 1~5 방향으로 했다면, 문제 해결은 스텝 5~1 방향으로 되어야 한다. 즉 문제를 분할 하는 과정과 해결하는 과정이 있다.
퀵정렬과 병합정렬(Quick Sort and Merge Sort)
- 둘 다 분할과 정복 (divide and conquer) 개념으로 문제를 해결한다.
- 보통, 퀵 정렬이 병합 정렬 시간 복잡도는 둘 다 O(nlogn)이다.
- 퀵 정렬은 좌 우로 나눠서 재귀적으로 수행하기 때문에 병합 정렬보다 빠르다.
- 캐시를 덜 활용하고 하드웨어적으로 효율적이다.
- 불안정 정렬의 대표적인 경우이다.
- 퀵소트도 분할정복(divide and conquer)을 통해 정렬하고, 재귀적으로 수행을 하기 때문에 더 빠르다.
- 퀵 소트는 불균형한 구조에서는 최악의 성능을 보인다. 성능 편차가 다르니 때문에 실무에서는 잘 사용되지 않는다.
- 병합 정렬은 divide and conquer 로직으로, 전체 데이터의 처음과 끝을 계속 탐색하기 때문에 퀵 정렬보다 느리다.
퀵 정렬 (Quick Sort)
- 이상적인 경우
- 최악의 경우 (불균형)
# 퀵소트 파이썬 코드 case - 1 : 재귀적으로 해결 def quick_sort(node, first, last): def partition(first,last): pivot = node[last] left = first #print(pivot, first,last) # 확인용 for right in range(first, last): if node[right] < pivot: node[left], node[right] = node[right], node[left] left += 1 node[left], node[last] = node[last], node[left] return left # 첫번째 노드가 마지막 노드보다 작은 경우, 재귀진행 if first < last: pivot = partition(first, last) quick_sort(node, first, pivot - 1) quick_sort(node, pivot + 1, last) node = [54,26,93,17,77,31,44,55,20] quick_sort(node,0,8) print(node)
# 퀵소트 파이썬 코드 case - 2 : List comprehension 사용 def quick_sort(ARRAY): ARRAY_LENGTH = len(ARRAY) if( ARRAY_LENGTH <= 1): return ARRAY else: PIVOT = ARRAY[0] GREATER = [ element for element in ARRAY[1:] if element > PIVOT ] LESSER = [ element for element in ARRAY[1:] if element <= PIVOT ] return quick_sort(LESSER) + [PIVOT] + quick_sort(GREATER) ARRAY = [54,26,93,17,77,31,44,55,20] print(quick_sort(ARRAY))
GitHub - DAWUNHAN/algorithms-and-dataStructure: Algorithms and DataStructure with Python
Algorithms and DataStructure with Python. Contribute to DAWUNHAN/algorithms-and-dataStructure development by creating an account on GitHub.
github.com
병합 정렬 (Merge Sort)
서비리스트를 최소한으로 나눈 뒤, 비교 -> 정렬 -> 교환을 반복한다.
총 정리
'AI 부트캠프' 카테고리의 다른 글
[n532] Graph (0) 2022.02.07 [n531] 해쉬 테이블 (0) 2022.02.04 [n523] 알고리즘 (0) 2022.01.27 [n522] Data Structure (2) (0) 2022.01.26 [n521] Data Structure (0) 2022.01.25