Linear Search(线性搜索)
问题: 给定一个有n个元素的数组,写一个函数在数组中搜索给定元素。
Java实现
1 | class LinearSearch |
时间复杂度:
Binary Search(二分查找)
问题: 给定一个有n个元素的有序数组,写一个函数在数组中搜索给定元素。
Java实现
1 | // Java implementation of recursive Binary Search |
时间复杂度:
适用场景:有序
Jump Search(跳跃搜索)
Jump Search是用于有序数组的搜索算法。基本思想是通过以固定步长向前跳跃或跳过一些元素来代替搜索所有元素来检查更少的元素(而不是线性搜索)。
例如,假设我们有一个大小为n的数组arr[]和大小为m的块(将被跳转)。然后我们搜索索引arr [0],arr[m],arr[2m] … …arr[km]等等。一旦我们找到了间隔(arr[km] < x <arr [(k + 1)m]),我们就从索引km开始执行线性搜索操作来查找元素x。
什么是最佳跳跃步长?
在最坏的情况下,我们必须进行n/m跳转,并且如果最后一次选中的值大于要搜索的元素,我们将对线性搜索进行m-1比较。因此,最坏情况下的比较总数将是((n/m)+ m-1)
。当m =√n时,函数的值((n/m)+m-1)
最小。因此,最好的步长是m=√n。
Java实现
1 | // Java program to implement Jump Search. |
时间复杂度:
适用场景:有序
Binary Search优于Jump Search,但Jump Search有一个优势,即我们只返回一次(Binary Search可能需要高达O(Log n)个跳转)。因此,在跳回成本高昂的系统中,我们使用Jump Search。
Interpolation Search(插值搜索)
给定一个有n个均匀分布值值的有序数组,编写一个函数来搜索数组中的特定元素。
插值搜索是对二分搜索的改进,其中排序数组中的值均匀分布。二分查找总是对中间元素进行检查。插值搜索可能会根据正在搜索的值进入不同的位置。例如,如果搜索的值更接近最后一个元素,则插值搜索可能会从结尾开始搜索。
要找到要搜索的位置,它使用以下公式。
1 | 公式的想法当要搜索的元素更接近arr[hi],则返回较大的pos值, |
Java实现
1 | // Java program to implement interpolation search |
时间复杂度:
适用场景:有序、均匀分布
Exponential Search(指数搜索)
指数搜索涉及两个步骤:(1)查找元素存在的范围;(2)在上面找到的范围中进行二分查找。
如何找到元素可能存在的范围?
这个想法是从子数组大小1开始,比较它的最后一个元素和x,然后尝试大小2,然后是4,直到子数组的最后一个元素不会更大。 一旦我们找到了一个索引i(在重复了i次之后),我们知道该元素必须存在于i / 2和i之间(为什么是i / 2?因为我们在以前的迭代中找不到更大的值)
Java实现
1 | // Java program to find an element x in a |
时间复杂度:
适用场景:有序
当目标元素更靠近开始位置时,Exponential Search优于Binary Search。