2010-08-08 64 views
3

我需要比较一个字符串与c中的多个其他常量字符串。我很好奇,哪个更快,散列我要比较的字符串,并将其与所有其他常量字符串散列进行比较,或者将字符串作为字符串进行比较。提前谢谢你c字符串比较vs散列比较

谢谢你的答案我会做很多比较。任何人都可以给我一个好的,快速的,低资源密集型的算法来使用吗?我知道的唯一散列是MD5,我有一种超过杀死的感觉。

我也想补充的是,字符串是也许20或30个字符,在绝大多数是最大7左右

回答

8

将会比较中一次或多次做了什么?如果只进行一次比较,那么你最好做一个比较。如果您需要将很多字符串与这组常量字符串进行比较,那么您可以通过使用散列来节省时间。

这是一个足够简单的问题,您可以轻松地将其写入两种方式,并查看哪种方法对于代表性输入集更好。

3

散列值的相等并不保证相等 - 不匹配将保证不等式,但。如果你需要比较大量的字符串与你的集合,散列会很好 - 如果是一次性比较(不太可能我猜),那么strcmp将会很好地完成。

+0

没错。请参阅http://stackoverflow.com/questions/186494/ifstr1str2-versus-ifstr1-lengthstr2-length-str1str2/186794#186794 – Suma 2010-08-09 13:31:10

1

这取决于。什么是哈希算法?字符串有多长?什么是平台?

另请注意,匹配的散列不保证匹配的字符串。

+0

中的类似“优化”散列没有错误否定,但确实有误报。 – 2010-08-08 21:15:39

0

它很大程度上取决于字符串的长度和散列函数的复杂性。实施和测试自己将是最好的答案...

4

如果您尝试将主题字符串与其他字符串进行匹配,则可以考虑使用Aho-Corasick String Matching Algorithm。它使用一个trie来在一次传递中将主体与所有目标字符串进行匹配(这也很容易实现)。

0

另一种可行的方法是将你的常量字符串进行排序并对字符串进行二分搜索,这样最多只能比较log2(n)(例如,对于1024个字符串只能进行10次比较,或者只能进行20次比较1000000个字符串)。 我不知道它是否适用于您的问题,但是我用这种方法取得了非常好的效果。哈希是非常难以正确处理的,角落的情况会变得非常糟糕,并且密钥的计算通常会非常昂贵。

0

非常感谢你给我答案 做了许多比较。可以 任何人都给我一个好的,快速的,低密度的资源密集算法使用? 我知道的唯一散列是MD5,而我 有一种超过杀死的感觉。

Murmur hash简单,快速,在统计测试中表现良好。

4

很难领先,字符串散列函数是O(n)。字符串比较也是O(n),以较小的喔。如果您可以存储您计算的散列值并重复使用它们,那么您只能在前面。对彼此而言。

简单示例C哈希函数are here

+1

如果您将这一个字符串与多个字符串进行比较,如问题所问?我不认为它仍然是O(n),那将是O(n^2)是吧? – tushar747 2013-11-06 01:29:59

3

我想如果你有一个静态的字符串列表,我会将它们存储在一个有序的数组中,然后使用bsearch来确定一个字符串是否在该列表中。如果它不存在,则返回NULL;如果该值存在,则返回值的指针可能比线性搜索或散列更快。

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

/* cmp function for qsort and bsearch */ 
static int pstrcmp(const void *a, const void *b) 
{ 
    return strcmp(*(char * const *)a, *(char * const *)b); 
} 

/* check an input against the list of known strings */ 
static char *check_for_match(char *input) 
{ 
    static char *static_list[] = { "one", "two", "three", "four", "five" }; 
    static int nelems; 

    /* this sorts the list, for demonstration purposes, but if the list 
    is static then it could be sorted prior to compiling */ 
    if (! nelems) 
    { 
    nelems = sizeof(static_list)/sizeof(*static_list); 
    qsort(static_list, nelems, sizeof(*static_list), pstrcmp); 
    } 


    return bsearch(&input, static_list, nelems, sizeof(*static_list), pstrcmp); 
} 

int main(int argc, char *argv[]) 
{ 
    if (check_for_match("should_not_match")) 
    { 
    printf("Match found.\n"); 
    } else { 
    printf("No match found.\n"); 
    } 

    if (check_for_match("two")) 
    { 
    printf("Match found.\n"); 
    } else { 
    printf("No match found.\n"); 
    } 
    return EXIT_SUCCESS; 
} 
1

如果你的常量字符串在编译时已知,那么看看“完美散列”的概念。

维基百科:一个集合S的完美散列函数是一个散列函数,它将S中的不同元素映射到不同的整数,没有冲突。

“没有碰撞”的事情可以节省您的工作。进一步阅读和实现的可能性是: