我需要将字符串与c中的多个其他常量字符串进行比较。我很好奇哪个更快,散列我要比较的字符串并将其与所有其他常量字符串哈希进行比较,或者只是将字符串作为字符串进行比较。提前谢谢你
谢谢你的答案,我要做很多比较。任何人都可以给我一个好的,快速的,低资源密集型的算法吗?我所知道的唯一哈希是MD5,我有一种过度杀戮的感觉。
我还想补充一点,字符串最多可能是20或30个字符,最多约为7个。
答案 0 :(得分:8)
比较是进行一次还是多次?如果比较只进行一次,那么你最好做一个直接比较。如果你需要将很多字符串与这组常量字符串进行比较,那么从长远来看,你可以通过哈希来节省时间。
这是一个很简单的问题,您可以轻松地双向编写,并查看哪种方法更适合代表性的输入。
答案 1 :(得分:4)
如果您尝试将主题字符串与一组其他字符串匹配,则可以考虑使用Aho-Corasick String Matching Algorithm。它使用trie在一次传递中将主题与所有目标字符串进行匹配(实现起来也非常简单)。
答案 2 :(得分:4)
很难获得成功,字符串哈希函数是O(n)。字符串比较也是O(n),较小的哦。如果您可以存储计算的哈希值并重复使用它们,那么您才会领先。对于两者。
简单示例C哈希函数are here。
答案 3 :(得分:3)
哈希值的平等并不能保证平等 - 不匹配会保证不平等。如果你需要将很多字符串与你的集合进行比较,那么哈希就会很棒 - 如果它是一次性的比较(不太可能我猜),那么strcmp会做得很好。
答案 4 :(得分: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;
}
答案 5 :(得分:1)
这取决于。什么是哈希算法?琴弦有多长?什么是平台?
另请注意,匹配的哈希不保证匹配字符串。
答案 6 :(得分:1)
如果在编译时知道常量字符串,请看一下“完美哈希”的概念。
维基百科:集合S的完美哈希函数是一个哈希函数,它将S中的不同元素映射到不同的整数,没有冲突。
“没有碰撞”的事情会让你失业。进一步阅读和实施的可能性是:
答案 7 :(得分:0)
这在很大程度上取决于字符串的长度和哈希函数的复杂性。自己实施和基准测试将是最好的答案......
答案 8 :(得分:0)
另一种可行的方法是将常量字符串排序并对字符串进行二分法搜索,这样您最多只进行log2(n)
次比较(例如,对于1024个字符串甚至只进行10次比较,甚至只有20个1000000字符串)。
我不知道它是否适用于你的问题,但我用这种方法取得了很好的效果。哈希很难做到正确,角落案件可能变得非常讨厌,而密钥的计算通常会非常昂贵。
答案 9 :(得分:0)
谢谢你的答案 要做很多比较。能够 任何人都给我一个好的,快的,低的 资源密集型算法使用? 我所知道的唯一哈希就是MD5和我 有一种过度杀戮的感觉。
Murmur hash简单,快速且在统计测试中表现良好。
答案 10 :(得分:0)
直接回答您的问题,如果您只是比较两个字符串(您也可以考虑两个文件,两个视频等),逐个字符进行比较和哈希都为O(N),则没有明显的区别。这样做的优势。
但是,如果字符串可以更改,则哈希在第二次运行中会更有效,例如,滚动哈希https://en.wikipedia.org/wiki/Rolling_hash
此外,字符串/文件的散列就像指纹一样,如果下次另一个字符串与该字符串相同,则可以在下一次要比较时直接比较散列值