分治算法(Divide and conquer algorithms):分而治之。
- 将要解决的问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题
- 求解各个子问题,由于各个子问题和原问题的形式相同,只是规模较小,因此当子问题划分的足够小时,我们就可以用较为简单的方法去解决.
- 按照原问题的要求,将子问题的解逐层的合并构成原问题的解.
1 归并排序
from heapq import merge
def merge_sort(array: list):
"""归并排序
Example:
>>> myArray = [36, 25, 48, 12, 25, 65, 43, 57]
>>> [12, 25, 25, 36, 43, 48, 57, 65]
"""
if len(array) <= 1:
return array
else:
middle = len(array) // 2
left = merge_sort(array[:middle])
right = merge_sort(array[middle:])
return list(merge(left, right))
def merge_sort(lst):
if len(lst) <= 1:
return lst
def merge(left, right):
merged = []
while left and right:
merged.append(left.pop(0) if left[0] <= right[0] else right.pop(0))
while left:
merged.append(left.pop(0))
while right:
merged.append(right.pop(0))
return merged
middle = int(len(lst) / 2)
_left = merge_sort(lst[:middle])
_right = merge_sort(lst[middle:])
return merge(_left, _right)
2 连续子列表的最大和
2.1 遍历法
def max_sub_array(nums):
"""遍历法,(On)
>>> myArray = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
>>> print(max_sub_array(myArray))
>>> 6
"""
one_sum = 0
max_sum = nums[0]
for i in range(len(nums)):
one_sum += nums[i]
max_sum = max(max_sum, one_sum)
if one_sum < 0:
one_sum = 0
return max_sum
2.2 分治法
def max_sub_array(nums):
"""分治法
"""
if not nums:
return
if len(nums) == 1:
return nums[0]
middle = len(nums) // 2
left_sum = max_sub_array(nums[:middle])
right_sum = max_sub_array(nums[middle:])
left_middle_sum, right_middle_sum, max_left, max_right = 0, 0, 0, 0
for i in range(middle - 1, -1, -1):
left_middle_sum += nums[i]
max_left = max(left_middle_sum, max_left)
for i in range(middle + 1, len(nums), 1):
right_middle_sum += nums[i]
max_right = max(right_middle_sum, max_right)
return max(left_sum, max_left + nums[middle] + max_right, right_sum)
2.2 动态规划
def max_sub_array(array):
""" 动态规划
"""
if not array:
return
if len(array) == 1:
return array[0]
dp = res = array[0]
for i in range(1, len(array)):
dp = max(array[i], dp + array[i])
res = max(dp, res)
return res
3 二分查找
def binary_search(array: list, item: int) -> int:
"""二分查找
Example:
>>> myArray = [1, 3, 5, 7, 9]
>>> print(binary_search(myArray, 5))
>>> 2
"""
low = 0
high = len(array) - 1
while low <= high:
mid = (low + high) // 2
guess = array[mid]
if guess == item:
return mid
if guess > item:
high = mid - 1
else:
low = mid + 1
return -1