【发布时间】:2009-03-23 19:17:20
【问题描述】:
我正在寻找一种好的数据结构来在树的节点上构建等价类。在理想的结构中,以下操作应该是快速的(O(1)/O(n),视情况而定)并且容易(没有神秘代码段落):
- (A) 从树根出发;在每个节点上 --> 子转换枚举子节点的所有等效版本
- (B) 合并两个等价类
- (C) 从现有节点(子节点)和其他数据的列表中创建新节点
- (D) 找到任何结构上与node 等价的节点(即它们具有相同数量的子节点,对应的子节点属于相同的等价类,并且它们的“其他数据”相同)使得新的(或新修改的)节点可以放在正确的等价类中(通过合并)
到目前为止我已经考虑过(其中一些可以组合使用):
- 冻糕,其中子代是对节点集合的引用,而不是对节点的引用。 (A) 速度快,(B) 需要遍历树并更新节点以指向合并的集合,(C) 需要找到包含新节点的每个子节点的集合,(D) 需要遍历树
- 根据节点的特征维护节点的散列。这使得 (D) 更快但 (B) 更慢(因为当等价类合并时必须更新哈希)
- 将节点串在一起形成一个循环链表。 (A) 很快,(B) 会很快,但是事实上,将循环列表的一部分与自身“合并”实际上会拆分列表 (C) 会很快,(D) 需要遍历树
- 与上面类似,但在每个节点中都有一个额外的“向上”指针,可用于查找循环列表的规范成员。
我错过了一个甜蜜的选择吗?
【问题讨论】:
-
标签应该是算法,而不是算法。
标签: algorithm language-agnostic data-structures tree equivalence-classes