问题描写叙述:
设有n(2^k)位选手參加网球循环赛,循环赛共进行n-1天,每位选手要与其它n-1位选手比赛一场。且每位选手每天仅仅能赛一场,试安排比赛。
举例说明:
1,当n为偶数时,循环赛一共要进行n-1天;比方,有运动员:周董,信哥,蔡依林,小七。一共4个人,能够例如以下安排:
运动员 |
第一天 |
第二天 |
第三天 |
周董 |
信哥 |
蔡依林 |
小七 |
信哥 |
周董 |
小七 |
蔡依林 |
蔡依林 |
小七 |
周董 |
信哥 |
小七 |
蔡依林 |
信哥 |
周董 |
能够看出。当四个人比赛的时候,要比3天才干所有比完。
2,当n为奇数时,循环赛要进行n天;如图,现有运动员:周董,信哥。蔡依林
,比赛安排表例如以下:
运动员 |
第一天 |
第二天 |
第三天 |
周董 |
信哥 |
蔡依林 |
X |
信哥 |
周董 |
X |
蔡依林 |
蔡依林 |
X |
周董 |
信哥 |
能够看出,当n=3时,人数为奇数,而且出现轮空现象。
综上。我们能够得出一个基本结论
|
比赛次数= |
n为偶数 |
n-1天 |
n为奇数 |
n天 |
算法描写叙述:
依照分治策略,我们将n个选手先一分为二。每组n/2人。假设n为奇数,则(n+1)/2后分组。然后像我们一起的归并排序那样,一直分下去,直到最后仅仅有两个人比赛。
举例说明。6个人比赛。须要比赛5天,安排例如以下:
1 |
2 |
3 |
4 |
5 |
6 |
2 |
1 |
5 |
3 |
6 |
4 |
3 |
6 |
1 |
2 |
4 |
5 |
4 |
5 |
6 |
1 |
3 |
2 |
5 |
4 |
2 |
6 |
1 |
3 |
6 |
3 |
4 |
5 |
2 |
1 |
回忆我们的归并排序,归并排序是先分开。最后再合起来。
这里也是。
我们先将6个人分成2组。每组3个人([1,2,3],[4,5,6]),然后发现3是个奇数。然后在每组中+1个虚拟人:X和Y;这样,每组就变成了4个人,然后将这4个人在除以2。我们就得到了一个两两组合的小的组。
首先来看[1,2]; [3,x]
1 |
2 |
2 |
1 |
3 |
X |
X |
3 |
将这两组合起来:
1 |
2 |
2 |
1 |
3 |
X |
X |
3 |
这样,第一天的比赛排好了,然后来排第二天的比赛。
接下来第二天让1跟3比較,这样2就仅仅能跟x比較了。
1 |
2 |
3 |
2 |
1 |
3 |
3 |
X |
1 |
X |
3 |
2 |
依此类推。第三天,让1跟x比較,2跟3比較:
1 |
2 |
3 |
x |
2 |
1 |
x |
3 |
3 |
X |
1 |
2 |
X |
3 |
2 |
1 |
这里要得到3个选手的比赛安排,所以,我们将假象的X去掉。并将它的位置以*取代:
1 |
2 |
3 |
* |
2 |
1 |
* |
3 |
3 |
* |
1 |
2 |
然后我们也依照这个规律,安排[4,5,6]的日程,得到表格
4 |
5 |
6 |
* |
5 |
4 |
* |
6 |
6 |
* |
4 |
5 |
将前3天的日程安排合并起来:
1 |
2 |
3 |
* |
2 |
1 |
* |
3 |
3 |
* |
1 |
2 |
4 |
5 |
6 |
* |
5 |
4 |
* |
6 |
6 |
* |
4 |
5 |
我们能够看到,第一天。3和6都空暇。能够让他们比赛。第二天,2和5都空暇,能够让他们比赛;第三天。1和4空暇,让他们相互比赛。
所以,上表又一次安排,得到前3天的日程安排表:
1 |
2 |
3 |
4 |
2 |
1 |
5 |
3 |
3 |
6 |
1 |
2 |
4 |
5 |
6 |
1 |
5 |
4 |
2 |
6 |
6 |
3 |
4 |
5 |
这样,我们就比較过了[1,2,3]和[4,5,6].
然后循环下,得到:
[1,2,3]& [5,6,4] |
[1,2,3]& [6,4,5] |
安排三天的比赛:
1 |
2 |
3 |
5 |
2 |
1 |
6 |
3 |
3 |
4 |
1 |
2 |
5 |
6 |
4 |
1 |
6 |
5 |
2 |
4 |
4 |
3 |
5 |
6 |
1 |
2 |
3 |
6 |
2 |
1 |
4 |
3 |
3 |
5 |
1 |
2 |
6 |
4 |
5 |
1 |
4 |
6 |
2 |
5 |
5 |
3 |
6 |
4 |
选取黄色的日程安排,增加到前3天的日程安排表中:
1 |
2 |
3 |
4 |
5 |
6 |
2 |
1 |
5 |
3 |
6 |
4 |
3 |
6 |
1 |
2 |
4 |
5 |
4 |
5 |
6 |
1 |
3 |
2 |
5 |
4 |
2 |
6 |
1 |
3 |
6 |
3 |
4 |
5 |
2 |
1 |
假设n恰好等于2^k,那么。安排日程表就变得比較简单了,我们先安排两位选手,
1 |
2 |
2 |
1 |
安排4位选手:
1 |
2 |
3 |
4 |
2 |
1 |
4 |
3 |
3 |
4 |
1 |
2 |
4 |
3 |
2 |
1 |
这时候,我们先依照两个选手的。将1和2的安排填好,然后填写左下角的安排,然后将左下角的元素抄到右上角,最后将左上角的元素抄到右下角。
小结:
分治法在将大问题一步一步两两分,直到划分成能够解决的小问题时,求出这些小问题的解,然后再将小问题合成大问题的解,可是前提是这些小问题在求解是不受到其它小问题的解的影响的。