平均情况下的算法分析

时间:2012-11-02 18:53:11

标签: algorithm complexity-theory calculus

我正在尝试解决一个非常简单的算法分析(对我来说显然不是那么简单)。

算法是这样的:

int findIndexOfN(int A[], int n) {
// this algorithm looks for the value n in array with size of n.
// returns the index of n in case found, otherwise returns -1.
// it is possible that n doesn't appear in the array.
// n appears at most one time.
// the probability that n doesn't appear in the array is $1/(n+1)$
// for each cell in the array, the probability that n is found in index i
// is $1/(n+1)$


    int index, fIndex;
    index = 0;
    fIndex = -1;
    while (index < n && fIndex == -1) {
      if(A[index] == n) {
        fIndex = index;
      }
      index++;
    }
    return fIndex;

 }

现在我正在尝试计算平均运行时间。我认为这是几何系列,但我找不到合并术语概率和复杂性的方法。

例如,我知道如果在索引1中找到值n,则需要1个循环步骤来获取第二个索引(1)并找到n。

另一方面,概率给了我一些分数......

这是我到目前为止所得到的:

$ \ sigma从i = 1到n评估((1 / n)*((n-1)/ n)^ i-1)

但同样,我无法找到这个公式与T(n)的联系,而且我也找不到BigOh,BigOmega或Theta这个函数的关系。

1 个答案:

答案 0 :(得分:1)

此算法为BigOh(n),BigOmega(n)和Theta(n)。

要知道这一点,你不需要计算概率或使用主定理(因为你的函数不是递归的)。您只需要看到该函数就像n项上的循环一样。如果你像这样代表你的函数会更容易:

for (int i = 0; i < n; ++i) {
    if (A[i] == n)
        return i;
}

我知道这似乎违反直觉,因为如果n是数组的第一个元素,实际上你只需要一个操作就可以找到它。这里重要的是一般情况,其中n位于数组中间的某个位置。

让我们这样说:考虑到你写的概率,n在你的数组的元素n/43n/4之间有50%的可能性。在这种情况下,您需要在n/43n/4测试之间找到您的元素,其值为O(n)(当您进行BogOh分析时,您将丢弃常量)。

如果你想知道你需要的平均操作次数,你可以计算一个系列,就像你在问题中写的那样。给出平均操作次数的实际系列是

1/(n+1) + 2/(n+1) + 3/(n+1) ... + n/(n+1)

为什么呢?因为如果n位于第一个位置(概率为1/(n+1)),则需要进行一次测试,如果n位于第二个位置(概率为1/(n+1)),则需要进行两次测试,。 .. i测试n是否位于i位置(概率为1/(n+1)

本系列评估为

n(n+1)/2 * 1/(n+1) = n/2