Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 简单的;“数组中的最大值”;和复杂性计算_Algorithm_Complexity Theory - Fatal编程技术网

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

Algorithm 简单的;“数组中的最大值”;和复杂性计算,algorithm,complexity-theory,Algorithm,Complexity Theory,我对这东西还不熟悉,我需要你的帮助 我应该建立一个高效的简单算法,返回一个大小为n的数组中的最大值,该数组包含数字1,2,…n,并重复 然后我必须确定最佳运行时间、平均运行时间和最差运行时间 所以我有两个问题: 首先,我试图理解,对于这个简单的算法,需要一个有效的解决方案是什么意思。据我所知,我应该只有一个从1到n的简单循环,并寻找最大值。“高效”算法是否指出,如果我在数组中找到值n,我可以停止搜索更多值,因为这是数组中的最大值 在计算平均运行时间时,我如何利用这一事实确定最佳运行时间和平均运行

我对这东西还不熟悉,我需要你的帮助

我应该建立一个高效的简单算法,返回一个大小为n的数组中的最大值,该数组包含数字1,2,…n,并重复

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

所以我有两个问题:

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

  • 在计算平均运行时间时,我如何利用这一事实确定最佳运行时间和平均运行时间,即它是一个均匀分布。 也就是说,数组中的每个单元格都有1/n的机会成为最大值


  • 提前多谢

    最坏和最好的情况都很简单。一般情况更有趣。查看Wikipedia页面。

    算法是这样工作的,首先选择一个数字(在本例中,我选择数组的第一个数字并假设它是最大值,然后我将它与下一个数字进行比较,如果它更大,我将其作为新的最大值,直到我在数组中完成搜索),下一个代码是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;
     }
    
    #包括
    #定义大小100
    类型定义结构{
    int-val;
    int loc;
    }发现;
    /*函数声明(原型)*/
    查找maxFinder(整数*常数a);
    内部主(空)
    {
    int响应[大小]=
    { 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(“最大编号为%d,位于索引%d中。\n”,maxFinder(response).val,maxFinder(response).loc);
    返回0;
    }
    查找maxFinder(整数*常数a)
    {
    /*局部变量初始化与声明*/
    int i;
    发现结果;
    result.loc=0;
    result.val=*(a+0);
    对于(i=1;i
    最佳情况-查找最大元素作为第一个(
    O(1)
    ),最坏情况-它是选中的最后一个元素(
    O(n)

    棘手的部分是一般情况。
    要找到平均情况,我们需要迭代次数

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

  • [0,n-1)
    :由于平均而言(假设每个元素的分布均匀独立)
    n
    的数量在每个位置的概率为1/n,那么该部分的预期迭代次数为
    1/n+2*((n-1)/n+3*((n-1)/n)^2/n+…+(n-1)*((n-1)/n^(n-2)/n
    1
  • 如果前n-1个元素不包含值
    n
    ,则将检查最后一个元素:因此需要添加到上面的
    n*((n-1)/n)^(n-1)
    ,也就是
    O(n)
    (lim到无穷大是
    1/e*n
  • 此总数为
    O(n)
    平均时间解决方案。


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

    • j
      -检查的元素数量(迭代次数)
    • ((n-1)/n)^(j-1)
      -在前面的元素中没有
      n
      的概率
    • (1/n)
      -概率这个数字是
      n

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

    此外,了解每个单元格获得最大值的概率分布通常是无用的(除非它减少了您的搜索空间。例如,如果您知道只有固定数量的单元格具有获得最大值的非零概率,那么您只需要搜索这些单元格,并且需要固定的时间)


    最佳情况下的运行时间=最坏情况下的运行时间=平均运行时间=O(n)

    听起来像是家庭作业…到目前为止你想出了什么?提示:排序数组的最大/最小值有O(1)运行时间。@MarcB:但确定数组排序是O(n):|因此,我们只需提取任意数组上的最大/最小值。@MarcB数组没有排序。我不需要解决方案,但需要一些具体答案的解释。至于到目前为止我得出的结论,我在我的问题中写道。“大小为n的数组中的最大值,其中包含数字1,2,…n,并有重复。”很明显是n,不是吗?最好的情况是第一个元素O(1),最坏的情况是O(n),是吗?根据你的评论,你似乎很自信,并且理解这个想法。按照你的直觉:)你不应该使用数字在1…SIZE之间的事实吗?SIZE是一个你必须声明的常量值,在我的例子中是100。在这种情况下SIZE=n,而你的值在1…n之间。这不是一般情况如图所示。这是一般情况,只需根据您的意愿更改大小值,它将从0(数组的第一个元素)开始搜索,直到数组完成(n-1)@Alberto Bonsanto:您可以用Javascript/PHP共享代码吗!pleaseWow@amit我没有单词。放得太好了。非常感谢您的“使用重复项”比特说它不是一个随机排列。仅仅是范围
    1..n
    @bt中的n个随机整数