Showing posts with label Permutation. Show all posts
Showing posts with label Permutation. Show all posts

Thursday, March 28, 2013

TAOCP 5,1.1 Exercise 12

Continuing the notation of the previous exercise, prove that if \(\pi_1\) and \(\pi_2\) are permutations and if E is the smallest transitive set containing \(E(\pi_1)\cup E(\pi_2)\) then \(\bar{E}\) is transitive.

反证:假设存在\((a,b) \in \bar{E}, (b,c) \in \bar{E}\)但\((a,c) \in E\),显然\((a,b) \notin E(\pi_1)\),\((b,c) \notin E(\pi_1)\)  ,所以\(c < b < a\)并且在\(\pi_1\)中保持顺序。同理此三个数在\(\pi_2\)中也保持顺序。

现在考察(a,c),如果E中去除(a,c)传递性仍然成立,则与E为满足传递性的最小集合矛盾,所以E中必有元素(a,t)和(t,c)。(a,t)和(t,c)必然分别来自\(\pi_1\)和\(\pi_2\),不失一般性,设
\(\pi_1=\ldots c \ldots b \ldots a \ldots t \ldots \)
\(\pi_2=\ldots t \ldots c \ldots b \ldots a \ldots \)

现在有两种情况
1) b>t, 则有 \((b,t) \in E(\pi_1), (t,c) \in E(\pi_2)\) 导致\((b,c) \in  E\) 与假设\((b,c) \in \bar{E}\)矛盾。
2) b<t 则有 \((a,t) \in E(\pi_1), (t,b) \in E(\pi_2)\) 导致\((a,b) \in E\) 与假设\((a,b) \in \bar{E}\)矛盾。

所以\((a,c) \in E\)不成立,\((a,c) \in \bar{E}\),即\(\bar{E}\)具有传递性。

Monday, March 25, 2013

计算排列反演表的\(n log( n)\)算法

此题是TAOCP中的5.1.1 Exercise 26
Design an algorithm that computes the inversion table \(b_1 b_2 ... b_n\) corresponding to a given permutation \(a_1 a_2 ... a_n\) of {1,2,3..,n}, where the running time is essentially proportional to \(n log (n)\) on typical computers

书后给出的答案可能需要多读几遍才能理解
基本思路是,按二进制位考察每一个\(a_i\),从最高位开始,比如计算1到9的排列,则将所有数先分成两组,1,2,……,7为一组,8和9为一组,然后计算不同组数之间的前后关系。同组之间的前后则暂时先不计算。

第二遍,将所有数分成两类,每一类中又分两组,第一类有1,2,3和4,5,6,7两组,第二类有8,9两个数。计算同一类中两组的先后关系,也就是说,4,5,6,7之间的先后暂不计算,但算这4个数和1,2,3之间的先后关系。

第三遍,继续细分成4类 第一类有 两组 1,和2,3, 第二类有4,5,和6,7.第三类有8,9一组
再一遍计算同一类中两组的先后关系。

最后一遍,所有数两两分类:{1},{2,3}{4,5}{6,7}{8,9}每一类中有两个数,计算这两个数的先后关系。

将此4遍的结果加起来,就是最后的结果。


另外其实此题有更直观的解法
先建立空集S, 对排列依次做,取出排列的第i个元素\(a_i\)
求得S中比\(a_i\)大的元素个数\((rank(a_i)\), 令\({b_a}_i=rank(a_i)\)
将\(a_i\)放入S中

于是问题就转化为,是否有数据结构可以在\(log(n)\)的时间内做到插入和计算rank的操作,这是可能的,只需要简单修改平衡二叉树,例如AVL树,在每个节点保存左右子树的节点数即可。因为AVL的插入和查找都是\(log( n)\)级别的操作。而加上左右子树节点数后,查找操作可以得出当前树中比目标数大的个数的值。