我需要让这个功能更有效率

时间:2012-02-22 04:09:50

标签: c performance list

我目前的职能是O(n)。它通过获取第一个列表并将其反转来附加两个列表类型结构,然后将其放回到第二个列表的前面。我不知道如何将这两个列表附加到我目前拥有的函数中。有谁知道我怎么能做到O(1)?

我目前的想法可能是我可能要做一个完全不同的功能。

追加功能:

ilist iappend_destroy(ilist il1, ilist il2){
   if(il1 == NULL && il2 == NULL){
      free(il1);
      free(il2);
      return NULL;
   }else if(il1 == NULL){
      free(il1);
      return(il2);
   }else if(il2 == NULL){
      free(il2);
      return(il1);
   }else{

   ilist tmp = iempty();
   ilist clone = il1;

   while(il1 != NULL){
      tmp = icons_destroy(il1->first, tmp);
      il1 = il1->rest;
   }

   ilist tmpclone = tmp;

   while(tmp != NULL){
      il2 = icons_destroy(tmp->first, il2);
      tmp = tmp->rest;
   }

   idelete(tmpclone);
   idelete(clone);
   return il2;
   }

追加功能正在使用的图标功能:

ilist icons_destroy(int in, ilist il){
   if (il == NULL) {
      ilist anewlist = malloc(sizeof(struct ilist_ADT));
      anewlist->first = in;
      anewlist->rest = NULL;
      return (anewlist);
   } else {
      ilist previous = malloc(sizeof(struct ilist_ADT));
      previous->first = il->first;
      previous->rest = il->rest;
      il->first = in;
      il->rest = previous;
      return il;
   }
}

1 个答案:

答案 0 :(得分:2)

假设正在销毁的原始列表正在销毁,就像您的代码中的情况一样,您可以使用以下算法在O(1)中附加两个列表:

lAend ----------------------------+
                                  V
listA -> item A1 -> item A2 -> item A3 -> null
listB -> item B1 -> item B2 -> item B3 -> null
                                  ^
lBend ----------------------------+

您需要列表末尾指针以及列表开头指针,但将listB附加到listA末尾的代码只是:

lAend->next = listB; lAend = lBend;
listB = null;        lBend = null;

之后,listB为空,listA包含组合列表:

lAend ---------------------------------------+
listA -> item A1 -> item A2 -> item A3 --+   |
                                         |   |
                +------------------------+   |
                |                            V
                +--> item B1 -> item B2 -> item B3 -> null
listB -> null
lBend -> null

如果你存储结束指针,则O(1)是不可能的,因为你需要找到第一个列表的最后一个元素,一个基本的O(n)操作