【问题标题】:Analysis of algorithm by Average-case平均情况下的算法分析
【发布时间】:2012-11-02 18:53:11
【问题描述】:

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

算法是这样的:

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 的关系。

【问题讨论】:

    标签: algorithm complexity-theory calculus


    【解决方案1】:

    这个算法是 BigOh(n)、BigOmega(n) 和 Theta(n)。

    要知道这一点,您无需计算概率或使用主定理(因为您的函数不是递归的)。您只需要看到该函数就像对n 术语的循环。如果您像这样表示您的功能,也许会更容易:

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

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

    让我们这样说:给定你写的概率,n 有 50% 的机会位于数组的元素 n/43n/4 之间。在这种情况下,您需要在 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 测试是否为@ 987654337@ 在ith 位置(概率为1/(n+1)

    这个系列评估为

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

    【讨论】:

    • 我主要需要平均运行时间。我想知道如何做到这一点,尽管我同意你的观点,这听起来像 n。我在课堂上看到了一些平均案例运行时间变为 logn 的示例。我只是想了解正式的正确方法。
    • 首先,这是非常好的观察。我只是需要一些正式的解释。
    • 还有一件事。 n 没有出现的机会呢?你忽略了吗?我的意思是,这些信息是有目的的还是我可以忽略它?
    • 是的,我忘记了。这会将 n/(n+1) 添加到系列中,无论如何这都会被忽略。
    • 1/(n+1) + 2/(n+1) + 3/(n+1) ... + n/(n+1) =?
    猜你喜欢
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    相关资源
    最近更新 更多