【问题标题】:Finding the time complexity of code查找代码的时间复杂度
【发布时间】:2014-08-06 10:50:16
【问题描述】:

Given 是一个只包含数字 0 和 1 的无限排序数组。有效地找到过渡点。

例如:00000000000111111111111111

输出:11 是发生转换的索引

我已经为此编写了一个解决方案,忽略了一些边缘情况。

int findTransition(int start)
{
  int i;
  if(a[start]==1)return start;
  for(i=1;;i*=2)
  {  
    //assume that this condition will be true for some index
    if(a[start+i]==1)break;
  }
  if(i==1)return start+1;
  return findTransition(start+(i/2));
}

我不太确定这个解决方案的时间复杂度。有人可以帮我解决这个问题吗?

是 O(log(N)) 吗?

【问题讨论】:

  • 如果你说你的数组是无限的,那么N 是无限的,所以你的理论复杂度也是无限的。也许你应该将你的问题限制在一个合理/现实的边界......
  • 当我自己遇到这个问题时,它就是这样提出的。无限作为一个概念。所以,假设一个非常大的 N。或者,假设 a[start+i]==1 在某个有限 N 处为真。
  • 如果过渡永远不会发生,那么复杂度是多少?
  • 您可以为此构造一个简单的算法,通过将i 加倍找到pos1,然后对从pos/2pos 的转换点运行二进制搜索.
  • 如果只是大,使用二分查找。

标签: arrays performance algorithm data-structures time-complexity


【解决方案1】:

设n为过渡点的位置

这个区块

for(i=1;;i*=2)
  {  
    //assume that this condition will be true for some index
    if(a[start+i]==1)break;
  }

适用于 log2(n)

所以我们有

T(n) = log2(n) + T(n/2)
T(n) = log2(n) + log2(n/2) + T(n/4) = log2(n) + (log2(n) - 1) + (log2(n) - 2)... 
T(n) = log2(n) * (log2(n) + 1) / 2

所以有 O(log(n)^2) 复杂度(最坏的情况)

注意:您可以使用通常的二进制搜索而不是递归调用,那么您将获得 log2(n) + log2(n/2) 只是 O(log(n)) 被授予。

【讨论】:

  • 而不是递归调用,如果我对 1 进行二进制搜索,它不一定会给出第一个 1 的索引。
  • 我的意思是对转换点进行二分搜索。您检查中点,如果它 1 递归检查左半边,否则检查右半边,直到您收敛到该点。您可以在获得一些非无限范围进行搜索后使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
相关资源
最近更新 更多