原文地址 http://www.daileinote.com/computer/math/09
搜索算法主要有:
- 线性搜索(linear search)
- 二分查找(binary search)
- 跳跃搜索(jump search)
- 插值搜索(interpolation search)
- 指数搜索-指数二分搜索(exponential search)
- 三分搜索(ternary search)
线性搜索数组无需排序时间复杂度为 O(n)
二分查找数组需要排序,时间复杂度为 O(log₂n)
跳跃搜索数组需要排序,最优的跳跃块为 √ n,时间复杂度为 O(√ n),时间复杂度在 线性搜索和二分查找之间,二分查找优先选择,只有一种情况可以考虑跳跃搜索,即被搜索的数大多数情况下是最小元素或者比最小元素还要小(其实二分查找可以在开头判断一下即可),所以跳跃搜索大多数场景可被二分查找替换。
插值搜索数组需要排序,是二分查找的优化版,在元素均匀分布的情况下(即数组各个元素之间相差不多比如 {5,10,15,20,25,30}这种情况下效率极高时间复杂度接近于O(1)),时间复杂度为 O(loglogn),在最差的情况可以为 O(n),下面是方程式
// The idea of formula is to return higher value of pos
// when element to be searched is closer to arr[hi]. And
// smaller value when closer to arr[lo]
pos = lo + [ (x-arr[lo])*(hi-lo) / (arr[hi]-arr[Lo]) ]
arr[] ==> Array where elements need to be searched
x ==> Element to be searched
lo ==> Starting index in arr[]
hi ==> Ending index in arr[]
(x-arr[lo]) / (arr[hi]-arr[Lo]) <= 1 即 ( (x-arr[lo]) / (arr[hi]-arr[Lo]) ) * (hi - lo) <= hi - lo
指数搜索数组需要排序,思想为以1开始,跟目标数值对比,然后继续2,然后是4,然后是8...直到确定要查找的数值在 i/2 和 i 之间,然后在 i/2 和 i 之间利用二分查找来确定。两种情况下比二分查找更适用:
1.被搜索的数组的元素个数非常大,接近于无穷,比如求方程式 f(x) = x^2 - 10*x - 20 当f(x)返回值为正数时x的最小值。
2.搜索的值里跟数组的第一个元素很近。
三分搜索可被二分查找替代