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

C 在最短时间内搜索数组中的数字,c,C,阵列的元素按非降序排列。我需要在尽可能短的时间内搜索数组中的给定元素。用于查找它。由于数组已排序,因此您可以使用 linear搜索将花费O(n)时间,因为它不使用排序属性。但是一个binary搜索需要O(logn)时间。如果你只知道数组是按非降序排序的,你就不能比保证O(logn)性能的二进制搜索做得更好(正如其他海报所指出的那样) 如果可以假设数组中的数字分布合理均匀,那么在平均情况下可以给出O(log log N)性能,这比二进制搜索要好。(然而,在最坏的情况下——一个指数增长的数组——它是

阵列的元素按非降序排列。我需要在尽可能短的时间内搜索数组中的给定元素。

用于查找它。

由于数组已排序,因此您可以使用


linear
搜索将花费
O(n)
时间,因为它不使用排序属性。但是一个
binary
搜索需要
O(logn)
时间。

如果你只知道数组是按非降序排序的,你就不能比保证
O(logn)
性能的二进制搜索做得更好(正如其他海报所指出的那样)


如果可以假设数组中的数字分布合理均匀,那么在平均情况下可以给出
O(log log N)
性能,这比二进制搜索要好。(然而,在最坏的情况下——一个指数增长的数组——它是
O(N)
)。

好吧,如果你需要比二进制更好的方法,你可以——使用启发式方法,比如牛顿搜索,它是二进制搜索的一个衍生物,移动分割边界——每次值越大,增加步长,如果它越小,减少步长

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;
}
split=0.5;
而(1)
{
点=下+分割*(上-下);
如果(x>a[点])
{
下=点;
拆分*=1.2
}

否则如果(xSniff..Sniff….我闻到了家庭作业的味道,如….增加?不,这并不意味着增加,因为元素可能像3 5 6 6 7 8….一样,是非减少的,但不是严格增加的。有什么比二进制搜索更好的吗?我的意思是在时间方面complexity@Nadeem没有比
O(logn)更好的了
here.binary search
O(logn)
哪个比
O(n)
@Nadeem
O(logn)
O(n)
惯性搜索快得多?让我看看。