我对这些东西很陌生,我需要你的帮助。
我应该构建一个有效的简单算法,它在一个大小为n的数组中返回最大值,其中包含重复的数字1,2,... n。
然后我必须确定最佳运行时间,平均运行时间和最差运行时间。
所以我有两个问题:
首先,我试图理解为这个简单的算法要求有效解决方案的想法。据我所知,我应该只有一个从1到n的简单循环,并寻找最大值。 “高效”算法是否指出如果我在数组中找到值n,我可以停止搜索更多值,因为这是数组中的最大值?
如何在计算平均运行时间时确定最佳运行时间和平均运行时间,即均匀分布。 也就是说,数组中的每个单元都有1 / n的概率为最大值。
提前多多感谢!
答案 0 :(得分:7)
最好的情况 - 找到最大元素作为第一个(O(1)
),最坏的情况 - 它是检查的最后一个元素(O(n)
)。
棘手的部分是平均情况。
要找到平均情况 - 我们需要expected个迭代次数!
由于您可以在找到最大值后停止,我们可以将问题分成两部分:
[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
O(n)
n
,则会检查最后一个元素:因此您需要添加上面的n* ((n-1)/n)^(n-1)
O(n)
同样(无穷远是1/e * n
)。 总计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。