搜索大小为n的数组中的k个元素

时间:2016-05-13 16:20:58

标签: algorithm time-complexity

假设我得到了一个大小为n的排序数组,m是数组中的最大数字 - 因此数组中最正确的数字。 所以我想检查一下从m到m / n的所有元素是否都在数组中。 我可以在O(n)中做到吗?在尝试定位子数组并在那里搜索每个元素时,我能想到的是O(n ^ 2)。

谢谢!

3 个答案:

答案 0 :(得分:0)

是的,您可以创建一个大小为mm / n(圆形)的新位数组,然后从旧数组的右侧开始读取数字,使该数字成为新数组的合适索引,将其设置为true 。一旦你完成了通过你的旧阵列,做一个"和"在新数组的所有位之间,如果结果为真,则表示您拥有所有必需的数字,否则您不会拥有所有数字。

答案 1 :(得分:0)

您可以将数组从最后一个位置(最大值)迭代到第一个位置(最小值)并开始检查M值,如果出现该数字,则继续检查M - 1,然后是M - 2等等。

由于数组已排序,因此您不必担心任何比您当前检查的数字少的数字。

如果您在任何时候发现数组中的数字小于当前的检查号码,您可以停止,因为所有剩余的数字都会降低。

如果最后您的当前号码小于M/N,您可以说范围[M/N - M]位于数组中。

这是某种伪代码,为简单起见,我要查找MINMAX之间的数字(您只需将MAX更改为M }和MIN M/N}:

MAX: Int, MIN: Int, ARR: Int[]

K: Int = MAX

For I = Length(ARR) DOWN-TO 1
    If ARR[I] == K Then K = K - 1
    Else If (ARR[I] < K) Then Return (FALSE)

Return (K <= MIN)

正如您所见,这是O(N)因为ARR中的每个元素都被访问过一次。

答案 2 :(得分:0)

对于小k,通过二分搜索查找所有测试值,总共进行k Log(n)比较。

对于较大的k,逐渐对k个测试值进行排序,并比较两个排序列表。这将采用O(k Log(k)+ min(k,n))比较。

您还可以在哈希表中插入所有测试值,并在哈希表中查找所有输入值;这需要大约O(k + n)次操作。

相关问题