搜索算法

原文地址 http://www.daileinote.com/computer/math/09

搜索算法主要有:

  1. 线性搜索(linear search)
  2. 二分查找(binary search)
  3. 跳跃搜索(jump search)
  4. 插值搜索(interpolation search)
  5. 指数搜索-指数二分搜索(exponential search)
  6. 三分搜索(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.搜索的值里跟数组的第一个元素很近。

三分搜索可被二分查找替代

实例请参考 http://www.daileinote.com/computer/math/09

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值