从C中的字符串数组中删除重复项

时间:2016-02-16 06:24:26

标签: c string duplicates

我在C中有一个字符串数组。字符串长度各约为3000个字符。我想哈希它们以获得更快的搜索结果并且更喜欢完美哈希。问题是,完美哈希需要数据集中的唯一字符串来创建哈希函数,因为我的数据集不可避免地重复。

所以现在,我需要一种非常快速的方法来从C中的字符串数组中删除重复项。 请建议最快的方法。

3 个答案:

答案 0 :(得分:1)

我的第一个想法是,在没有研究的情况下,可能会为每个字符串创建某种基本哈希值,并且只有在哈希值匹配时才检查完整字符串是否相等。这应该允许稍微加速算法,以较低的成本完成整个算法的简单程度。应该有一个比这更好的解决方案,但它应该有所帮助。

答案 1 :(得分:1)

这些是可以提供帮助的数据结构

阵列

将每个项目添加到数组中。 qsort结果。 如果前一个字符串是重复的,则输出结果,但不输出。 Unix sort | uniq

二叉树

将字符串保存在二叉树中。 Wikipedia binary tree。添加每个字符串后,搜索树。如果字符串不存在,请添加字符串。

哈希表

使用字符串哈希来保留哈希表。 strcmp检查碰撞,未添加重复。

线索

Wikipedia trie。 trie存储公共前缀。这会自动“丢失”重复

答案 2 :(得分:0)

#include <string.h>
#include <stdio.h>

/**
 * Removes duplicate strings from the array and shifts items left.
 * Returns the number of items in the modified array.
 *
 * Parameters:
 * n_items   - number of items in the array.
 * arr       - an array of strings with possible duplicates.
 */
int remove_dups(int n_items, char *arr[])
{
    int i, j = 1, k = 1;

    for (i = 0; i < n_items; i++)
    {
        for (j = i + 1, k = j; j < n_items; j++)
        {
            /* If strings don't match... */
            if (strcmp(arr[i], arr[j])) 
            {
                arr[k] = arr[j];
                k++;
            }
        }
        n_items -= j - k;
    }
    return n_items;
}