在这种情况下是否可以创建一个最小完美哈希函数?

2024-04-13

我想创建一个哈希映射(或其他结构,如果您有任何建议)来存储键值对。这些键将在创建地图的同时一次性插入,但我不知道键是什么(任意长度的字符串),直到运行时,当我需要创建地图时。

我正在解析这样的查询字符串"x=100&name=bob&color=red&y=150"(但是字符串可以有无限数量的变量,并且变量可以有任意长度的名称)。

我想解析一次并创建一个哈希映射,最好是最小的并且具有完美的哈希函数以满足线性存储要求。创建映射后,值将不会被修改或删除,也不会再向映射添加更多键值对,因此整个映射实际上是一个常量。我假设一个变量不会在字符串中出现两次(IE."x=1&x=2"无效)。

我正在编码C,目前有一个我可以使用的功能,例如get("x")这将返回字符串"100",但它每次都会解析查询字符串,这需要O(n)时间。我想在第一次加载时解析它一次,因为它是一个非常大的查询字符串,并且每个值都会被读取多次。即使我正在使用C,我不需要代码C作为答案。伪代码,或者任何建议都很棒!


尝试 GPL 许可gperf http://www.gnu.org/software/gperf/, or Bob Jenkins 在 C 中的公共域实现 http://burtleburtle.net/bob/hash/perfect.html

程序:

  • 接收查询字符串并通过枚举键列表来识别完美哈希函数的域

  • 将这些键和列表大小(范围为 1..size)提供给从上述参考实现派生的完美哈希生成函数

  • 使用生成的完美哈希函数创建HashMap

  • 使用相同的完美哈希函数来处理getHashMap 中的请求

EditNecrolis 在下面的评论中指出,参考实现在 C 源代码中输出完美的哈希函数,因此您需要修改它们以生成类似于 VM 的字节码之类的内容。您还可以使用解释性语言,例如嵌入式Scheme 或Lua。

有趣的是,当创建完美哈希函数的开销通过查找分摊时,这是否值得在简单(非完美)HashMap 上付出努力

另一种选择是布谷鸟哈希 http://en.wikipedia.org/wiki/Cuckoo_hashing其中也有 O(1) 查找

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在这种情况下是否可以创建一个最小完美哈希函数? 的相关文章

随机推荐

  • 不可能:没有附加布局管理器;跳过布局

    我完全迷失了这个错误 我理解它 但我不知道出了什么问题 对于代码 In the OnCreate of my activity historyRecyclerView RecyclerView findViewById R id recyc
  • 在 kotlin 中何时一起使用挂起函数和 Flow 或分开使用?

    在审查用 kotlin 编写的一些代码时 有件事引起了我的注意 我在一些项目中查看领域层 在一些项目中 我看到挂起功能和 Flow 一起使用 而在一些项目中 我看到只使用 Flow 例如暂停和流动在一起 class FetchMovieDe
  • 如何在Python中隐藏控制台窗口?

    我正在用 Python 编写一个 IRC 机器人 我希望为 Linux 和 Windows 制作独立的二进制文件 主要是我希望当机器人启动时 控制台窗口应该隐藏 并且用户不应该看到该窗口 我能为此做些什么呢 只需将其保存为 pyw扩大 这将
  • 将一个变量设置为等于另一个变量[重复]

    这个问题在这里已经有答案了 我有一些关于在 JavaScript 中将变量设置为等于另一个变量的问题 假设我们创建一个对象 a并设置b a var a fname Jon lname Smith age 50 var b a 我明白如果我们
  • 音色 `set-config!` 已经改变了数量,因此不知道如何使用它来将 std err/out 输出到文件

    我正在尝试使用https github com ptaoussanis timbre https github com ptaoussanis timbre记录到文件而不是控制台 以下是我找到的一些有关如何执行此操作的文档 The defa
  • 为 libstdc++ 生成 CTAGS(来自当前 GCC)

    I know 你完成了我 https github com Valloric YouCompleteMe基于 LLVM 但我想使用OmniCppComplete http www vim org scripts script php scr
  • 操作码的十六进制值

    我创建了一个非常简单的汇编程序 可以在 DOS 中打印字母 a 我在十六进制编辑器中打开它 结果是这样的 汇编代码 mov ah 2 mov dx a int 21h 十六进制代码 B4 02 B2 61 CD 21 我想了解它是如何生成的
  • 在 pdf 中按宽度调整内容

    渲染为 pdf 时 我需要 html 页面为打印宽度的 100 否则内容会被切断 是否有捷径可寻 我想出了一个解决方法 它在渲染后获取 html 宽度 然后设置缩放系数以强制正确的宽度 var page require webpage cr
  • 如何确定视图的列是派生的还是常量?

    假设我有下表 create table t Item ItemID int not null identity 1 1 constraint PK Item primary key Description varchar 256 not n
  • Apache AVRO 与休息

    我正在评估将 Apache AVRO 用于我的 Jersey REST 服务 我将 Springboot 与 Jersey REST 结合使用 目前我接受 JSON 作为输入 并使用 Jackson 对象映射器将其转换为 Java Pojo
  • Laravel 4:在包中部署自定义 artisan 命令

    我开发了一些自定义 artisan 命令 以便更轻松地与我的包一起使用 是否可以将 artisan 命令包含到包中以便于部署 如果可以 怎样做 Thanks 在你的包结构中有一个命令集
  • 如何获取包含越界对象的绘图尺寸

    我可以这样计算图的高度 library ggplot2 library egg library gridExtra g lt ggplot iris aes x Species y Petal Length stat summary geo
  • 如何在 Laravel 中检索 Mailgun 传递的消息

    在我的 Node js 应用程序中 我遵循了 Mailgun 文档https documentation mailgun com en latest quickstart sending html send with smtp or api
  • GitHub 页面和相对路径

    我创建了一个gh pages我正在 GitHub 上开发的一个项目的分支 我使用 Sublime text 在本地创作网站 我的问题是 当将其推送到 GitHub 时 所有指向 javascrips 图像和 css 文件的链接都无效 例如
  • 如何存储我的网络应用程序的指标?

    我需要为我的网络应用程序存储更多指标 需要随着时间的推移跟踪和比较用户行为和其他条件 有些记录有与之关联的时间戳 有些则没有 因此 按需查询指标可能并不总是合适 我认为需要的是我编写然后存储在某个地方 数据库 文件 的某些分析查询 通过 c
  • find_package 用于使用 Visual Studio 进行调试和发布

    我正在为如何将第三方库包含在我的 cmake 项目中而绞尽脑汁 目前 我构建了 Poco 和其他一堆 它们都生成各自的 Config cmake 我将其与 find package 一起使用 我有一个包装构建脚本 用于构建所有依赖项并将它们
  • 将 Scala Iterable[tuple] 转换为 RDD

    我有一个元组列表 String String Int Double 我想将其转换为 Spark RDD 一般来说 如何将 Scala Iterable a1 a2 a3 an 转换为 Spark RDD 有几种方法可以做到这一点 但最直接的
  • M2Eclipse,META-INF/MANIFEST.MF

    我在 Eclipse 中使用 M2Eclipse 插件 而且不知道什么原因 每次在Eclipse中导入Maven项目时 总是生成一个空的 src main META INF MANIFEST MF 文件 jar 打包的项目 src main
  • Web API 2、OWIN 身份验证、SignOut 不注销

    我正在做一些研究 以期使用 Bearer 令牌作为身份验证机制 即 AngularJS UI 通过 Web API 2 项目中的 OWIN 进行身份验证 我的登录工作正常 角色信息等一切都很好 但我无法获取用于注销的令牌 我的启动配置是这样
  • 在这种情况下是否可以创建一个最小完美哈希函数?

    我想创建一个哈希映射 或其他结构 如果您有任何建议 来存储键值对 这些键将在创建地图的同时一次性插入 但我不知道键是什么 任意长度的字符串 直到运行时 当我需要创建地图时 我正在解析这样的查询字符串 x 100 name bob color