结构效率

时间:2012-03-31 22:16:08

标签: c performance struct linked-list

我有以下结构

struct scoreentry_node {
    struct scoreentry_node *next;
    int score;
    int max;
    char name[1];    
}
;
typedef struct scoreentry_node *score_entry;

我有构建我的结构的函数add

int max(int a, int b) {    
   if (a > b) return a;
   return b;
}

score_entry add(int in, char* n, score_entry en) {      
   score_entry r = malloc(sizeof(struct scoreentry_node) + strlen(n))
   if (en == NULL){ r->max = in; }
   else {  r->max = max(in, en->max); }
   r->score = in;
   strcpy(r->name, n);
   r->next = en;  
   return r;   
}

我有以下功能,它扫描我的结构搜索名称并产生该名称的最高分:

int maxiscore(score_entry a, char* name)
{    
 int highestscore = -1000000000;    
   for (a; a != NULL; a = a->next)
    {
      if (strcmp(a->name, name) == 0 && a->score > highestscore)
        {
          highestscore = a->score;                
       }
     }
 return highestscore;
} 

我想知道我是否可以让我的maxiscore函数在O(1)中运行[不必扫描我的结构]?我正在考虑在我的结构中添加另一个字段,但我必须考虑它需要根据特定的输入名称而变化。任何建议/提示?

2 个答案:

答案 0 :(得分:1)

正如一些评论者指出,这基本上是一个算法/数据组织问题。

您可以花时间创建“有组织的”数据结构,例如每用户得分表,哈希值,平衡树等等;或者你可以花时间搜索“杂乱无章”的数据结构。甚至有混合方法:创建它们“杂乱无章”,然后根据需要动态组织它们(例如,展开树)。

如果您已经掌握了“您将做的最多”的信息,那么您现在可以进行优化。否则,如果您希望以后能够优化,请确定您需要哪种功能,并提供“执行每项操作”的特定功能(添加一个带有一组分数的名称?添加一个名称和一个分数?查找所有分数对于一个特定的名字?找到N个最高分?找到一个特定名字的N个最高分数?任何/所有前面的?等等)。一旦它全部工作,使用分析来找出时间的去向,然后选择如何组织通过这些功能访问的数据。

实际上,我认为你的问题开始有点“太低级别”,即“我已经有了这套特殊的指甲,所以我应该使用哪种锤子”,当螺丝或胶水可能更好时。 : - )

答案 1 :(得分:0)

您可以将包含scorelist指针的score_entry类中的一组结构包装到包含的条目中的第一个元素和最高分(以及指向相关元素的指针)。您可以更新add()上的biggets分数并重写指针。您将能够访问O(1)中得分最高的元素。