C++ 对于这个英语单词列表,什么是好的哈希函数?

C++ 对于这个英语单词列表,什么是好的哈希函数?,c++,hashtable,C++,Hashtable,目前,我使用的表大小为80,因为我在文件中有大约73个单词。 我目前的散列方法非常基本和通用。在我将字母全部小写后,我将字母的ASCII值相加,然后按表大小(80当前)计算Imod(%)。我得到了很多冲突,还有很多未使用的bucket/索引。既然我确切地知道我需要散列哪些单词以及有多少个单词,那么有没有更好的方法可以使用,以尽可能减少冲突?我的目标是得到6或更少 还有,附带问题。一旦单词出现在哈希表中,如果我想查找某个单词,但键入的单词不正确,或者被打乱,我如何在哈希表中找到它 例如,如果我在哈

目前,我使用的表大小为80,因为我在文件中有大约73个单词。 我目前的散列方法非常基本和通用。在我将字母全部小写后,我将字母的ASCII值相加,然后按表大小(80当前)计算Imod(%)。我得到了很多冲突,还有很多未使用的bucket/索引。既然我确切地知道我需要散列哪些单词以及有多少个单词,那么有没有更好的方法可以使用,以尽可能减少冲突?我的目标是得到6或更少

还有,附带问题。一旦单词出现在哈希表中,如果我想查找某个单词,但键入的单词不正确,或者被打乱,我如何在哈希表中找到它

例如,如果我在哈希表中有“apple”,在我的搜索中,我使用“leppa”,这是apple的向后拼写,那么有什么好的方法来解读“leppa”,这样苹果就会出来


如果你不确定我刚才问的是什么,请问我,如果我不清楚,对不起

试试md5,你的字典里不会有冲突

您可以简单地使用std::hash:

#include <string>
#include <iostream>
#include <functional>

int main()
{
    std::string str = "air conditioner";
    size_t h = std::hash<std::string>()(str);
    std::cout << "hash of \"" << str << "\" is " << h << std::endl;
}
#包括
#包括
#包括
int main()
{
std::string str=“空调”;
size\u t h=std::hash()(str);

std::cout试试md5,你的字典里不会有冲突

您可以简单地使用std::hash:

#include <string>
#include <iostream>
#include <functional>

int main()
{
    std::string str = "air conditioner";
    size_t h = std::hash<std::string>()(str);
    std::cout << "hash of \"" << str << "\" is " << h << std::endl;
}
#包括
#包括
#包括
int main()
{
std::string str=“空调”;
size\u t h=std::hash()(str);

std::cout杂音散列被认为是快速的,可能会提供良好的分布


为了在散列中查找“加扰”的文本,您需要使用与字母顺序无关的散列函数-这是一个非常糟糕的主意,因为所有排列都将在同一个散列桶中

杂音散列被认为是快速的,可能会提供良好的分布


为了在散列中查找“加扰”的文本,您需要使用与字母顺序无关的散列函数-这是一个非常糟糕的主意,因为所有排列都将在同一个散列桶中

尝试不幸的是,我不允许使用该工具来生成“完美的散列函数”.我已经做了一系列的研究,也在谷歌上发现了这一点,但不幸的是我不能将其用于这个项目。你在第二部分中描述的只是一个拼写检查或拼写更正器(它们略有不同,但非常相似)。试着在谷歌上搜索“拼写检查算法”或者类似的开始。是另一个开始的好地方。请尝试。不幸的是,我不允许使用该工具提出“完美的哈希函数”.我已经做了一系列的研究,也在谷歌上发现了这一点,但不幸的是我不能将其用于这个项目。你在第二部分中描述的只是一个拼写检查或拼写更正器(它们略有不同,但非常相似)。试着在谷歌上搜索“拼写检查算法”或者类似的开始。是另一个开始的好地方。如何开始?我有一个从0到79的哈希表。如果我输入一个字符串,它不会给我一个从0到79的整数,所以我不能在哈希表中存储任何东西?@TheNewbie这是一种无意义的练习,因为你可以简单地从字典返回索引以获得“完美”哈希函数。@Parvel,你是什么意思?如果我的哈希表中有冲突,它怎么可能是完美的?使用你提到的FNV1哈希,我得到了访问冲突。不确定这是否是如何实现它的?
for(int I=0;I
@newbie try
std::hash()(str)%tableSize
怎么会这样?我有一个从0到79的哈希表。如果我输入一个字符串,它不会给我0到79之间的整数,所以我不能在哈希表中存储任何内容?@newbie这是一种毫无意义的练习,因为你可以从字典返回索引以获得“完美”哈希函数。@Parvel,你是什么意思?如果我的哈希表中有冲突,它怎么可能是完美的?使用你提到的FNV1哈希,我得到了访问冲突。不确定这是否是如何实现它的?
for(int I=0;I
@TheNewbie try
std::hash()(str)%tableSize