Algorithm 简单的;“数组中的最大值”;和复杂性计算
我对这东西还不熟悉,我需要你的帮助 我应该建立一个高效的简单算法,返回一个大小为n的数组中的最大值,该数组包含数字1,2,…n,并重复 然后我必须确定最佳运行时间、平均运行时间和最差运行时间 所以我有两个问题:Algorithm 简单的;“数组中的最大值”;和复杂性计算,algorithm,complexity-theory,Algorithm,Complexity Theory,我对这东西还不熟悉,我需要你的帮助 我应该建立一个高效的简单算法,返回一个大小为n的数组中的最大值,该数组包含数字1,2,…n,并重复 然后我必须确定最佳运行时间、平均运行时间和最差运行时间 所以我有两个问题: 首先,我试图理解,对于这个简单的算法,需要一个有效的解决方案是什么意思。据我所知,我应该只有一个从1到n的简单循环,并寻找最大值。“高效”算法是否指出,如果我在数组中找到值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
,则将检查最后一个元素:因此需要添加到上面的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(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个随机整数