首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从现有哈希表创建新哈希表

从现有哈希表创建新哈希表
EN

Stack Overflow用户
提问于 2021-12-24 09:44:17
回答 1查看 89关注 0票数 0

假设我们有一个包含2^16键和值的哈希表。每个键可以表示为一个位字符串(例如,0000、0000、0000、0000)。现在我们要构造一个新的哈希表。新哈希表的键仍然是位字符串(例如0000、*)。当*取0或1时,相应的值将是旧哈希表中所有值的平均值。例如,0000、*是旧哈希表中从0000、0000、0000到0000、1111、1111、1111、1111之间的2^12值的平均值。直观地,我们需要做C(16,4) * 2^16次来构造新的哈希表。构造新哈希表的最有效方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2021-12-24 17:00:09

这里的哈希表根本帮不了你,尽管它也不是什么障碍。

哈希表本质上不能按键前缀进行群集键。为了提供良好的散列分布,需要在哈希值之间尽可能均匀地分配密钥。

如果以后需要按特定顺序处理密钥,则可以考虑有序关联映射,例如平衡二叉树或trie的某个变体。另一方面,需要展示按顺序处理密钥的优势,以便证明有序映射的额外开销是合理的。

在这种情况下,每个键都需要被访问,这意味着有序映射和散列映射都是O(n),假设线性时间遍历和恒定时间处理都是合理的假设。但是,在处理每个结果值时,需要两个累积的中介体,基本上是一个正在运行的总计和一个计数。(有一种计算级数平均值的“在线”算法,但它也需要两个中间值,即运行均值和计数。因此,尽管它有优势,但减少存储需求并不是其中之一。)

您可以使用输出哈希表来存储每个输出值的中间值之一,但需要在某个地方放置另一个值。这可能是另一个相同大小的哈希表,或者类似的东西;在任何情况下,都会增加存储成本。

如果可以按前缀顺序遍历原始哈希表,则可以将此存储成本降为常数,因为每次到达新前缀时都可以回收这两个临时值。这是一种节省,但我怀疑它是否足以证明有序关联映射的开销是合理的,这也包括增加存储需求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70471562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档