在排序数组中找到[i] = i的最有效方法是什么?

时间:2012-11-29 19:00:21

标签: c++ c algorithm search

给定数组a[],确定至少一个元素i是否满足条件a[i] == i的最有效方法是什么?

数组中的所有元素都是有序且不同的,但它们不一定是整数类型(即它们可能是浮点类型)。

5 个答案:

答案 0 :(得分:4)

在最坏的情况下,你不能做比检查每个元素更好的事情。 (想象一下a[i] = i + uniform_random(-.25, .25)之类的内容。)您需要一些关于输入内容的信息。

答案 1 :(得分:1)

实际上我会从最后一个元素开始,并进行基本检查(例如,如果你有1000个元素,但最高为100,你知道你只需要检查0..100)。在最糟糕的情况下,您仍然需要检查每个元素,但找到可能的区域应该更快。如果它如上所述(a [i] = i + [-0.25..0.25]),你就是f($!ed并且需要搜索每一个元素。

答案 2 :(得分:0)

对于已排序的数组,您可以执行插值搜索。与binary search类似,但假设值均匀分布,可以更快。

答案 3 :(得分:0)

我认为这里的主要问题是你的冲突陈述:

  

a [i] ==

     

数组中的所有元素都是排序且不同,它们不一定是整数

如果数组的值等于其访问下标,则表示它是一个整数。如果它不是整数,并且它们说.. char,那么什么被认为是“排序的”? ASCII值(A < B < C)?

如果是一系列字符,我们会考虑:

a[i] == i
如果

是真的

i == 65 10 &amp;&amp; a [i] =='A'

如果我在这次采访中,我会在回答问题之前给面试官提供跟进问题。那说......

如果我们所知道的只是你所说的,我们可以肯定地说我们可以在O(n)中找到值,因为这是完成数组一次完整传递的时间。有了更多细节,我们可以通过二进制搜索数组将其限制为O(log(n))。

答案 4 :(得分:0)

注意到数组中的所有元素都是已排序且不同,所以如果我们用数组中的b [i] = a [i] -i,元素构造一个新数组b b也是排序,我们需要找到的是在数组b中找到零。我认为二分搜索可以解决问题!这是一个link,用于计算排序数组中出现的次数。你也可以做类似的Divide&amp;在原始数组上征服技术而不构造辅助数组!时间复杂度为O(Logn)!

Take this as an example:
a=[0,1,2,4,8]
b=[0,0,0,1,4]
What we need to find is exactly index 0,1,2

希望它有所帮助!