当使用硬币翻转比较器时,是否有一种“排序”算法返回随机排列?


9

这个问题的启发,在这个问题中,问询者想知道在标准搜索算法中使用的比较器被公平的硬币翻转代替时运行时间是否发生了变化,并且微软也未能编写统一的排列生成器,因此我的问题是:

是否有一个基于比较的排序算法,具体取决于我们对比较器的实现:

  1. 使用真正的比较器时,将元素按排序顺序返回(即,比较符合我们在标准排序算法中的预期)
  2. 当比较器被公平的硬币翻转代替时,返回元素的均匀随机排列(即x < y = true,无论x和y的值如何,返回概率均为1/2)

排序算法的代码必须相同。只有比较“黑匣子”内部的代码可以更改。


另请参阅此问题
拉斐尔

2
另请参阅以下有趣的问题:cstheory.stackexchange.com/questions/5321/…
Yuval Filmus 2013年

1
您是否希望您的随机比较器行为良好?这是两种可能的方法。(1)一旦比较器确定了,则总是,而且。(2)相同,但是如果比较器进一步确定和,则它将提交给(和)。在这两种情况下,每个不受约束的查询仍然是完全随机的。x < y y > x x < y y < z x < z z > xx<yx<yy>xx<yy<zx<zz>x
Yuval Filmus

@YuvalFilmus我基本上想要您所链接的问题中的要求,除了如果我们用对这对元素进行排序的比较交换门替换随机门,同一电路也应该排序。

1
看到这里很好的可视化。
拉斐尔

Answers:


3

以下确定性(无比较器)算法适用于输入元组:(a1,,an)

  1. 不要在费雪耶茨洗牌使用比较有一些静态对(说)为抛硬币(做接受-拒绝抽样)。如果比较器第一次输出,则在确定性情况下将其反相使用,以免产生无限的拒绝环路。 1a1<a21
  2. (可选的加速方法:尝试对次,其中是长度或您的输入。如果任意两个输出不同,则返回在(1)中获得的排列)ñnn
  3. 使用合并排序对数组进行排序。

给定确定的顺序关系作为比较器,此算法会按时间对数组进行排序,因为Fisher-Yates随机播放使用最大在运行每个步骤和合并排序中的非随机“随机位”(例如,对比较器的调用)具有相同的渐近复杂度。在这种情况下,(1)的结果是完全没有用的,但是由于它后面跟着一个真正的排序,所以这没有害处。On Olog n O(nlogn)O(n)O(logn)

给定一个真正的硬币翻转,比较器(1)会对每个排列以相同的概率对数组进行排列,并且如果您确实必须执行(3)(忽略了(2)或(2)无法确定随机性),则为否损害是因为其结果的分布仅取决于其输入的顺序,由于(1),其输入在所有排列之间是均匀分布的,因此,整个算法的结果也是均匀分布的。每个接受-拒绝采样必须重复的次数是几何分布的(以概率拒绝),因此期望值。每次重复最多使用位,因此运行时分析与确定性情况几乎相同,但是我们只能得到一个 <2lognOnlogn<12<2logn预期运行时的,具有nontermination的可能性(终止仅几乎肯定)。O(nlogn)


正如Joe指出的那样:如果您不喜欢测试(1)中的第一位,请执行(3)然后执行(1)并使用始终为,因为数组已经在确定性情况下进行了排序。另外,您必须从循环范围的上限减去您的随机数,因为随机数的上限会产生相同的排列。但是请注意,此时禁止使用(2),因为在勒索赎金案中,您总是必须洗牌。an<a10


您甚至可以对(1)和(3)使用相同的调用比较器,但是如果可能的话,证明结果均匀分布至少要困难得多。


以下算法没有随机洗牌和排序的阶段,但是渐近变慢。它本质上是带有二进制搜索的插入排序。我将使用表示输入,而表示第轮之后的结果:a=(a1,,an)bk=(bk,1,,bk,k)k

  1. 设置b1,1=a1
  2. 如果则和否则和。无论哪种情况,对于非随机比较器,始终为(即false)。b 2 = 一个2一个1ç d = 2 1 b 2 = 一个1一个2ç d = 1 2 一个d < a c 0a2<a1b2=(a2,a1)(c,d):=(2,1)b2=(a1,a2)(c,d):=(1,2)ad<ac0
  3. 为了获得为获得第一。bkk3bk1
  4. 令并且,即是的最小幂,且不小于。l=log2kk=2lk2k
  5. 令。对于每个让 i0=0j{1,,l}
    ij={ij1+2ljij1+2lj>k1ad<acij1ij1+2lj>k1¬(ad<ac)ij1+2ljij1+2ljk1bk1,ij1+2lj<akij1ij1+2ljk1¬(bk1,ij1+2lj<ak)
  6. 如果重复(5.),否则il>kbk=(bk1,1,,bk1,il1,ak,bk1,il,,bk1,k1)
  7. 输出bn

随机情况:5 + 6的if子句实质上是接受-拒绝采样。该算法的其余部分是简单的混洗:混洗前个元素,并以相等的概率将第个元素添加到每个位置。如果使用正态插入排序,则会得到二项式分布。k1k

请注意,与Fisher-Yates随机排序和合并排序相比,此算法在两种模式下均效率低下,因为如果使用数组,则将元素插入任意位置的开销很大,如果使用列表,则二进制搜索需要线性时间。但是也许以类似方式修改堆排序或树排序可能会导致算法更快。


@Joe您可以将所有对当前形状仍适用于该帖子的所有点放入一个评论中,并删除其余的吗?
frafl 2013年

我希望算法不会根据所使用的比较器而执行不同的步骤。您是否可以在不探测比较器的情况下避免无限拒绝环路?我认为您可以通过先执行步骤(3)来避免被拒绝...

如果执行排序步骤然后进行洗牌,但是使用一系列取决于索引的比较该怎么办,这样在确定性情况下,您将获得元素的索引(不交换),并且该元素将保持排序状态,但是在随机情况下,您可以通过拒绝采样执行标准混洗。i
2013年

第一条评论:请注意,我不会丢弃第一个示例位,它是“双重使用”。我考虑过将第二个位反转,但这不会阻止无穷循环。实际上,需要一些不规则的模式,甚至可能拒绝很多条目。当然,我可以对两个最近的位进行XOR,而不是对第一和最近的位进行XOR,但这并没有真正的不同。
frafl 2013年

第二条评论:仅当您使用步骤(2)时,顺序(1)与(3)才重要,因为在随机情况下,您必须确保以1的概率进行混洗,否则会违反均匀分布。为什么要依靠?在这种情况下,将始终回答,这就是我们所需要的。ian<a10
frafl 2013年

4

不,除非否则这是不可能的。您的算法使用随机比较器生成置换的概率是二进角的,即形式为,而概率应为。当,无法写入在形式。/ 2 1 / Ñ n > 2 1 / n A / 2 Bn2A/2B1/n!n>21/n!A/2B


1
但这只有在我们需要在运行时上有确定性界限的情况下才成立,这在问题中没有要求。如果仅要求期望的运行时有限,那么这应该没问题。
frafl 2013年

1
您是否知道不会在多项式时间内终止的任何合理排序算法?
Yuval Filmus 2013年

2
您混合使用确定性情况和随机情况。如果以确定性的顺序关系调用该算法,则终止于确定的多项式时间;如果以硬币作为比较器调用,则算法终止于预期的多项式时间。
frafl 2013年

@YuvalFilmus为什么决策树必须有叶子?2k
2013年

如果您总共要进行比较,则任何事件的概率都将为形式。这与叶子的数量无关。正如frafl所建议的那样,唯一的出路是进行无数次比较。A / 2 kkA/2k
Yuval Filmus
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.