Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一个数组中有多少个数字小于给定的数字?_C++_C - Fatal编程技术网

C++ 一个数组中有多少个数字小于给定的数字?

C++ 一个数组中有多少个数字小于给定的数字?,c++,c,C++,C,天真的是O(n)。是否有一个是O(logn)或甚至O(1) 排序数组怎么样?使用二叉搜索树怎么样 我的数组大小为n=[2^(h+1)]− 1 ? // h=未排序的完整二叉树的高度 如果数组没有排序,那么就不能比O(n)做得更好。证明:假设你没有查看数组中的每个元素,那么对手可以将你没有查看的元素中的一个元素设置为大于或小于给定的数字,从而使你的计数不正确。所以,比O(n)好是不可能的 已排序 如果数组已排序,则可以通过查找大于或等于给定数字的第一个元素,然后简单地从数组大小中减去该索引来确定O

天真的是O(n)。是否有一个是O(logn)或甚至O(1)

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

我的数组大小为n=[2^(h+1)]− 1 ? // h=未排序的完整二叉树的高度 如果数组没有排序,那么就不能比O(n)做得更好。证明:假设你没有查看数组中的每个元素,那么对手可以将你没有查看的元素中的一个元素设置为大于或小于给定的数字,从而使你的计数不正确。所以,比O(n)好是不可能的

已排序

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

如果未排序,则不能比O(n)做得更好。决赛

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

例如,以一个排序数组a[n]为例,其中a[0]=x,a[n]=y,阈值为v。 不是在n/2处将阵列平分,而是[n*(v-x)/(y-x)]
对于常规布局(a[i]=const1*i+const2),得到的结果是O(1),一次命中+舍入错误,因此最坏情况下为2。使用“白噪声”随机布局(所有值都具有相同的概率),仍然比O(log(n))快得多

它开始看起来很像家庭作业了……你是在问吗?或者你自己也探讨过这个问题吗?实际上,看起来像是一个面试问题;经典。@caf如何——您仍然可以对此进行二进制搜索。为了改进Micheal所说的,最好的结果是进行二进制搜索,搜索与给定元素相等的元素,然后向上迭代数组,直到达到一个大值。@Grue如果进行二进制搜索,则不需要向上迭代数组。您只需要知道其中的元素数。@Grue:不,您可以做得比“向上迭代直到达到一个大值”更好。例如,
std::lower_bound
是O(lg n),无论相等值的范围有多大。