在最短的时间内搜索数组中的数字

时间:2010-04-23 09:51:30

标签: c

数组的元素按非递减顺序排列。我需要在最短的时间内搜索数组中的给定元素。

4 个答案:

答案 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。