二分查找
二分查找:时间复杂度O(log n),有序的情况下
go语言实现:
func erFen(nums []int, key, n int) int {
var low, high, mid = 0, n, 0
for {
mid = (high + low) / 2
if key < nums[mid] {
high = mid - 1
} else if key > nums[mid] {
low = mid + 1
} else {
return nums[mid]
}
if high < low {
return -1
}
}
return -1
}
一个特殊的时间复杂度:O(n! ),旅行商问题,去不同距离的的n个地方选最短路径
递归
递归和循环:二者在比较起来递归并没有性能优势,只是相对于循环的代码更加清晰,在实际使用中循环的性能要好于递归
递归函数的两部分:基线条件和递归条件
//计算n个数累加
func diGui(a int) int {
if a <= 0 { //基线条件
return 0
}
return a + diGui(a-1) //递归条件
}
调用栈:计算机在内部使用被称为调用栈的栈
分而治之
步骤:
- 找出基线条件
- 不断将问题分解,直到符合基线条件
二分查找递归版:
func erFenD(nums []int, key, low, high int) int {
if low <= high { //基线条件
mid := (low + high) / 2
if nums[mid] == key { //基线条件
return mid
} else if key > nums[mid] { //递归条件
return erFenD(nums, key, mid+1, high)
} else if key < nums[mid] { //递归条件
return erFenD(nums, key, low, mid-1)
}
}
return -1
}