分治法——循环赛日程安排问题




问题描写叙述:


设有n2^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个虚拟人:XY;这样,每组就变成了4个人,然后将这4个人在除以2。我们就得到了一个两两组合的小的组。

 


首先来看[1,2]; [3,x]

 


1

2

2

1

 


3

X

X

3

 



将这两组合起来:

 

 

1

2

2

1

3

X

X

3

 

 

这样,第一天的比赛排好了,然后来排第二天的比赛。

 

接下来第二天让13比較,这样2就仅仅能跟x比較了。

 

 

1

2

3

2

1

3

3

X

1

X

3

2

 



依此类推。第三天,让1x比較,23比較:

 

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

 

 

 

我们能够看到,第一天。36都空暇。能够让他们比赛。第二天,25都空暇,能够让他们比赛;第三天。14空暇,让他们相互比赛。

 


所以,上表又一次安排,得到前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

 

这时候,我们先依照两个选手的。将12的安排填好,然后填写左下角的安排,然后将左下角的元素抄到右上角,最后将左上角的元素抄到右下角。




小结:


    分治法在将大问题一步一步两两分,直到划分成能够解决的小问题时,求出这些小问题的解,然后再将小问题合成大问题的解,可是前提是这些小问题在求解是不受到其它小问题的解的影响的。








 



posted @ 2017-04-19 20:15  zsychanpin  阅读(607)  评论(0编辑  收藏  举报