"几乎已排序"问题——Is this (almost) sorted?

来源:互联网 发布:linux ip限制 编辑:程序博客网 时间:2024/06/04 08:25
哈利·波特,霍格沃茨魔法学校的少年巫师,再次遇到了麻烦。斯内普教授拘留了哈利并指派他一个整理所有过去200年的旧家庭作业的任务。作为一个巫师 ,哈利挥挥魔杖说:“ordinatus sortitus”,这些文件立即就快速地按顺序排列好了。

斯内普教授要确定哈利是否正确地将这些文件排序。然而,有大量的n个文件,确定他们是否正确地排序需要Ω(n)的时间。

斯内普教授于是决定检查这些文件是否“已几乎排好序”。他想知道是否其中90%的论文已被正确排序:即能否能够去除其中的10%,并让剩下的列表确定排序结果是否正确?

在这个问题中,我们将帮助斯内普教授发现一种算法,算法接受一个包含n个不同元素的列表A,并操作如下:
1)假设列表A已经排好序,算法总会返回true;
2)假设列表A不是90%已排序,算法至少以2/3的概率返回false。

(a) 斯内普教授首先考虑了如下算法:
      重复 k 次:
         1)简单随机一致地从开区间(1,n)(1<i<n)选择一份文件 i .
         2)比较文件 A[i-1] 和 A[i].如果它们没有正确排序,则退出并返回 false.
         3)比较文件 A[i] 和 A[i+1].如果它们没有正确排序,则退出并返回 false.
       输出 true。
       证明:为使得上述算法能正确地发现列表是否已几乎排序的概率至少为2/3,需满足 k=Ω(n)。(提示:找出一个不是几乎已排序的序列,但是只有少量元素会导致该算法返回false)

根据提示,通过构造一个具备以下两个性质的反例来说明斯内普教授的算法并不正确:

  1)A不是90%已排序的

  2)斯内普教授的算法以2/3的概率返回false当且仅当k=Ω(n)

特别地,我们考虑如下反例:A=[n/2+1, . . . , n, 1, 2, 3, . .. , n/2].

上面的列表A中,只有 n 和 1 两个元素会导致该算法返回false.



(b) 试想一下,给你一袋 n 个球,已知其中至少有10%的球是蓝色的,并且红色的球不超过90%。为了使取到一个篮球的概率至少为2/3,你要从袋中取出多少个球?(假设这些球是可重复取的)

(c) 考虑对一个未排序的列表执行一个“二分查找”:
    
假设列表A(即使A是未排序的)中针对key1的二分查找返回槽 i,类似地,A中针对key2的二分查找返回槽 j。解释为什么下列事实为真:if i<j,那么key1<= key2.画出该实例图。(提示:首先思考假设A是已排序,为什么该命题显然为真)



(d) 斯内普教授提出了一个随机算法来确定列表是否90%已排序的。算法调用RANDOM(1,n)来从闭区间[1,n]]中简单随机一致地选择一个整数,该算法如下所示:
    
证明:假如 k 是一个足够大的常数,该算法是正确的。也就是说,只要 k 取一个恰当的值,如果列表是已正确排序的,该算法始终返回 true,反之,如果列表不是90%已排序的,那么算法至少以2/3的概率返回false。

1)首先,很明显的是,如果列表A是已排序的,那么斯内普教授的算法总会返回true.

我们为列表中每一个元素贴上一个“good”或“bad”的标签,表示它通过“二分查找”的返回的下标是否和它经正确排序后的下标一致:


要判断哪些元素是“good”或“bad”并不是那么直观,有些元素可能是已排序正确的,但也有可能因为其它元素的乱序导致最终它们也是乱序的,类似的,有些元素可能完全就是乱序,但也有可能是阴差阳错地刚好处于某个正确的位置。关键点是一个糟糕的排序结果会导致很多“bad”元素。

2)如果列表A不是90%已排序的,那么至少有10%的“bad”元素。

反证法:假设“bad”元素不超过10%,那么至少有90%的元素是“good”,回想一下一个列表90%已排序的定义:如果去除掉那些排序结果不明确的10%元素,那么我们认为,余下的元素都是已排序正确的。考虑余下的“good”元素中任意两个元素,key1和key2,key1的坐标为 i,key2的坐标为 j.如果i<j,根据(c)可知,kwy1<key2,也就是说这两个元素是排序正确的。既然任意两个元素都是排序正确的,那么数组中所有的“good”元素是排序正确的,即列表A是90%已排序的,与已知矛盾,故假设不正确,因此命题得证。

3)如果列表不是90%已排序的,那么算法至少以2/3的概率返回false。

证明:根据上述(2)知道,至少有10%的元素是“bad”元素,从(b)又知,如果选择 k>lg(1/3)/lg 0.9,那么找到一个“bad”元素的概率至少为2/3,因此,得出结论:如果列表不是90%已排序的,那么算法至少以2/3的概率返回false。


(e) 试想一下,斯内普教授想要确定一个列表是否是以 1- e 已排序的,对某个0<e<1(在之前的部分 e=0.10)。对大数 n,确定其合适的渐近 k 值,证明该算法是正确的。它的总体运行时间是多少?



0 0
原创粉丝点击