问题是使用
struct match_score
{
char country[20];
int score;
};
其中结构与击球手的得分和他得分的国家有关。 我们必须找到他平均水平最高的国家。
我编写了一个时间复杂度为O(n ^ 2)的代码 任何人都可以建议我如何将时间复杂度降低到O(nlogn)或O(n)
代码为O(n ^ 2)
#include <stdio.h>
#include <string.h>
struct match_score
{
char country[20];
int score;
};
char *func(struct match_score *array,int len);
main()
{
struct match_score scores[]={
{"Pakistan",23},
{"India",52},
{"Pakistan",40},
{"India",22},
{"Australia",80}
};
char *max_avg=func(scores,5);
printf("%s",max_avg);
}
char *func(struct match_score *array,int len)
{
int i,j,average[20],avg,l,max=0,max_num;
char co[20];
for(i=0;i<len;i++)
{
average[i]=0;
}
for(i=0;i<len;i++)
{
avg=0;
l=0;
strcpy(co,"");
strcpy(co,array[i].country);
for(j=0;j<len;j++)
{
if(strcmp(array[j].country,co)==0)
{
l++;
avg+=array[j].score;
}
}
average[i]=avg/l;
}
for(i=0;i<len;i++)
{
if(average[i]>max)
{
max=average[i];
max_num=i;
}
}
for(i=0;i<len;i++)
{
printf("%d %d\n",i,average[i]);
}
return array[max_num].country;
}
答案 0 :(得分:7)
你点击n ^ 2的区域就在这里;
for(i=0;i<len;i++)
{
for(j=0;j<len;j++)
{
if(strcmp(array[j].country,co)==0)
所有这一切都是在您的阵列中搜索重复的国家/地区。如果按n log n的成本对数组进行排序,则可以按顺序n找到重复项。这会给你带来o(n log n)
的新复杂性答案 1 :(得分:1)
您可以使用临时集合来存储平均值,然后对其进行迭代以找到最大值。这将使用更多的空间,但是将是O(2n),因为你必须连续循环而不是嵌套。
答案 2 :(得分:-1)
如果你对arry进行排序,你的复制会减少很多。搜索已排序的数字 arry要快得多......
顺便说一句,你应该已经解释了你的算法和你的代码,或者至少给出了一些注释......