基于比较的数据结构,用于查找项目


34

是否有一个数据结构,该数据结构接受n个无序数组,在执行预处理O(n)并回答查询:列表中是否有一些元素x,每个查询的时间最差O(log⁡n)?

我真的认为没有,因此也欢迎提供证明。


3
(1)我不知道您为什么可以说“我当然考虑了预计时间”,因为您根本没有在问题中说“预期”。请尽量说以前更精确地说出你的问题(2)请界定“当然。”“非哈希的。”
— 刚伊藤

2
(1)我明白了。感谢您的解释。如果有人问“你在乎运行时间吗?”,答案肯定是“当然”。:)(2)我认为“唯一允许的操作是比较列表中的两个值”更为精确。而不是仅仅说“不可散列”。您是否可以编辑问题,以使人们不必阅读注释即可理解“不可散列”的含义?
— 伊藤刚(Tsuyoshi Ito)

3
顺便说一句,如果您无法证明它,为什么您知道这是不可能的呢?如果这是在教科书或课堂上进行的练习,则说明您在错误的网站上提问。
— 伊藤刚(Tsuyoshi Ito)

6
这是否是您的问题:是否有一个数据结构,该数据结构接受n个项目的无序数组,在​​O(n)中执行预处理并回答查询:列表中是否存在某些元素x,每个查询的时间最差为O(log n)?
— sdcvvc 2011年

2
@Filip:容易看到吗?如果是真的,那么我同意它可以解决这个问题。
— 伊藤刚(Tsuyoshi Ito)

Answers:


30

这是不可能的证明。假设您可以构建这样的数据结构。建立它。然后,选择随机从列表项中添加ε他们每个人,其中ε比名单上的任何两个项目之间的差异较小,并进行查询,以确认所产生的项目是否在清单。到目前为止,您已经执行了O (n )个查询。n/log⁡nϵϵO(n)

我想声称您所做的比较足以确定原始列表中的项目是否小于或大于任何新项目b。假设你不知道。然后,因为这是一个基于比较的模型,所以您将不知道a是否等于b,这与您的数据结构有效的假设相矛盾。abab

现在,由于您选择的项目是随机的,因此比较有很高的可能性,因为有足够的信息可以将原始列表分为n / log n个列表,每个列表的大小均为O (log n )。通过对这些列表中的每一个进行排序,您将获得仅基于比较(一个矛盾)的随机O (n log log n )时间排序算法。n/log⁡nn/log⁡nO(log⁡n)O(nlog⁡log⁡n)


一些提示可以帮助您理解证明(当然,假设我自己是正确理解的):项应在将ϵ加到之后添加。你知道的比较模型保证其中的情况下,一个≤ b和一个≥ b持有; 所述Ñ /日志Ñ列表是在“升序”:在任何较高列表中每个元件比在任何较低的列表中的每个元素更高; 在原始查询之后,您有足够的信息来围绕您随机选择的项目列出这些信息bϵa≤ba≥bn/log⁡n
— Alex 10 Brink11年

(续)请注意,您甚至不必在提供的时间内显式地构建清单即可保存证明。
— 亚历克斯(Alex)10 Brink

我不安静地理解这个证据。最终矛盾关“仅基于比较算法”,但在我们的算法的第一个步骤,我们增加到(“里进一步,每个项目ε比名单上的任何两个项目之间的差异更小”)。为什么我们仍然认为我们的算法仍然仅基于比较,前提是我们假设我们的商品的总订单数不是离散的?ϵϵ
— Artem Kaznatcheev

5
@Artem:您原来的输入由元素。然后构造一个新的组X ' = X × { 0 ,1 } ; 您代表原始X ∈ X为(X ,0 )∈ X '和改性X + ε为(X ,1 )∈ X '。现在,您使用黑匣子算法;该算法比较X '的元素x∈XX′=X×{0,1}x∈X(x,0)∈X′x+ϵ(x,1)∈X′X′对彼此; 要回答此类查询,您只需要将恒定数量的元素相互比较即可。因此,在比较模型中,一切都应该可行,并且开销是恒定的。X
— Jukka Suomela 2011年

1
@Aryabhata:是的。什么是算法?O(log2⁡n)
— 彼得·索尔

24

我相信这里是另一种证明,证明了使用O(n )预处理的查询时间结构是不可能的。O(logk⁡n)O(n)

假设在预处理中进行比较,从而导致部分排序。O(n)

现在考虑其中最大的反链的大小由于这些元素不可比较,因此对于我们来说,要使用O(log k n )查询算法,必须使A = O(log k n )。AO(logk⁡n)A=O(logk⁡n)

现在,根据迪尔沃思定理,将大小为的分区分成链。A

现在我们可以对算法进行补充以确定分区中的链。通过创建比较的有向图并进行可达性分析,我们可以确定两个元素是否可比较。无需任何其他比较即可完成此操作。现在,只需强行删除大小为每个可能分区,即可确定它是否是链的分区。A

一旦有了链,我们可以将它们合并以给出比较算法,以对整个列表进行排序。O(nlog⁡log⁡n)


1
这是一个好主意。而且,如果您可以证明算法必须知道链分区,则可以使用mergesort来显示它只需要进行一次额外的O(n log log n)比较即可对整个输入进行排序,而不是使用Jensen。但是有一个问题:为什么预处理算法必须构造一个链分区?是的,必须存在链分区,但这与算法已知的链分区非常不同。
— David Eppstein

8
好吧,我现在相信这个证明。而且它更强烈地表明,要实现Polylog查询时间,您必须使用排序的加法内的多个比较。真好 顺便说一下,可以在多项式时间内从已执行的比较集中找到链分区,而不需要进行蛮力搜索,但这对您的论点没有任何影响。O(nlog⁡log⁡n)
— David Eppstein

6
证明实际上表明,每个查询必须具有预处理或Ω (n )。当然两者都紧。这表明二进制搜索和线性搜索是唯一的“有趣”搜索算法(至少在古典世界中如此)。Ω(nlog⁡n)Ω(n)
— Yuval Filmus

1
@Yuval:也许您应该把这个观察结果写成一个实际的答案,因为在我看来,您必须做少量的工作才能从答案中的证明中得到上述结果。
— 彼得·索尔

1
@Yuval:思考的证据,我只看到你必须有预处理或Ω (ñ 1 - ε)查询时间为所有ε。可能有o (n log n )个预处理时间和O (n / log n )个查询时间。可以将列表分为大小为n / log n的log n个列表,每个列表的时间为θ (nΩ(nlog⁡n)Ω(n1−ϵ)ϵo(nlog⁡n)O(n/log⁡n)log⁡nn/log⁡n使用平均重复调查。θ(nlog⁡log⁡n)
— 彼得·索尔

0

正如彼得·索尔(Peter Shor)的回答所指出的,要排除基于比较的模型中的成员资格,我们需要知道元素与每个成员的比较方式。因此,使用随机查询(小于查询的非成员的成员数是随机的),相对于具有n个未排序的值,我们可以获得Θ(n log k )信息。因此,对于某些常数c > 0,使用ck<nΘ(nlog⁡k)nc>0预处理的,我们不能有 ≤ Çcnlog⁡k查询成本。这是一个常数因子最佳起来,因为我们可以将数据分成排序 ķ ' = ķ /日志ķ ≤ ñ /登录Ñ近似等于桶中(每个桶未分选的) ø (Ñ 登录ķ ')= Ö (Ñ 登录ķ )时间,这允许 O (n / k ')查询成本。≤cnlog⁡k/kk′=k/log⁡k≤n/log⁡nO(nlog⁡k′)=O(nlog⁡k)O(n/k′)

O(n)o(n)o(nlog⁡n)kO(nε)ε>0Ω(n1−ε)

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.