减少时间复杂性

时间:2013-07-22 12:31:25

标签: c algorithm big-o

问题是使用

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;
}

3 个答案:

答案 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要快得多......

顺便说一句,你应该已经解释了你的算法和你的代码,或者至少给出了一些注释......