복잡하거나 큰 문제를 여러 개로 나눠서 푸는 방법
재귀와의 차이
# 재귀 : 1부터 10까지의 합
def func(num):
if num < 1:
return 0
else:
return num + func(num-1)
func(10)
# 분할정복 : 1부터 10까지의 합
def func(num):
if num == 1:
return 1
if num % 2 == 1:
return func(num - 1) + num
else:
return func(num / 2) * 2 + (num / 2) * (num / 2)
func(10)
퀵정렬
출처 : https://gmlwjd9405.github.io/2018/05/10/algorithm-quick-sort.html
# 퀵소트 파이썬 코드 case - 1 : 전체코드
def quick_sort(node, first, last):
def partition(first,last):
pivot = node[last]
left = first
#left는 pivot보다 작은 node들의 위치를 나타내는데 사용, 작은 노드들이 right를 통해 발견되면 한칸씩 늘려감
#print(pivot, first,last) # 확인용
for right in range(first, last): #right는 피봇을 제외한 모든 노드를 순회하기 위해 사용
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)
병합정렬
출처 : https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html
분할된 서브문제를 해결하기 위해, 반복되는 해결법을 재사용하는 기법
계산결과를 저장한다.
# 메모이제이션을 적용한 경우
memo = {} # 재사용을 값을 저장하기 위한 딕셔너리 변수
def recursive_factorial(n):
if n is 0:
return 1
elif n in memo:
return memo[n] # 메모이제이션
else:
result = n * recursive_factorial(n - 1)
memo[n] = result
return result
# 1번째 케이스
print("recursive_factorial(5):",recursive_factorial(5)," memo:", memo)
# 2번째 케이스
print("recursive_factorial(4):",recursive_factorial(4)," memo:", memo)