高效的搜索算法,以查找重复的字符串

时间:2014-10-14 15:35:28

标签: c algorithm search data-structures

以下是查找重复字符串模式的算法。所有字符串已经添加到链接列表中,现在的工作是查找重复的模式。

字符串长度可以是8-20个字符,链表中的字符串元素数在100到200之间。当前的方法似乎有复杂性和效率问题。有人可以为此提出最有效的方法吗?

typedef struct Map
{
        int8_t *string;
        struct Map  *next;
}map_t;

//Algorithm to find the duplicate string pattern in link list.  

int16_t findDuplicateOids(map_t *head)
{
  map_t *ptr1, *ptr2;
  ptr1 = head;
  /* Pick elements one by one */
  while(ptr1 != NULL && ptr1->next != NULL)
  {
     ptr2 = ptr1;
     /* Compare the picked element with rest of the elements */
     while(ptr2->next != NULL)
     {
       /* If pattern is similar than return return error */
       if(!strcmp(ptr1->string , ptr2->next->string))
       {  printf("match happened");
          return RESULT_ERROR;
       }
       else 
       {
          ptr2 = ptr2->next;
       }
     }
     ptr1 = ptr1->next;
  }
  return RESULT_SUCCESS;
}

2 个答案:

答案 0 :(得分:4)

如果您想提高算法的时间复杂度,可以:

  1. 按字典顺序对字符串进行排序。然后,您只需要检查成对的连续字符串。这种方法的时间复杂度为O(n log n) + O(n) = O(n log n)

  2. 使用哈希表。此解决方案的平均时间复杂度为O(n)

  3. 使用trie。同样,O(n)

答案 1 :(得分:0)

您可以使用以下步骤提高复杂性 -

  1. 使用后缀数组按照复杂度O(nlogn)的字典顺序对字符串进行排序。

  2. 比较相邻的字符串。比较的总数减少到n。这个步骤的复杂度是O(n)。

    总复杂度为O(nlogn)+ O(n)= o(nlogn)。