数组中的数字是否小于给定数字?

时间:2010-04-26 02:18:09

标签: c++ c

天真的是O(n)。有一个是O(log n)还是O(1)?

排序数组怎么样?如何使用二叉搜索树?

我的数组的大小n = [2 ^(h + 1)] - 1? // h =完整二叉树的高度

2 个答案:

答案 0 :(得分:8)

未排序
如果数组没有排序,那么你可以做到比O(n)更好。证明:假设您没有查看数组中的每个元素,那么攻击者就可以使其中一个元素看起来不大于或小于给定数字,以使您的计数不正确。所以,优于O(n)是不可能的。

排序
如果数组已排序,那么您可以通过查找大于或等于给定数字的第一个元素,然后简单地从数组的大小中减去该索引来确定O(log n)时间的结果。

答案 1 :(得分:0)

未分类,你不能比O(n)做得更好。最终

通过排序,您可以在最坏的情况下使用二进制搜索来执行O(log(n))。现在你可以改进这一点,假设阵列布局具有不错的熵或者(大部分)是线性的,瞄准预期的点,好像布局是纯线性的。

例如,取一个排序数组a [n],其中[0] = x,a [n] = y,阈值为v。 不是将数组在n / 2处二等分,而是测试[n *(v-x)/(y-x)]的元素 使用常规布局(a [i] = const1 * i + const2),得到O(1)中的结果,一次命中+ - 舍入误差,所以最差2.使用“白噪声”随机布局(所有值同样可能) ,你得到它仍然比O(log(n))快得多。