5.1-1
一开始没有看懂题意,原来这里面有一个术语total order是全序的意思。
题意是:如果我们总能判断哪一个candidate是best的,那就意味着这些rank满足着全序关系
全序关系有几点:
自反性:自己能和自己比较
对称性:A不如B,B一定比A更“best”
传递性:A比B“best”,B比C“best”,那么A一定比C“best”
这题中,前两点是显而易见的,关于第三点,如果A比B厉害,且在B之后,那么就会录用B,如果B后有C比B厉害,那么就录取C,这就意味着C一定比A厉害,因为这个原则就是录用更加厉害的人。
5.1-2
这题超级有意思的!
现在有一个方法,调用它可以等概率地得到0或1,求如何实现一个等概率得到区间[a.b]所有整数的方法
咋看之下没什么思路。这种情况下,可以这么思考:
已知什么? 等概率的0,1发生器
想要什么? 等概率的[a,b]发生器
两者是否存在什么联系? 暂时没想到
0,1发生器能让你联想到什么? 1,硬币 2,连续抛硬币的实验 3,记录实验结果能够得到一个01串
4,01串其实可以转换成二进制数 5,二进制数可以转换成十进制数!!!!
6,十进制数可以移动到区间[a,b]!!!!!!!
这样问题就解决了!
我们可以先得到一个[a,b]的区间长度 N = b - a,这个然后取长度为lgN + 1的二进制串对于二进制串的每一个位,都用Random(0,1)来得到,这样子,就能够组成后得到一个在0-N范围内的等概率的数。但是有些数超出了N,这个时候就要重新进行构造(但是这并不影响得到0-N的数的概率是相等的,只是0-N的数出现概率总和并不是1)所以,对于这个算法来说,其时间复杂度在于这个循环会进行几次?
我们可以这样来刻画这个问题,首先,记长度为b,那么再一次构造的所有情况中,能够终止的概率是N/(2^b),剩下的都是不能终止,记这个“能够终止”的概率为p=N/(2^b)。循环终止的时候,得到一个0-N之间的数,在此之前,都得到N+1-2^b-1的数,那个模型,就是那个几何分布的模型!!(前k-1次都失败,第k次成功)所以这个期望次数是1/p,那么这个时间复杂度就是
这个是这个算法的期望复杂度
这题目真的很有意思,也让我对随机算法有了一定的概念。在我看来,随机算法应该是一种终止条件的出现是用概率的刻画的一种算法,这样一来,往往就符合几何分布的模型。这种复杂度是一种期望复杂度,而刻画随机现象,期望值是一个比较合理的角度,而不是像传统的那样计算worst-case和best-case。
5.1-3
这也是一个非常有意思的题目!
给定一个不均匀的0-1随机发生器,问如何转换成均匀的0-1随机发生器。
产生1的概率是p,0的概率是1-p,受到上面一道题目的启发,我让他产生两次那么就有如下的分布
0
1
0
(1-p)(1-p)
p(1-p)
1
p(1-p)
p*p
注意到其中01和10是两个概率相等的事件,那么就可以用01来表示0,10来表示1,这样,0和1出现的概率就相等了(但是它们的概率和并不是1)
那么这个算法的时间复杂度是多少呢?
其实根据上面一题,可以抽象出一个模型,一个算法出现终止条件的概率设为p,则不出现终止的概率为(1-p),由于这个模型符合的是几何分布,所以他的期望循环次数是1/p,每一次循环,设其代价为c,那么整体的期望复杂度就是
那么具体到这道题而言,终止的条件是出现01或者10,其概率是0.5,每次循环的花费是2c,都是常数,所以整体的时间复杂度也是一个常数O(1)
5.2-1
只选一个的概率必然是第一个就选了rank最高的人,这个概率是1/n
雇佣n次,说明是以input是递增的形式,这样的概率是1/n!
5.2-2
这题如果是用排列组合来算的话,化简起来比较麻烦,但是如果用这里random indicator variable的话,就十分简洁!当然了,概率论的题目都比较烧脑子,这题用符号来表示的话,也需要有一个很好的角度,可以这么来理解:
第一个如果是rank 为i的人,雇佣了之后,由于 rank为n的人一定是要雇佣的,那么这样就有两个人了,为了不雇佣更多人,rank 大于i的人,必须在n的后面,那么n这个元素,排列在n-i个人的最前面的概率,是1/(n-i),而第一个人是i的概率就是1/n,那么整个事件{第i个人在第一位,且雇佣两个人}的概率,就是1/n*(1/(n-i)),只要把这个概率从1–n-1累加就可以了
5.2-3
单个骰子的期望时3.5,n个骰子的期望就是3.5n,挺简单的,但是没看出来要怎么去用indicator random variable
5.2-4
一个很经典的配对问题,n个帽子分给n个人,每个人问期望有多少个人拿到自己的帽子?
第i个人拿到自己帽子的概率是1/n,所以对所有n个i而言,总的期望就是1….
感觉这个答案有点反直觉,因为无论这个n有多大,或者多小,期望总是1……应该怎么理解呢?
我觉得是因为,随着n变大,每个人拿到自己帽子的概率也随之变小了。
5.2-5
先有序放好,则第i个数,可能有的逆序数对是1,2,…,i-1,那么分别对应的概率是1/i,因为要让出现k个逆序对,只要把i往k+1的位置一放就可以了,这样可以求得i的期望逆序对是(i-1)/2,那么总的n个这样的i,就有n(n-1)/4
这题的思想其实和上面的题目非常的类似,indicator random variable确实很简洁,和这个一起的,是一种怎么去放i的思想,比较奇妙,但是有难以说的清清楚楚。
NO PARTICULAR INPUT ELICITS ITS WORST-CASE BEHAVIOUR!!!
5.3-1
这道题目有点长,我理解的意思是:
Lemma5.5有一个逻辑上不明确的地方,它假定empty subarray包含0-permutaiton的概率是1,然而这只是一个“说法”,我完全也可以说empty subarray包含0-permutation的概率是0,这样Lemma5.5的loop invariant的基础就不再成立。接着,题目让你改进一下RANDOMIZE-IN-PLACE的pseudocode,使得loop invariant能够成立。
为了避免出现empty subarray的情况,其实只要处理一下第一个元素,然后再进入循环。为什么这样的Initialization是对的呢?因为长度为1的subarray必然包含1-permutation.之后的证明就完全同原来的证明。
按照我的理解,其实规定empty array一定包含0-permutation就是设置了一个sentinel,简化了代码。
5.3-2
按照我目前的理解,一个随机算法设计的是否合理,取决于其结果在理论上是否得到一个uniform random permutation
然而这道题并不能做到!相比较正确的算法,这个算法每次都将i元素和之后的n-i个元素做交换,“不和自己本身交换”。这样它的loop invariant就不能够维持了。到第i个元素,假设前面维持了一个(i-1)-permutation,到了i,其概率是
1/(n-i),两者的乘积不能够得到一个i-permutation,所以这是错误的。
5.3-3
这连续的3题其实是一个系列的,他们的目的就是为了加深对于RANDOM(i,n)的选取的理解。
这题问,将RANDOM(i,n)改成RANDOM(1,n),是否还能够生成uniform random permutation?
直觉上来说,这应该是错的,应为延续上面的思路,这个算法似乎并不存在loop invariant,因为第i次操作可以把之前的i-1的状态改变。但是如何真正的说明这个算法是错误的呢?我想到的一个角度是:证明某些序列生成的概率大于另外一些序列。
但是数学上的证明我没有做出来,我构造了一个特例,n=3,原来是123,我发现这个序列经过三次循环之后,出现的频率是不一样的,比如123出现了4次,132出现了5次。事实上,从中可以得出一定的规律,做了n次Random,总的可能性有n^n种,但是排列一共只有n!种,所以大部分情况下,不能够均匀的分配!
5.3-4
这个算法是一个超级巧妙的反例!!!!
之前,我有一种错觉,如果每一个元素在任何位置上出现的概率都是1/n,那么这样的算法应该满足uniform random permutation,但这是unsufficient的,这个算法就是反例!
算法的思想就是,在开始循环前,先得到一个随机的偏移量,然后将每一个元素,都按着这个相同的偏移量进行移动,不难证明,由于偏移量是在0-n-1随机分布的,所以每一个元素偏移到任何位置的概率都是1/n的,但是这样只能够得到有限的排列,即元素相对位置不变的n种序列,但是剩下的n!-n中排列产生的概率是0!!!!
这得太巧妙啦!!!!!!!
5.3-5
这道题对数学功底要求比较高,尤其是不等式的功底,涉及了伯努利不等式。
就理解层面而言,这个unique的概率还是比较高的,n=10的时候,就可以是90%的概率生成全不相同的序列
5.3-6
这个问题似乎很高深的样子,我想的比较直接,但同时很傻的方法,就是先用那些得到的已经不同的priority进行排序,然后对于那些相同priority的元素,重新给他们分配一个priority……这样子的时间复杂度也不会很高,因为上一题证明了元素不同的概率是很高的,所以这样应该也是可行的。如果说用其他的角度(不借助随机数)来排序这些相同key的元素的话,势必会造成一种确定性顺序。所以这样子的做法即使不是“完美解法”,应该也接近了!
5.3-7
从n个数字里面随机找一个m排列,可以这么做,从n个里面随机找1个元素,然后问题就转化成从n-1个元素里随机找一个m-1排列。但什么这样做是对的呢?
要证明这个产生uniform random m-permutation,就是要证明每一个排列产生的概率都是1/A(n m),首先,第一个数产生的概率是1/n,然后第二个数产生的概率就是1/(n-1),直到第m个数,为1/(n-m+1),将这些概率累乘,得到的即是1/A(n m),故这个算法是正确的。
这个算法的意义就在于,减少了对ramdom函数的调用。对于n远大于m的情况,是有价值的。
5.4打星章节,等这学期结束了再看。
这里Mark一下,现在的数学水平不到家,这学期正好概率论的课,等学期结束把这里看完
Problem
5-1 Probabilistic counting
这题的求解方法用的是indicator random variable。比较巧妙,但是更有意思的是这个题目本身!!
这题介绍了一种新的计数方法,或者说,这题更像是对传统计数方法的一个扩展。在损失了一定的精度的代价下,可以将计数的范围扩大到非常非常大!
5-2 Searching an unsorted array
未排序的数组找元素问题,看运气算法。。。。
(a)
RANDOM-SEARCH(A, key)
N = A.length
while N > 0
i = RANDOM(1, N)
if A[i] == key
return i
swap(A[i], A[N])
N = N - 1
return NIL