二元搜索的二元搜索概括?


28

假设我在S上有一个位姿“ S”和一个单调谓词“ P”。我想找到S的一个或所有满足P的最大元素。

编辑:我有兴趣减少P评估数量。

存在针对此问题的哪些算法,它们在S上需要哪些属性和其他操作?

重要的特殊情况如何,例如:

  • S是线性顺序-只要您执行“查找中间”操作,常规二进制搜索就可以工作
  • S是一个晶格
  • S是子集格
  • S是一个多集格
  • ...

后两种情况似乎特别重要,例如对于实验设计-您具有一组布尔值或实际参数,并且您希望找到它们的最小组合以重现特定模式(例如失败的测试)。


1
什么是“多集”格子?
Suresh Venkat

1
它是元素映射为X-> N的晶格,Meet是元素级最小值,join是元素级最大值。可以将其推广到任何晶格,而不是将N作为共畴。
jkff 2011年

Answers:


15

我还没有考虑透彻,所以如果我错了,请纠正我。

假设是摆管的宽度。w

  1. 对于仅包含不连续链的并集的位姿,只需将二进制搜索的查询复杂度的标准下限应用于每个链,就至少需要个的评估。wwlognP

  2. 由于您免费进行比较,因此可以免费将坐姿链分解为条链。对每个链进行二进制搜索,以找出满足的第一个元素。然后遍历已识别的元素并删除所有主要元素。的评估数为。标识所有最大元素,因为每条链最多可以有一个最大元素。wPPO(wlogn)


添加:实际上,我看到一种简单的递归算法可以对子集的晶格做得更好()(编辑:domotor在他的回答中描述了一般策略)。在这里,我假设是向下单调的(即子集形成一个较低的集合),这就是您的意思。因此,这是查找较低集合的成员的算法:O(n)2[n]P{X:P(X)=1}

a)测试。如果为0,则停止。P()

b)测试。 P({n})

bi)如果为0,则在上递归(确定,因为包含集合不能在较低的集合中)。2[n1]n

b.ii)如果为1,则在子晶格存在较低集合的成员。该子晶格与同构,因此我们可以再次递归。更准确地说,我们可以针对运行算法,但是当算法要求评估,我们评估,其中。2 [ Ñ - 1 ] 2 [ Ñ - 1 ] P Ý P X X = ý { Ñ }{X:nX}2[n1]2[n1]P(Y)P(X)X=Y{n}

因此,在每一步中,我们递归于一个子格,该子格的大小是原始格的一半。总的来说,我们最多需要评估次(实际上,您可以实施算法来评估谓词次,正如Yoshio指出的那样,因为您只需要检查一次)。2 Ñ Ñ + 1 P2nn+1


哇,这么简单的主意!谢谢-我会考虑一下这似乎是否是最佳的:)
jkff 2011年

实际上,它甚至小于w log n,因为链长之为n。我想最大值约为w log(n / w)。
jkff 2011年

好的,对于线性阶数,它提供二进制搜索;对于子集晶格,其给出C(n,n / 2)log(2 ^ n / C(n,n / 2))〜exp(n)* n。不太快,但看起来也不太理想,因为实际上可能有很多答案。但是,要找到一个最大子集,您只需要在任何一条链上进行二进制搜索-这很好,我现在自称是愚蠢的,因为没有考虑它。再次感谢!
jkff 2011年

2
我认为不相交的链给您一个至少的下界(对于确定性算法)。想想一个在最后查询链中“隐藏”单一解决方案的对手。随机下界应遵循姚的极小极大原则。查找具有复杂度的单个元素可能很有趣。瓦特+ 日志Ñ Ω 瓦特瓦特+ 日志Ñww+lognΩ(w)w+logn
Sasho Nikolov

1
@YanKingYin晶格不能是(多个)不相交链的并集,因为每两个元素必须具有一个极值。如果可以对位姿进行分割,则位姿是不相交链的并集,以便来自不同部分的元素无法比拟,并且同一部分中的元素可以接受总顺序。
Sasho Nikolov


8

Daskalakis等人最近的一篇论文表明,对于大小为且宽度为的波塞,可以在时间找到最少的元素。有趣的是,他们在摘要中说w O w n nwO(wn)

寻找高效的静态和动态数据结构,对于部分订单起着相同的作用,而堆和二进制搜索树对总订单起着相同的作用,这也将很有趣。


呵呵,与log(n):)相比,听起来不太鼓舞人心,但无论如何还是要感谢!
2011年

但这就是重点。没有数据结构,即使对于完全有序的集合,也无法获得log n,因为您所能做的就是扫描。尝试找到等效的BST实际上是一个非常好的问题。
Suresh Venkat

好吧-我说的是谓词P而不是比较谓词的复杂度。
jkff 2011年

1
从某种意义上说是的,但这远非一个完整的答案-例如,对于1d或2d情况,它没有给出二等分:)您对根的建议是什么?
jkff

1
尚未确定。把想法大声说出来。但这是一个很好的问题。
Suresh Venkat

4

如果S是输入的一部分,那么找到最大元素的问题已经变得``NP困难''(如果我们认为晶格使其元素为n位长字符串),例如可以说如果某些固定CNF的CNF(x)不是true,而CNF(y)是true。x<y

另外,可能有很多满足P的最大元素,因此即使输出所有元素也可能需要很长时间,因此我认为只希望找到一个最大元素。

通常,如果您可以递归选择元素,以便在留下上述元素之后,或者删除上述元素,然后在每个此类集合中删除固定比例的元素,则二进制搜索有效。

例如。如果S是固定尺寸的网格,则有一个快速算法:总是将一个坐标减半,而使另一个坐标减至最小,因此例如在第一步中要问(n / 2,0,...,0)。

一个重要的相关定理是Tarski不动点定理,在该定理中,您不是从P而是从晶格到其自身的单调映射。定理说不动点形成格子。我们用Jaroslaw Byrka和Paul Duetting证明,在这种情况下,如果晶格是d维网格,则可以在大约时间内找到一个固定点,其中该算法是二进制搜索的简单概括。nd


恐怕我不明白第一段。在简化中,您是否在poset S中拥有所有n位字符串,它们是否作为输入的一部分给出?如果是这样,我们可以遍历多项式时间内的所有字符串。
冈本

1
@YoshioOkamoto:我认为该段中的假设是将S中的比较作为布尔电路给出。(但是,这与在球拍中进行搜索无关,因此对我而言并不有趣。)
伊藤刚(Tsuyoshi Ito

@Tsuyoshi:谢谢。这很有意义。
冈本

4

对于在子集的晶格上找到所有最大元素的问题,这等于布尔变量的正布尔函数的精确推论。如果您只关心的评估次数(而不是计算复杂度),则可以在“通过基于逻辑的方法进行数据挖掘和知识发现”第10章第10.2.4节或本节的最后一段中找到调查。答案是指向本文的 6.1 (请注意,本文的其余部分涉及计算复杂性,而不仅仅是评估的复杂性)。2 [ n ] n P PP2[n]nPP

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.