在 C 中创建哈希表
Creating Hash tables in C
我是哈希概念的新手 tables.I 我正在尝试创建一个非常简单的哈希 table 来理解这个概念。我已经了解如何为散列目的创建基本散列函数。不过我不明白怎么把它link改成剩下的table。我对如何开始创建 table 、查找函数、删除 table 中的条目等感到困惑。
散列函数看起来像这样 found here。
unsigned int hash(hash_table_t *hashtable, char *str)
{
unsigned int hashval;
/* we start our hash out at 0 */
hashval = 0;
/* for each character, we multiply the old hash by 31 and add the current
* character. Remember that shifting a number left is equivalent to
* multiplying it by 2 raised to the number of places shifted. So we
* are in effect multiplying hashval by 32 and then subtracting hashval.
* Why do we do this? Because shifting and subtraction are much more
* efficient operations than multiplication.
*/
for(; *str != '[=10=]'; str++) hashval = *str + (hashval << 5) - hashval;
/* we then return the hash value mod the hashtable size so that it will
* fit into the necessary range
*/
return hashval % hashtable->size;
}
但是我不明白其他部分,比如如何创建table、查找等等..
有人可以帮助我吗?我感谢任何形式的帮助。
与其告诉你如何编码,我会告诉你你想要学习的领域的名称:Data Structures and Algorithms
关于这个问题的大多数书籍都会给你一个关于如何创建散列的例子table。我的建议是,从比 C 更简单的语言开始,了解概念,然后再回到 C。
非常 简单地把散列 table 通过将数据拆分成更小的存储单元(称为桶)来工作。这些内部存储单元由索引访问,索引是存储在桶内的值的哈希码。注意 values 中的 s。您需要能够在一个存储桶中存储多个值以支持哈希码冲突。
所以散列有几个基本操作 table。
- Contains - 要进行包含检查,您需要计算哈希值以找到数据应位于的存储桶。找到正确的存储桶后,您需要检查每个那里的平等项目(你选择如何实现这个。)
- Add - 向 table 添加新项目需要像 Contains 中那样进行类似的检查,以防止您添加任何项目两次。
- 删除 - 你可以猜到。以与 Contains 相同的方式查找项目并将其从存储桶中移除。
也就是说,您需要实施存储桶。直截了当地说你需要一个列表列表。对于第一层,您需要一些支持索引访问的集合。由于您使用 C,所以一个简单的数组是可行的方法。我建议你不要为你的桶使用整数的整个范围(你可以这样做,但这会使它更难理解和调试)。只需应用模运算即可适当减少哈希码的范围。对于第二部分,我建议使用链表之类的东西来支持动态增长。
所以你根据数组索引找到你的链表,然后你处理链表中的每个项目以找到正确的项目。这也说明了为什么哈希冲突会降低哈希 table 的效率。如果你没有散列冲突,你只需要一个测试来找到这个项目,这是时间常数。如果您有哈希冲突,您需要检查多个值。
哈希冲突是两个不同的值返回相同的哈希码。
希望这能让您了解如何开始。并且不要听任何人的。 C 是一种很棒的入门语言。
基本概念很简单:
- 使用一个非常大的数组来存储数据
- 使用散列函数对数组进行索引
- 你会遇到冲突——所以找出一种机制来处理这些冲突(链表可能是最简单的)
因此,当您要写入数据时:index = hash_function(); array[index] = data.
与读取类似。
一旦你阅读了更多关于哈希表的内容,你就会明白其余的事情。
我是哈希概念的新手 tables.I 我正在尝试创建一个非常简单的哈希 table 来理解这个概念。我已经了解如何为散列目的创建基本散列函数。不过我不明白怎么把它link改成剩下的table。我对如何开始创建 table 、查找函数、删除 table 中的条目等感到困惑。
散列函数看起来像这样 found here。
unsigned int hash(hash_table_t *hashtable, char *str)
{
unsigned int hashval;
/* we start our hash out at 0 */
hashval = 0;
/* for each character, we multiply the old hash by 31 and add the current
* character. Remember that shifting a number left is equivalent to
* multiplying it by 2 raised to the number of places shifted. So we
* are in effect multiplying hashval by 32 and then subtracting hashval.
* Why do we do this? Because shifting and subtraction are much more
* efficient operations than multiplication.
*/
for(; *str != '[=10=]'; str++) hashval = *str + (hashval << 5) - hashval;
/* we then return the hash value mod the hashtable size so that it will
* fit into the necessary range
*/
return hashval % hashtable->size;
}
但是我不明白其他部分,比如如何创建table、查找等等..
有人可以帮助我吗?我感谢任何形式的帮助。
与其告诉你如何编码,我会告诉你你想要学习的领域的名称:Data Structures and Algorithms
关于这个问题的大多数书籍都会给你一个关于如何创建散列的例子table。我的建议是,从比 C 更简单的语言开始,了解概念,然后再回到 C。
非常 简单地把散列 table 通过将数据拆分成更小的存储单元(称为桶)来工作。这些内部存储单元由索引访问,索引是存储在桶内的值的哈希码。注意 values 中的 s。您需要能够在一个存储桶中存储多个值以支持哈希码冲突。
所以散列有几个基本操作 table。
- Contains - 要进行包含检查,您需要计算哈希值以找到数据应位于的存储桶。找到正确的存储桶后,您需要检查每个那里的平等项目(你选择如何实现这个。)
- Add - 向 table 添加新项目需要像 Contains 中那样进行类似的检查,以防止您添加任何项目两次。
- 删除 - 你可以猜到。以与 Contains 相同的方式查找项目并将其从存储桶中移除。
也就是说,您需要实施存储桶。直截了当地说你需要一个列表列表。对于第一层,您需要一些支持索引访问的集合。由于您使用 C,所以一个简单的数组是可行的方法。我建议你不要为你的桶使用整数的整个范围(你可以这样做,但这会使它更难理解和调试)。只需应用模运算即可适当减少哈希码的范围。对于第二部分,我建议使用链表之类的东西来支持动态增长。
所以你根据数组索引找到你的链表,然后你处理链表中的每个项目以找到正确的项目。这也说明了为什么哈希冲突会降低哈希 table 的效率。如果你没有散列冲突,你只需要一个测试来找到这个项目,这是时间常数。如果您有哈希冲突,您需要检查多个值。
哈希冲突是两个不同的值返回相同的哈希码。
希望这能让您了解如何开始。并且不要听任何人的。 C 是一种很棒的入门语言。
基本概念很简单:
- 使用一个非常大的数组来存储数据
- 使用散列函数对数组进行索引
- 你会遇到冲突——所以找出一种机制来处理这些冲突(链表可能是最简单的)
因此,当您要写入数据时:index = hash_function(); array[index] = data.
与读取类似。
一旦你阅读了更多关于哈希表的内容,你就会明白其余的事情。