我正在尝试解决一个非常简单的算法分析(对我来说显然不是那么简单)。
算法是这样的:
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这个函数的关系。
答案 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/4
和3n/4
之间有50%的可能性。在这种情况下,您需要在n/4
和3n/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