quick_select
, MoM
알고리즘 모두 분할 정복 알고리즘def power1(a, n):
if n == 1:
return a
return a * power1(a, n - 1)
2. 이진 재귀 호출
def power2(a, n):
if n == 1:
return a
if n == 0:
return 1
if n % 2 == 0:
return power2(a, n // 2) * power2(a, n // 2)
return power2(a, n // 2) * power2(a, n // 2) * a
3. 더 빠른 이진 재귀 호출
def power3(a, n):
if n == 0:
****return 1
x = power3(a, n // 2)
if n % 2 == 0:
return x * x
return x * x * a
n
개의 숫자가 저장된 리스트 A
에서 어떤 값 x
가 리스트에 있는지 없는지 $O(logn)$에 알 수 있는 방법
x
와 리스트 A
의 가운데 값 A[(i+j)/2]
를 비교하여 범위를 반으로 줄이는 방법x
의 존재 여부 결정 가능def binary_search(A, i, j, x):
if i > j: # 탐색 범위 내에 없다
return None
m = (i + j) // 2 # 중간 인덱스
if x == A[m]: # x 발견
return m
elif x < A[m]: # 왼쪽 반 탐색
return binary_search(A, i, m - 1, x)
else: # 오른쪽 반 탐색
return binary_search(A, m + 1, j, x)