具有递增整数数组的高效算法

时间:2014-08-02 21:45:55

标签: arrays algorithm search bisection

我一直在自学自己的python中的数据结构,不知道我是否过度思考(或解密!)以下问题:

  • 我的目标是提出一种有效的算法

  • 使用该算法,我的目标是确定是否存在一个整数,使A [i] = i在增加的整数数组中

  • 然后我想找一个big-O表示法的运行时间作为n的长度的函数?

所以这不会只是O(log n)的略微修改版本,其功能相当于:f(i)= A [i] - i。我读这个问题错了吗?任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:3)

注1:因为你说整数正在增加,你已经排除了数组中有重复(否则你会说单调增加)。因此,如果第一个元素大于1,则快速检查将排除是否没有解决方案。换句话说,为了有任何解决方案的机会,第一个元素必须是< = 1。

注2:类似于注1,如果最后一个元素是<数组的长度,然后没有解决方案。

总的来说,我认为你能做的最好的就是二元搜索。您将它捕获在低指数和高指数之间,然后检查低指数和高指数之间的中间指数。如果array [middle]等于middle,则返回yes。如果它小于中间,则将左侧设置为中间+ 1。否则,将右侧设置为中间 - 1.如果左侧变为>对,返回号码。

运行时间为O(log n)。

编辑:如果允许单调增加,算法不起作用。练习:解释原因。 : - )

答案 1 :(得分:0)

  • 你是对的。在i大小的数组中查找元素A的确是O(Log A)

  • 但是,你可以做得更好:O(Log A) -> O(1)如果你为时间复杂度交换内存复杂性,那就是"优化器"倾向于这样做。

我的意思是:如果你插入新的数组元素到"高效"哈希表,您可以在常量时间find

中实现O(1)函数

这很大程度上取决于您要插入的元素:

  • 他们是独一无二的吗?想想碰撞
  • 您多久insert

答案 2 :(得分:0)

这是一个有趣的问题:-)

您可以使用二分法找到a[i] == i

的位置
       0  1  2  3  4  5  6
a = [-10 -5  2  5 12 20 100]

When i = 3,   i < a[i],  so bisect down
When i = 1    i > a[i],  so bisect up
When i = 2    i == a[i], you found the match

运行时间 O(log n)