我有大量的树木数据集,我想通过指定一个treelet(连接的子图)进行搜索。查询应返回数据集中所有小树的出现。
有有效的算法可以做到吗?
我想到的是后缀数组,但是,天真地将树编码为字符串(按其节点的固定遍历顺序)将不起作用,因为搜索小树可以是任意形状。
更新:
有关我期望的典型实例的一些详细信息:
数据集将至少包含数万棵树,每棵树包含约20至30个节点。树不会不是二叉树,但是每个节点的典型子节点数会很小(通常不大于4或5,尽管在某些退化的情况下可以达到约30)。标签的数量将是数万个。
对于NLP应用程序,我需要这样做:每棵树将成为句子的依存关系分析,每个节点代表一个单词出现,每个标签为一个字典单词(带有某种修饰)。
1
本书主要讨论子树同构的并行算法。
—
Anthony Labarre 2011年
抱歉,我想您正在寻找一个连接的子图,该子图一定是一棵树,出现在给定的树中。您能否说明您的问题在哪些方面与本说明有所不同?
—
Anthony Labarre 2011年
您事先对树木了解吗?二进制?您期望多少个不同的节点标签?对空间效率有任何限制吗?我问是因为如果您在同一个数据集上运行大量查询,则解决方案可能涉及某种类型的主动索引。
—
伊莱(Eli)
您熟悉XML树枝匹配吗?您的问题似乎是特例,因此您可以简单地使用任何现有算法和软件。
—
Marek Chrobak
我猜想最好是忽略图形结构。给定一个典型的查询,如果您放弃结构,那么您期望拥有所有这些词的树数是多少?您的查询中是否有通配符,或者它们是正确的?如果查询中的单词类似于“猫吃了帽子”,那么实际上有多少图同时包含“猫”和“帽子”两个词?如果仅将每个单词索引到一组树上,然后与所有树相交,则可能会天真地搜索结果而不会产生太多费用。
—
伊莱