简单的“数组中的最大值”和复杂度计算

时间:2012-10-31 13:53:55

标签: algorithm complexity-theory

我对这些东西很陌生,我需要你的帮助。

我应该构建一个有效的简单算法,它在一个大小为n的数组中返回最大值,其中包含重复的数字1,2,... n。

然后我必须确定最佳运行时间,平均运行时间和最差运行时间。

所以我有两个问题:

  1. 首先,我试图理解为这个简单的算法要求有效解决方案的想法。据我所知,我应该只有一个从1到n的简单循环,并寻找最大值。 “高效”算法是否指出如果我在数组中找到值n,我可以停止搜索更多值,因为这是数组中的最大值?

  2. 如何在计算平均运行时间时确定最佳运行时间和平均运行时间,即均匀分布。 也就是说,数组中的每个单元都有1 / n的概率为最大值。

  3. 提前多多感谢!

4 个答案:

答案 0 :(得分:7)

最好的情况 - 找到最大元素作为第一个(O(1)),最坏的情况 - 它是检查的最后一个元素(O(n))。

棘手的部分是平均情况。
要找到平均情况 - 我们需要expected个迭代次数!

由于您可以在找到最大值后停止,我们可以将问题分成两部分:

  1. [0,n-1):由于平均而言(假设每个元素的统一独立分布) - 数字n在每个位置的概率为1 / n,那么此部分的预期迭代次数为1/n + 2*((n-1)/n)/n + 3 * ((n-1)/n)^2/n + ... + (n-1) * ((n-1)/n)^(n-2)/n 1
    The above formula yields an ugly formula which is O(n)
  2. 如果前n-1个元素不包含值n,则会检查最后一个元素:因此您需要添加上面的n* ((n-1)/n)^(n-1) O(n)同样(无穷远是1/e * n)。
  3. 总计O(n)平均时间解决方案。


    (1):每个元素的公式为j*((n-1)/n)^(j-1) * (1/n),因为:

    • j - 检查的元素数量(迭代次数)
    • ((n-1)/n)^(j-1) - 前一个元素中没有n的概率
    • (1/n) - 概率此数字为n

答案 1 :(得分:2)

算法是这样工作的,首先你选择一个数字(在这种情况下,我选择数组的第一个数字并假装它是最大数,然后我将它与下一个数字进行比较,如果它更大,我把它作为新的最大值,直到我完成数组搜索),下一个代码在C:

#include <stdio.h>
#define SIZE 100

typedef struct{
    int val;
    int loc;
} find;

/* Functions declaration (Prototype) */
find maxFinder( int * const a );

int main( void )
{
    int response[ SIZE ]=
       { 1, 3, 5, 7,  8, 9, 0, 10, 65, 100,
         1, 3, 5, 7,  8, 9, 0, 10, 65, 100,
         1, 3, 5, 7,  8, 9, 0, 10, 65, 100,
         1, 3, 5, 7,  8, 9, 0, 10, 65, 100,
         1, 3, 5, 7,  8, 9, 0, 10, 65, 100,
         1, 3, 5, 7,  8, 9, 0, 10, 65, 100,
         1, 3, 5, 7,  8, 9, 0, 10, 65, 100,
         1, 3, 5, 7,  8, 9, 0, 10, 65, 100,
         1, 3, 5, 7,  8, 9, 0, 10, 65, 100,
         1, 3, 5, 7,  8, 9, 0, 10, 65, 100 };

    printf( "The max number is %d located in the index %d.\n", maxFinder( response ).val, maxFinder( response ).loc );
    return 0;
}

 find maxFinder( int * const a )
 {
    /* Local Variables initialization & declaration */
    int i;
    find result;

    result.loc = 0;
    result.val = *( a + 0 );

    for( i = 1; i < SIZE; i++ ){
        if ( result.val < *( a + i ) ){
            result.loc = i;
            result.val = *( a + i );
        }
    }
    return result;
 }

答案 2 :(得分:2)

如果没有关于数组的先验信息(例如它已经排序),则没有最坏情况或最佳情况,并且您必须扫描所有元素以找出Max,并且需要O(n)次

另外,了解获取每个单元格最大值的概率分布通常是无用的(除非它减少了您的搜索空间。例如,如果您知道只有恒定数量的单元格具有获得最大值的非零概率,那么你只需要搜索那些细胞,它需要恒定的时间)。因此,一般来说

最佳运行时间=最差运行时间=平均运行时间= O(n)

答案 3 :(得分:1)

最糟糕和最好的情况很简单。平均情况更有趣。查看维基百科页面Geometric Distribution