假设我在S上有一个位姿“ S”和一个单调谓词“ P”。我想找到S的一个或所有满足P的最大元素。
编辑:我有兴趣减少P的评估数量。
存在针对此问题的哪些算法,它们在S上需要哪些属性和其他操作?
重要的特殊情况如何,例如:
- S是线性顺序-只要您执行“查找中间”操作,常规二进制搜索就可以工作
- S是一个晶格
- S是子集格
- S是一个多集格
- ...
后两种情况似乎特别重要,例如对于实验设计-您具有一组布尔值或实际参数,并且您希望找到它们的最小组合以重现特定模式(例如失败的测试)。
假设我在S上有一个位姿“ S”和一个单调谓词“ P”。我想找到S的一个或所有满足P的最大元素。
编辑:我有兴趣减少P的评估数量。
存在针对此问题的哪些算法,它们在S上需要哪些属性和其他操作?
重要的特殊情况如何,例如:
后两种情况似乎特别重要,例如对于实验设计-您具有一组布尔值或实际参数,并且您希望找到它们的最小组合以重现特定模式(例如失败的测试)。
Answers:
我还没有考虑透彻,所以如果我错了,请纠正我。
假设是摆管的宽度。
对于仅包含不连续链的并集的位姿,只需将二进制搜索的查询复杂度的标准下限应用于每个链,就至少需要个的评估。
由于您免费进行比较,因此可以免费将坐姿链分解为条链。对每个链进行二进制搜索,以找出满足的第一个元素。然后遍历已识别的元素并删除所有主要元素。的评估数为。标识所有最大元素,因为每条链最多可以有一个最大元素。
添加:实际上,我看到一种简单的递归算法可以对子集的晶格做得更好()(编辑:domotor在他的回答中描述了一般策略)。在这里,我假设是向下单调的(即子集形成一个较低的集合),这就是您的意思。因此,这是查找较低集合的成员的算法:
a)测试。如果为0,则停止。
b)测试。
bi)如果为0,则在上递归(确定,因为包含集合不能在较低的集合中)。
b.ii)如果为1,则在子晶格存在较低集合的成员。该子晶格与同构,因此我们可以再次递归。更准确地说,我们可以针对运行算法,但是当算法要求评估,我们评估,其中。2 [ Ñ - 1 ] 2 [ Ñ - 1 ] P (Ý )P (X )X = ý ∪ { Ñ }
因此,在每一步中,我们递归于一个子格,该子格的大小是原始格的一半。总的来说,我们最多需要评估次(实际上,您可以实施算法来评估谓词次,正如Yoshio指出的那样,因为您只需要检查一次)。2 Ñ Ñ + 1 ∅
如果是一棵树,则存在构造最佳决策树的多项式时间算法。
Daskalakis等人最近的一篇论文表明,对于大小为且宽度为的波塞,可以在时间找到最少的元素。有趣的是,他们在摘要中说w O (w n )
寻找高效的静态和动态数据结构,对于部分订单起着相同的作用,而堆和二进制搜索树对总订单起着相同的作用,这也将很有趣。
如果S是输入的一部分,那么找到最大元素的问题已经变得``NP困难''(如果我们认为晶格使其元素为n位长字符串),例如可以说如果某些固定CNF的CNF(x)不是true,而CNF(y)是true。
另外,可能有很多满足P的最大元素,因此即使输出所有元素也可能需要很长时间,因此我认为只希望找到一个最大元素。
通常,如果您可以递归选择元素,以便在留下上述元素之后,或者删除上述元素,然后在每个此类集合中删除固定比例的元素,则二进制搜索有效。
例如。如果S是固定尺寸的网格,则有一个快速算法:总是将一个坐标减半,而使另一个坐标减至最小,因此例如在第一步中要问(n / 2,0,...,0)。
一个重要的相关定理是Tarski不动点定理,在该定理中,您不是从P而是从晶格到其自身的单调映射。定理说不动点形成格子。我们用Jaroslaw Byrka和Paul Duetting证明,在这种情况下,如果晶格是d维网格,则可以在大约时间内找到一个固定点,其中该算法是二进制搜索的简单概括。