现在的位置: 首页 > 综合 > 正文

所谓的阿里巴巴的一道递归排序的考题

2013年12月09日 ⁄ 综合 ⁄ 共 1541字 ⁄ 字号 评论关闭

有这样一个题,貌似是阿里巴巴的笔试题?

 

提:12个高矮不一的人排成两排。要求:

1)每排从矮到高排

2)第二排的比第一排对应位置的人要高。

问:有多少种组合方式?

/////////////////////////////////////////////////

 分析:

       这是一个排列组合题,我们假设1~12是这12位置的编号。

第二排:     7 8 9 10 11 12

第一排:     1 2 3  4   5   6,位置2的人比位置1的人要高,但比位置8的人要矮,和位置7的人的高矮关系不定,以此类推。

可以这样考虑:这12人按从低到高站队,没人发一个编号,然后按此编号去站队,符合条件的编号发放组合就是答案。

 

下面解答:

1)首先可以确定最矮的和最高的人的编号一定是1和12,每种组合都是这样(可推理)。然后让拿到1,12,7,8,9,10,11编号的7人按从低到高排,肯定是 1 7 8 9 10 11 12这个顺序。

2)接下来确定2 3 4 5 6 五人的高低关系。首先高低关系肯定是 2 3 4 5 6,然后:

     2比1高,比8低,则可排在1和8间,有两个位置,1-7,7-8,

     3比2高,比9低,则可排在1和9间,有三个位置,1-7,7-8,8-9,但必须排在2后,这样,如下:

     1  7  8  9  10  11  12

2     ^  ^ 

3     ^  ^ ^

4     ^  ^ ^ ^

5     ^  ^ ^ ^   ^

6     ^  ^ ^ ^   ^    ^

^代表该编号可插入的位置。比如都可以插在1-7,要注意2 3 4 5 6的先后顺序是确定的。

3)计算

   

     1      7      8      9      10      11      12

2     ^1    ^1 

    我们加个数字代表这种插入方式的数量

再看:

     1      7      8      9      10      11      12

2     ^1    ^1 

3     ^1    ^2    ^2

 

当 n = 3 时,1-7的方式只有一种,即当2也插在1-7,因为2要插在7-8的话3就不可能插在1-7了。

                    7-8的方式有两种,2插在1-7,或者2插在7-8,

                    8-9的方式有两种,2插在1-7,或者2插在7-8,

插入方式数量Xn(0) =1 ;

                  Xn(k) = Xn-1(0)+Xn-1(1)+...+Xn-1(k); (k>0)

            也即Xn(k) = Xn(k-1)+Xn-1(k);(k>0)

是递归的过程,由此我们得:

     1      7      8      9      10      11      12

2     ^1    ^1 

3     ^1    ^2    ^2

4     ^1    ^3    ^5    ^5

5     ^1    ^4    ^9    ^14   ^14

6     ^1    ^5    ^14  ^28   ^42   ^42

 

故问题的答案Y6 = X6(0)+X6(1)+...+X6(5) = 132

 

在编码实现的时候用递归还是顺序计算,要看需求。递归会出现重复计算,但是单个计算每次内存开销较小。顺序往下先算出各个元素的值,无需重复,以空间换时间。最好的方法是我们可以存储一部分元素值,比如第一列和第二列的值都很有规律,Xn(0) = 1, Xn(1) = n-1会使计算更快。同时内存占用也不会过大。在递归里可以判断Xn(k),k=0 => Xn(k) = 1,k=1 =>Xn(k) = n-1;

另外,当k>n-1时,Xn(k) = 0,即右上角的元素。

 

当然,在实际使用时,可以设置检查点,比如要算n=1002时,如果有n=1000的检查点可查,那么n=1002的计算就唾手可得了。

抱歉!评论已关闭.