【问题标题】:Time Complexity of binary search inside a loop循环内二进制搜索的时间复杂度
【发布时间】:2018-01-31 18:17:16
【问题描述】:


我很难确定我的解决方案的时间复杂度。
任务是找到 An 序列的 n 值 - 1, 3, 5, 11, 21, 43...

A0 = 1
A1 = 3
An = (An-1)+2*(An-2)

序列“隐藏”在排序数组中。
例如下面的数组 -
1, 2, 3, 4, 5, 11, 17、21、40、65
将返回 4,因为 A4 = 21,而 21 是出现在给定数组中的序列的最后一个数字。

对于下一个数组 -
-3, -2, 0, 10, 11, 17, 21, 60
该方法将返回 -1,因为 A0 不在数组中。

我的代码:

public static int elements(int[] arr)
{
    int i=1, j=3, k, tmp;
    int a=-1;
    tmp =indexOf(arr, i);
    if(tmp==-1)
        return a;
    a++;
    tmp=indexOf(arr,j);
    if(tmp==-1)
        return a;
    a++;
    k=(2*i)+j;
    tmp=indexOf(arr,k);

    while(tmp!=-1)
    {
        tmp=indexOf(arr,k);
        a++;
        i=j;
        j=k;
        k=(2*i)+j;
    }
     return a-1;
}

indexOf() 是 O(log n) 二进制搜索。

【问题讨论】:

  • 我不确定An 的增长率在这里是否重要,因为在最坏的情况下,数组中的所有值都对应于系列中的一个术语,因此indexOf 将是调用n + 1 次(在最后一次到达结束后返回-1)。因此复杂度只是O(n log n)。如果您的问题实际上是关于An 的增长率,Wolfram Alpha 说它是ϴ(2^n)

标签: java time-complexity binary-search


【解决方案1】:

while 循环中,搜索空间永远不会减少,因为arr 使用相同的参数indexOf。在最坏的情况下,这意味着arr 包含序列A 的开始区间,并且使用n 搜索,其中narr 中的元素数。总的来说,这会产生O(n log n) 的最坏情况运行时复杂度。

【讨论】:

  • 也许应该向 OP 解释 An 的增长率根本不重要,并且(如果这是一个家庭作业/考试问题)它可能是作为一个技巧包含在内的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多