我在C中有一个字符串数组。字符串长度各约为3000个字符。我想哈希它们以获得更快的搜索结果并且更喜欢完美哈希。问题是,完美哈希需要数据集中的唯一字符串来创建哈希函数,因为我的数据集不可避免地重复。
所以现在,我需要一种非常快速的方法来从C中的字符串数组中删除重复项。 请建议最快的方法。
答案 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;
}