【问题标题】:Rationale in selecting Hash Key type选择 Hash Key 类型的理由
【发布时间】:2011-02-09 00:22:21
【问题描述】:
伙计们,我有一个数据结构,它有 25 个不同的键(整数)和一个值。我有这些对象的列表(比如 50000),我打算使用哈希表来存储/检索它们。我计划采用其中一种方法。
从这 25 个整数键创建一个整数哈希,并将其存储在哈希表中。 (是的!我有办法处理碰撞)
对各个键进行字符串连接,并将其用作哈希表的哈希键。例如,如果键值为 1、2、4、6、7,则哈希键将为“12467”。
假设我总共有 50000 条记录,每条记录有 25 个不同的键和一个值,那么当涉及到检索和插入记录所需的字符串比较成本时,我的第二种方法是否会过大?
更多信息!
- 哈希表中的每个桶都是平衡的二叉树。
- 我正在使用 boost 库的 hash_combine 方法从 25 个键创建散列。
【问题讨论】:
标签:
c++
string
integer
hashtable
key
【解决方案1】:
绝对使用第一种方法,因为如果使用第二种方法,您将需要一个具有1x10^(25m), where x is the maximum length of a key 可用插槽的哈希表。
例如,如果键的最大数量是 9999,m 将是 4,并且您的表中需要 1x10^100 个插槽。
说明:
哈希表背后的想法是,您可以以 O(1) 的效率(除了冲突)随机访问任何元素,因为任何元素的哈希实际上就是它在哈希表中的位置。因此,例如,如果我对对象 X 进行哈希处理并返回 24 的哈希值(或一些转换为数字的字符串哈希值,结果是 24),我只需转到表的插槽 24(通常实现为数组),并且可以检索对象 X。
但是,如果您使用第二种方法(连接 25 个数字 - 我们将在这里说数字以简化事情 - 一起生成哈希),最大的哈希将是 99999999999999999999999999。因此,要从哈希表中检索该对象,您必须从位置 9999999999999999999999999 检索它 - 这意味着您的桌子必须至少有那么多点。
请记住,对于第一个 - 因为您使用的是二叉树,所以碰撞不会有那么大的问题。最坏的情况将是 O(log(n)) 的检索/插入效率,这并不是那么糟糕。