数组的元素按非递减顺序排列。我需要在最短的时间内搜索数组中的给定元素。
答案 0 :(得分:2)
使用binary search查找。
答案 1 :(得分:2)
由于数组已排序,您可以使用Binary Search。
linear
搜索将花费O(n)
时间,因为它不会使用已排序的属性。但binary
次搜索需要O(log n)
次。
答案 2 :(得分:0)
如果你所知道的是数组是按非递减顺序排序的,那么你可以做得比保证O(log N)
性能的二进制搜索更好(正如其他海报所指出的那样)。
如果您可以假设数组中数字的分布相当均匀,那么interpolation search可以在平均情况下提供O(log log N)
性能,这比二进制搜索更好。 (但是,在最坏的情况下 - 一个指数增长的数组 - 它是O(N)
)。
答案 3 :(得分:0)
好吧,如果你需要比二元更好,你可以使用像牛顿搜索这样的启发式算法,它是二元搜索的衍生物,具有移动的分割边界 - 每次值更大时,增加步长,如果它更小,减少它。
split = 0.5;
while(1)
{
point = lower+split*(upper-lower);
if(x>a[point])
{
lower = point;
split*= 1.2
}
else if(x<a[point])
{
upper=point;
split /=1.2
} else break;
}
对于具有多项式布局和未绑定集的集合,这应该会产生更好的结果。随机或线性布局会产生更糟糕的结果。如果没有适当的保护措施,这也会导致分裂增长超过1。