分治算法(Divide and conquer algorithms):分而治之。
- 将要解决的问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题
- 求解各个子问题,由于各个子问题和原问题的形式相同,只是规模较小,因此当子问题划分的足够小时,我们就可以用较为简单的方法去解决.
- 按照原问题的要求,将子问题的解逐层的合并构成原问题的解.
1 归并排序
from heapq import mergedef 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 arrayelse:middle = len(array) // 2left = merge_sort(array[:middle])right = merge_sort(array[middle:])return list(merge(left, right))
def merge_sort(lst):if len(lst) <= 1:return lstdef 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 mergedmiddle = 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 = 0max_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 = 0return max_sum
2.2 分治法
def max_sub_array(nums):"""分治法"""if not nums:returnif len(nums) == 1:return nums[0]middle = len(nums) // 2left_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, 0for 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:returnif 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 = 0high = len(array) - 1while low <= high:mid = (low + high) // 2guess = array[mid]if guess == item:return midif guess > item:high = mid - 1else:low = mid + 1return -1
