- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于我正在考虑的应用程序,将有一个大型(100,000+)树“数据库”(想想编程语言中的表达式,或 S 表达式),并且我需要在该数据库中查询以下表达式:匹配特定的给定表达式。
在提供我想要的详细信息之前,请注意,我希望获得与索引一大组树以优化子树查找相关的任何信息。
在我的具体情况下(这将是 Metamath 证明助手使用的后端),表达式具有以下结构(采用类似 Haskell 的表示法):
data Expression = Placeholder Id | VarName Id | ConstName Id [Expression]
或者作为 S 表达式形式的 BNF:
Expression = '?' Id | Id | '(' Id Expression* ')'
其中 Id
是某种标识符。
例如,我可以有一个包含如下表达式的数据库
(equiv ?ph ?ps)
(not (in (appl (sqrt) (2)) (Q)))
(equiv (eq ?A ?B) (forall ?x (equiv (in ?x ?A) (in ?x ?B))))
在此上下文中,如果可以通过用表达式替换占位符来使两个表达式相等,则它们匹配。因此,在上述迷你数据库中查找 (equiv (eq A (emptyset)) ?ph)
将得到第一个和最后一个表达式。
再说一遍:我如何在一大堆带有占位符的(表达式)树中实现快速查找?我可以使用什么样的索引数据结构?
最佳答案
我将使用 trie 来实现查找。每个 key 将包含以下内容之一:
这些应该以某种方式排序 - 可能是占位符,然后是所有 ConstNames(字母顺序),然后是变量(范围排序,然后是参数顺序),然后是 ConstValues(数字顺序)。只要 trie 中有具体的使用顺序,就可以了。
遍历表达式的树,在遇到适当的键时将其注入(inject)到 trie 中。对要插入数据结构中的所有表达式执行此操作。当需要查询它时,您可以以类似的方式遍历 trie,但使用一些新规则。
现在,这确实意味着当您遇到占位符时,搜索空间可能会有所“爆炸”,但您可以做一件事来尝试在实践中减轻这种情况。以广度优先的方式遍历表达式的树(在构造 trie 和查询中)。这意味着,如果其中一个参数是占位符,则您不必全面深度搜索与该表达式匹配的每个子树到目前为止 - 相反,您可以跳转到下一个参数 - 这可能不会是一个占位符,因此将大大减少搜索空间(与匹配“所有内容”相比)。
为了完整起见,让我们举一个例子
(not (in (appl (sqrt) (2)) (Q)))
并从中创建一个特里条目-
not -> in -> apply -> "Q" -> sqrt -> 2
添加 (不是(in ?ph E))
到此将导致 -
not -> in -> apply -> "Q" -> sqrt -> 2
\-> ?ph -> "E"
继续以这种方式将表达式注入(inject)到 trie 中。同样以这种方式遍历进行查询,直到到达 trie 中搜索的末尾,然后返回匹配的内容。
注意 - 这些条目的唯一性基于您不必支持可变参数函数的假设。如果这样做,请为每个键附加一些上下文信息(阅读下一段以了解如何执行此操作的信息)以区分哪些参数进入哪些函数
我忽略了一个细节——变量。如果您只想在它们是完全相同的变量名时进行匹配,则无需进行任何工作。但这可能不是您想要的;您可能希望它匹配通用变量,只要它们彼此“一致”即可。执行此操作的方法是为每个变量分配一个标识符,该标识符表示首次定义该变量的范围。
最简单的方法就是根据其祖先的参数顺序的串联组成一个标识符。也就是说,如果一个变量首先被定义为函数的第二个参数,而该函数又是根函数的第五个参数,那么我们可以将其标记为 ( 5, 2)
或 (2, 5)
,以更直观的方式为准。无论哪种方式,这都将确保为变量提供一致的标识符,而不管其他地方的其他变量/函数如何。然后使用这个新变量名称正常进行。
关于indexing - 使用占位符快速查找树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45627314/
我尝试使用以下 json,但 wiremock 无法识别我的更改。我看了wiremock的文档,看到他们说:JSON相等匹配是基于JsonUnit的,因此支持占位符。我也尝试使用 JDK 8 和 JD
我发现这种方法可以使用 mixin 轻松添加 @media block : @mixin phone() { @media only screen and (max-width: 480px)
我有四个依赖的选择列表,我想给所有选择列表一个默认值/占位符,如下所示:select ... 。问题是,当我尝试这样做时: Select ... 它不起作用。因为当我更改第一个选择列表时,其他选择列表
所以我只是浏览我们的库存管理系统的代码我看到了我一位同事的一些片段,他在某些功能中所做的只是例如,只需打开它们并在其中插入命令 procedure TWerkStF.TBBtnStatiClick(S
因此,对于我当前的 Bukkit(Minecraft)插件,我必须使用 ItemStacks 的名称。我通过这样做得到这些名字 item.getItemMeta().getDisplayName();
我想为 JAVA 开发一个猜词游戏,但在开发 GUI 时遇到了一些困难。我并不是想开发一个仅使用一个文本字段的简单 GUI,我想开发一个更像移动设备的 GUI。因此,我希望白框显示为单词中字符的占位符
我想测试输出是否如下所示: String s1 = "You have 5 Dollar in your bank account." 要通过测试,字符串需要相等,所以我需要一个相等的字符串: Str
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭11 年前。 Improve th
我一直在使用 JavaScript 占位符脚本来支持 IE 占位符。 适用于输入类型 = 文本。但是我该如何在脚本中添加一个支持 textarea 的内容呢? 我的代码是: function acti
我正在寻找一个正则表达式,它可以正确检测字符串中是否存在 printf() 类型的占位符。 最佳答案 事实证明这比看起来要复杂一些,答案取决于您想对占位符做什么,以及您对 printf 和正则表达式使
注意占位符在 Stackoverflow 提问标题和 Twitter 注册表单上的工作方式:https://twitter.com/signup 占位符有两种状态: 未选择(显示占位符) 已选择,但有
我想将"template"文件的输出通过管道传输到 MySQL,该文件散布着 ${dbName} 等变量。替换这些实例并将输出转储到标准输出的命令行实用程序是什么? 输入文件被认为是安全的,但可能存在
我有一个像这样的js数组: let data = [{status:"stay",points:[1,2,3,4,5]}, {status:"move",points:[1,2,3,4,5]},{st
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Show default value for editing on Python input possible? 我
我正在尝试使用 python format 方法将我的占位符格式化为字符串。 问题是字符串内部包含 {} 并且字符串方法无法解析它。 my_value='v' '{"k":"{value}"}'.fo
我正在使用 PHP + CodeIgniter 构建一个多语言应用程序。我决定使用 gettext 进行 UI 文本翻译,到目前为止,它已被证明高效且易于使用。 但现在我遇到了一些非常烦人的事情:ge
我有一个 NSAttributedString 看起来像 “一些字符串 bold %@ template %f %d blah blah blah” 我希望能够像 [NSString stringWi
我喜欢偶尔为占位符使用空函数(主要是空构造函数,因为它有助于避免构造函数的意外重复,因为我的团队知道必须始终有一个构造函数)。 我还喜欢对一个类的每个方法至少进行一次测试(主要是因为这是一个很好的简单
我正在尝试向 Angular 4 上的选择添加占位符,但无法使其正常工作, 这是我的代码: Please select one option {{ select
有没有办法在 sqlite3 中设置查询的占位符?我有一些与数据库一起工作的函数,如果它们可以同时与 mysql 和 sqlite 一起工作,那就更令人满意了。Mysql 和 Postgres pyt
我是一名优秀的程序员,十分优秀!