技术问询:是否存在消除冗余排序语句的标准算法?
序关系断言集合的约简算法
你说的这类冗余序关系断言的约简问题,有明确的标准解法——**偏序集的传递约简(Transitive Reduction)**算法,核心就是在不改变原序关系传递闭包的前提下,保留最少的非冗余断言。
具体做法可以拆解成这几步:
- 核心判断规则:只保留「直接覆盖」的序关系——也就是对于断言
x < y,不存在任何元素z能让x < z且z < y同时成立,这类断言无法通过其他断言推导出来,必须保留;反之就是冗余断言,可以删除。 - 实际操作流程:
- 先算出原断言集合的传递闭包(也就是所有能通过现有断言推导出来的序关系,包括原断言和间接推导的结果)。
- 逐个检查原集合里的每一条断言:如果这条断言能在传递闭包里通过其他两个断言的组合推导出来,就删掉它;否则保留。
拿你给出的例子来说:
原断言集合是A < B、A < C、B < C
传递闭包包含所有可推导的关系:A<B、A<C、B<C
检查每条断言:
A < B:找不到中间元素,保留A < C:能通过A<B和B<C推导出来,属于冗余,删除B < C:找不到中间元素,保留
最终约简后的集合就是A < B、B < C,完全保留了原序关系的所有信息,没有冗余。
内容的提问来源于stack exchange,提问作者spraff
相关产品推荐
相关产品推荐

