程序解释期间高效的增量哈希计算

2024-06-25

我想写一个递归记忆Scheme解释器。在求值过程中的任何时刻,解释器都应该能够检测到它何时接收到之前见过的一对表达式和环境作为参数。

简单记忆eval and apply效率低下。每次调用时都需要在哈希表中查找参数eval/apply,这需要遍历哈希表匹配上的整个(可能很大)参数。

例如,假设解释器评估程序

(car (list A))

其中 A 计算为一个大对象。当口译员评估申请时(list A),它首先评估list and A单独。在适用之前list to A,它在哈希表中查找以前是否见过这个应用程序,遍历整个A计算哈希值的对象。稍后,当记忆解释器应用时car对于包含 A 的列表,它计算该列表的哈希值,这再次涉及遍历整个 A 对象。

相反,我想构建一个解释器逐渐建立大约唯一的哈希值,尽可能避免重新计算并保证不太可能发生冲突。

例如,可以使用其值的 MD5 递归地扩展解释器操作的每个对象,或者,如果它是复合对象,则使用其组件散列的 MD5。环境可以存储其每个变量/值条目的散列,并且环境的散列可以被计算为各个散列的函数。然后,如果环境中的条目发生变化,则无需重新遍历整个环境来计算环境的新哈希。相反,仅需要重新计算已更改的变量/值对的哈希,并且需要更新条目哈希集的全局哈希。

是否存在关于逐步构建近似唯一散列的相关工作,特别是在递归记忆和/或程序评估的背景下?


请注意,如果表达式是不可变的(不允许自修改代码),那么您可以对它们使用 EQ 相等。如果环境是不可变的,你可以同样对待它们。 EQ 相等速度很快,因为您只需将机器指针中的位作为哈希值。

问题是赋值会改变环境,导致表达式值发生变化。如果允许的话,该如何处理。

一种方法是记下在其词法范围内包含破坏性代码的环境,并以某种方式对它们进行注释,以便评估器可以识别此类“受污染的环境”,而不会对它们进行缓存。

顺便说一句,您显然需要具有弱语义的哈希表,以便任何成为垃圾的对象都不会堆积在内存中。

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

程序解释期间高效的增量哈希计算 的相关文章

  • 如何将只缓存某些内容的字段添加到ADT?

    我经常需要向 ADT 添加字段 仅记住一些冗余信息 但我还没有完全弄清楚如何又好又高效地做到这一点 说明问题的最好方法是举个例子 假设我们正在使用无类型 lambda 项 type VSym String data Lambda Var V
  • 使用您正在散列的内容的散列作为盐?

    假设用户注册了您的网站 您对他们选择的密码进行哈希处理 然后使用该哈希值作为盐 并使用该盐重新哈希其密码 Example String hash1 MD5 password String endHash MD5 hash1 password
  • JavaScript 文件中的快速低冲突非加密哈希

    我正在寻找一种用 JavaScript 实现的低冲突的快速哈希 它不需要是加密哈希 我基本上使用它作为查看给定文件是否已上传 或部分上传 到用户帐户的方式 以节省他们在大型 视频 文件上上传的时间 我正在使用新的 HTML5 文件 API
  • 一次性的 lisp 宏,我的实现正确吗?

    我正在尝试从 Peter Seibel 的书 Practical Common Lisp 中学习 Lisp 在第 8 章 宏 定义你自己的 http www gigamonkeys com book macros defining your
  • 如何为 bcrypt.hashpw 设置盐?

    salt yhnqazolr123098765 password bcrypt hashpw password salt repeatpassword bcrypt hashpw repeatpassword salt 我在第二行遇到错误
  • ruby 的 String .hash 方法如何工作?

    我只是红宝石的新手 我见过一个字符串方法 String hash 例如 在irb 我试过了 gt gt mgpyone hash returns gt 144611910 这个方法是如何工作的 The hash方法是为所有对象定义的 看文档
  • 关于执行令的问题

    我正在尝试学习 Common Lisp 并在 repl 中尝试某些东西时发现了一些意想不到的东西 对我来说 基于大多数编程语言的执行顺序 以及我一直从 lisp 听到的出色的一流函数支持 我认为以下应该可行 if t format t te
  • “映射”是否一定会产生额外的嵌套级别?

    是否使用嵌套map自动创建另一层嵌套 这是我使用的一个基本示例 One level map lambda x1 Hi 1 Two levels map lambda x1 map lambda x2 Hi 1 1 Three levels
  • 如何用另一个响应替换窗口的 URL 哈希?

    我正在尝试使用替换方法更改哈希 URL document location hash 但它不起作用 function var anchor document location hash this returns me a string va
  • 如何在 Ubuntu Karmic 上安装 LFE?

    Erlang 已经安装 dpkg l grep erlang ii erlang 1 13 b 3 dfsg 2ubuntu2 Concurrent real time distributed function ii erlang appm
  • 添加到表现异常的 Perl 哈希

    我试图通过将时间标签从事件内移动到其父级内来更改一些 XML 以按时间对事件进行分组 那是
  • 计算 torrent 文件的信息哈希

    我正在使用 C 解析 torrent 文件的信息哈希 与此站点相比 我无法获得 正确 的哈希值 http i tools org torrent http i tools org torrent 我构建了一个非常简单的玩具示例 只是为了确保
  • 程序解释期间高效的增量哈希计算

    我想写一个递归记忆Scheme解释器 在求值过程中的任何时刻 解释器都应该能够检测到它何时接收到之前见过的一对表达式和环境作为参数 简单记忆eval and apply效率低下 每次调用时都需要在哈希表中查找参数eval apply 这需要
  • 在机器学习中使用 Scikit 对邮政编码进行特征哈希

    我正在研究一个机器学习问题 我的数据集中有很多邮政编码 8k 唯一值 因此 我决定将这些值散列到更小的特征空间中 而不是使用 OHE 之类的东西 我遇到的问题是我的哈希中唯一行的比例非常小 20 这基本上意味着根据我的理解 我有很多重复 冲
  • 使用 Python 对 CSV 进行 MD5 哈希处理

    我有一个包含电子邮件地址的 csv 需要以 MD5 格式进行哈希处理 然后将哈希后的电子邮件保存为新的 csv 我还没有看到我在 SO 上的确切用例 也无法成功修改现有问题 原始文件路径为 Users username Downloads
  • 不带 + 或 * 的乘法

    我正在努力克服如何设计程序 http htdp org靠我自己 我还没有完全掌握复杂的线性递归 所以我需要一点帮助 问题 定义multiply 它消耗两个自然数 n and x 并产生n x不使用Scheme的 排除 也从这个定义来看 用
  • Racket:识别尾递归?

    我在球拍中编写了两个不同的函数来确定数字列表是否升序 define ascending list if lt length list 1 t and lt car list car cdr list ascending cdr list d
  • 结合记忆和尾递归

    是否有可能以某种方式将记忆和尾递归结合起来 我目前正在学习 F 理解这两个概念 但似乎无法将它们结合起来 假设我有以下内容memoize函数 来自现实世界的函数式编程 http www manning com petricek let me
  • Hashie::Mash 从字符串恢复

    我在这个问题上很挣扎 我已经存储了一个Hashie Mash到一个字符串中 我很难将其恢复为哈希值 这是字符串 map Hashie Mash ncreated at Mon Jul 30 15 42 20 0000 2012 nid 22
  • 交换方案中列表中的两个元素[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐