分治法
把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题…直到最后子问题可以简单的直接求解。
分治法思想
- 问题的规模缩小到一定程度就可以容易解决
- 问题可以分解为若干个规模较小的相同问题
- 利用该问题分解出的子问题的解可以合并为该问题的解
- 该问题分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题
主要步骤
- 分解:将原问题分解成若干子问题
- 解决:递归的求解各子问题
- 合并:将所有子问题的解合并为原问题的解
经典题目
二分搜索
也称折半查找,是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
思路:
第一步:分解,将一个表对半拆分,直到不能再拆分的情况下,子表中会剩下三个元素,表首元素,表中元素,表尾元素。
第二步:解决,因此查找时只要递归判断这三个元素和所要查找的元素是否相等。如果相等,就返回对应序号。如果查找元素大于表中间元素,则判断子表的较大部分。反之,判断较小的子表。依次递归,直到查找出来。
package main
import "fmt"
func main() {
arr := []int{
2, 4, 7, 23, 24, 64, 67, 78, 87, 123}
index := found(64, 0, len(arr)-1, arr)
fmt.Println(index)
}
func found(num, low, high int, arr []int) int {
if arr[low] <= arr[high] {
if arr[low] == num {
return low
}
if arr[high] == num {
return high
}
mid := (low + high) / 2
if arr[mid] == num {
return mid
} else