代码之家  ›  专栏  ›  技术社区  ›  Amrit

C语言中的哈希表设计

  •  -1
  • Amrit  · 技术社区  · 11 年前

    我有一个关于HASH功能的设计问题。

    在我的程序中,我使用的是 size 2^13 ,其中插槽是基于我要插入的节点(哈希密钥)的值计算的。

    现在,假设我的每个节点都有两个值 |A|B| 但是,我正在使用将值插入哈希表 A .

    稍后,我想搜索一个特定的节点 B not A .

    这样可能吗?是的,你能强调一些设计方法吗? 限制是我必须使用 A. 作为散列密钥。

    对不起,我无法共享代码。小示例:

    Value[] = {Part1, Part2, Part3};
    insert(value)
    check_for_index(value.part1)
    

    value.part1 用于计算插槽的索引。

    找到插槽后,插入 "value"

    过后

    search_in_hash(part2)
    
    check_for_index("But here I need the value.part1 to check for slot index")
    

    那么,我该如何将 part1, part2 & part3 这样我以后就可以通过以下方式找到空位 part2 or part3

    如果问题陈述含糊不清,请告诉我。

    1 回复  |  直到 11 年前
        1
  •  0
  •   Leeor    11 年前

    除非你打算逐个元素进行搜索(在这种情况下,你不需要哈希,只需要一个简单的列表),否则你基本上要问的是——我能有一个哈希吗,比如hash(X)==hash(Y),但X=Y、 这样您就可以使用part1映射到一个位置,然后使用part2或part3映射到同一个位置。这与哈希所代表的完全相反。

    你应该做的是(正如viraptor也建议的那样)创建3个结构,每个结构都使用值的不同部分进行散列,并将全部值推送给所有3个。然后,当你需要搜索时,根据你想要搜索的部分使用正确的哈希。

    例如:

    value[] = {part1, part2, part3};
    hash1.insert(part1, value)
    hash2.insert(part2, value)
    hash3.insert(part3, value)
    

    然后

    hash2.search_in_hash(part2)
    

    hash3.search_in_hash(part3)
    

    上面的2应该产生完全相同的值。

    还要确保所有数据操作(删除值、更改值)都是同时对所有3个结构进行的。例如-

    value = hash2.search_in_hash(part2)
    hash1.remove(value.part1)
    hash2.remove(part2)        // you can assert that part2 == value.part2
    hash3.remove(value.part3)