当前位置: 首页 > 知识库问答 >
问题:

在C中实现哈希表(使用链表避免冲突)的必要结构?

索和璧
2023-03-14

嘿,伙计们,过去几天我一直在读关于C语言中的指针、结构和数据结构的文章。现在,我尝试通过以下教程来实现一个C语言的哈希表:https://www.tutorialspoint.com/data_structures_algorithms/hash_table_program_in_c.htm

然而,tutorialspoint假设只有1个哈希表,并使其全局化。此外,tutorialspoint没有考虑冲突。

我想做一个结构,不局限于单个哈希表,我计划将链接(以处理冲突)与链表结合起来。我有以下内容:

typedef struct node {
    int key;
    int data;
    struct node* next;
} node;

typedef struct linkedList{
    node* head;
    node* tail;
    size_t size;
} linkedList;

typedef struct hashTable{
    //perhaps an array of linked list? This member is what I need help with
    //And other potential members I am overlooking
    size_t size
} hashTable;

有些事情我需要解释一下:

>

  • 节点结构用作一对键/数据,它有一个指向下一对具有相同哈希代码的指针。具有相同哈希代码的所有节点将位于相同的链表中。

    linkedList结构表示最终将成为哈希表中一行的链表。所有链表都将是哈希表中的一行。

    哈希表结构包含所有LinkedLists。

    如何在哈希表结构中创建linkedList结构的数组?在我的3个结构中是否有其他成员被我忽略了?

    感谢任何帮助!

    附注。我计划使用我在我的链表程序中写的方法。这里是它的早期版本的链接:https://codereview.stackExchange.com/questions/176904/my-linked-list-implementation-in-c

  • 共有1个答案

    苗盛
    2023-03-14
    typedef struct linkedList{
        node* head;
        node* tail;
        size_t size;
    } linkedList;
    

    我不认为您真的需要size_tsize。对于实际的哈希表结构,您可以执行以下操作:

    typedef struct has_map {
        linkedList** table; // stores the actual collision chains.
        size_t table_capacity; // the current capacity of table.
        size_t size; // number of mappings in this hash map.
    } hash_map;
    

    另外,我建议您将table的长度保持为2的次方:2,4,8,16,...这样您就可以使用位操作hash_code%hash_map->table_capacity更改hash_code&(Hash_map->table_capacity-1)

     类似资料:
    • 我正在尝试使用javascript实现哈希表。目前,一切都正常,但我的get方法在给定特定键的哈希表中检索值时遇到了麻烦。我使用线性探测来避免冲突。当我散列键“亚历杭德罗”时,我将键映射到0索引。然后我将其添加到我的哈希表中。然后我尝试“Rosalby”,它也映射到0索引。我使用线性探测来找到下一个可用的插槽,在我的例子中,空索引是1,我将Rosalby的值放在那个插槽中。到目前为止,我似乎很好地

    • 我知道我们可以使用链表来处理哈希映射的链式冲突。然而,在Java中,哈希映射实现使用数组,我很好奇Java是如何实现哈希映射链冲突解决的。我确实在Java HashMap中找到了这篇文章:冲突解决。然而,这不是我想要的答案。 谢谢。

    • 主要内容:Hashtable 类中的属性,Hashtable 类中的方法在 C# 中,Hashtable(哈希表) 类表示根据键的哈希代码进行组织的键(key)/值(value)对的集合,可以使用键来访问集合中的元素。也就是说当您需要使用键来访问指定元素时,可以选择使用哈希表。 Hashtable 类中的属性 下表中列出了 Hashtable 类中一些常用的属性: 属性 描述 Count 获取哈希表中包含的键值对的个数 IsFixedSize 获取一个值,用来表示哈希

    • 我想使用链接和链表实现我自己的哈希表,但我很难弄清楚如何在main方法中使用实现。我需要读取一个逗号分隔的数据文件和存储名称作为键和两个浮点作为一个值。我知道我需要使用面向对象编程,但我有一个困难的时间访问我的数据使用我的实现。 下面是我的代码:public class LinkedListHash{ 任何改进代码的方法都是有帮助的。请记住,我不是一个非常有经验的程序员,所以我为任何可怕的错误道歉

    • 问题内容: HashMap中的Hash Collision或Hashing Collision并不是一个新话题,我遇到了多个博客和讨论区,解释了如何产生Hash Collision或如何以模棱两可和详细的方式避免它。我最近在一次采访中遇到了这个问题。我有很多事情要解释,但我认为准确地给出正确的解释真的很困难。抱歉,如果我在这里重复我的问题,请给我准确的答案: 哈希冲突到底是什么?它是一项功能或常见

    • 问题内容: 建议在HTML页面中使用表格(现在已经有了CSS)? 表格有什么用途?表具有哪些CSS所没有的功能? 问题答案: 一点都不。但是将表格用于表格数据。只是不要将它们用于一般布局。 但是,如果您显示表格数据(例如结果或什至是表格),请继续使用表格!