Está en la página 1de 10

Calendario de un campeonato

El problema:
En una competicin deportiva se enfrentan n
participantes.
Debe confeccionarse un calendario para que cada
participante juegue exactamente una vez con
cada adversario.
Adems, cada participante debe jugar
exactamente un partido diario.
Supongamos, por simplificar, que n=2k.

J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 52

Calendario de un campeonato
v

La representacin de los datos y de la


solucin:
Participantes: 1, 2, , n.
Cada participante debe saber el orden en el que
se enfrenta a los n-1 restantes.
Por tanto, la solucin puede representarse en una
matriz n(n-1).
das

644
47444
8
1
2
3
4
participantes 5
6
7
8

1
2
1
4
3
6
5
8
7

2
3
4
1
2
7
8
5
6

3
4
3
2
1
8
7
6
5

4
5
8
7
6
1
4
3
2

5
6
5
8
7
2
1
4
3

6
7
6
5
8
3
2
1
4

7
8
7
6
5
4
3
2
1

El elemento (i,j), 1in, 1jn-1, contiene el


nmero del participante contra el que el
participante i-simo compite el da j-simo.

J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 53

Calendario de un campeonato
v

Solucin de fuerza bruta:


1. Se obtiene para cada participante i, 1in, el
conjunto P(i) de todas las permutaciones posibles
del resto de los participantes {1..n}\{i}.
2. Se completan las filas de la matriz de todas las
formas posibles, incluyendo en cada fila i algn
elemento de P(i).
3. Se elige cualquiera de las matrices resultantes en
la que toda columna j, 1jn-1, contiene nmeros
distintos (nadie puede competir el mismo da
contra dos participantes).
Cada conjunto P(i) consta de (n-1)! elementos.
La matriz tiene n filas.
Hay n! formas distintas de rellenar la matriz.
Es demasiado costoso!

J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 54

Calendario de un campeonato
v

Una solucin mediante la tcnica de


divide y vencers (caso n=2k, k>0):
Caso bsico: n=2, basta con una competicin.
Caso a dividir: n=2k, con k>1.
u Se elaboran independientemente dos
subcalendarios de 2k-1 participantes:
Uno para los participantes 1..2k-1, y
otro para los participantes 2k-1+1..2k.
u Falta elaborar las competiciones cruzadas
entre los participantes de numeracin
inferior y los de numeracin superior.
Se completa primero la parte de los
participantes de numeracin inferior:
1er participante: compite en das sucesivos con los participantes de
numeracin superior en orden
creciente.
2 participante: toma la misma secuencia y realiza una permutacin cclica de
un participante.
Se repite el proceso para todos los
participantes de numeracin inferior.
Para los de numeracin superior se
hace lo anlogo con los de inferior.

J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 55

Calendario de un campeonato
1
1 2
2 1

1
3 4
4 3

1
2
3
4

1
2
1
4
3

2
3
4
1
2

1
5 6
6 5

3
4
3
2
1

1
2
3
4
5
6
7
8

1
7 8
8 7

5
6
7
8

1
2
1
4
3
6
5
8
7

2
3
4
1
2
7
8
5
6

3
4
3
2
1
8
7
6
5

4
5
8
7
6
1
4
3
2

5
6
5
8
7
2
1
4
3

6
7
6
5
8
3
2
1
4

1
6
5
8
7

2
7
8
5
6

3
8
7
6
5

7
8
7
6
5
4
3
2
1

J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 56

Calendario de un campeonato
tipo
tipo tabla=vector[1..n,1..n-1]
tabla=vector[1..n,1..n-1] de
de 1..n
1..n
algoritmo
algoritmo calendario(sal
calendario(sal t:tabla)
t:tabla)
{Devuelve
de
{Devuelve en
en tt al
al calendario
calendario
de competicin
competicin de
de
k
nn participantes,
con
n=2
,
k>0.}
k
participantes, con n=2 , k>0.}

principio
principio
formarTabla(t,1,n)
formarTabla(t,1,n)
fin
fin
algoritmo
algoritmo formarTabla(sal
formarTabla(sal t:tabla;
t:tabla;
ent
ent inf,sup:1..n)
inf,sup:1..n)
{Forma
{Forma la
la parte
parte de
de tabla
tabla correspondiente
correspondiente aa los
los
enfrentamientos
enfrentamientos de
de los
los participantes
participantes inf..sup}
inf..sup}

variable
variable medio:1..n
medio:1..n
principio
principio
si
si inf:=sup-1
inf:=sup-1
entonces
entonces t[inf,1]:=sup;
t[inf,1]:=sup; t[sup,1]:=inf
t[sup,1]:=inf
sino
sino
medio:=(inf+sup)
medio:=(inf+sup) div
div 2;
2;
formarTabla(t,inf,medio);
formarTabla(t,inf,medio);
formarTabla(t,medio+1,sup);
formarTabla(t,medio+1,sup);
completarTabla(t,inf,medio,
completarTabla(t,inf,medio,
medio,sup-1,medio+1);
medio,sup-1,medio+1);
completarTabla(t,medio+1,sup,
completarTabla(t,medio+1,sup,
medio,sup-1,inf)
medio,sup-1,inf)
fsi
fsi
fin
fin
J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 57

Calendario de un campeonato
algoritmo
algoritmo completarTabla(ent/sal
completarTabla(ent/sal t:tabla;
t:tabla;
ent
eqInf,eqSup,
ent eqInf,eqSup,
daInf,daSup,
daInf,daSup,
eqInic:1,,n)
eqInic:1,,n)
{Rellena
{Rellena t[eqInf..eqSup,daInf..daSup]
t[eqInf..eqSup,daInf..daSup] con
con
permutaciones
cclicas
empezando
en
eqInic}
permutaciones cclicas empezando en eqInic}

principio
principio
para
para j:=daInf
j:=daInf hasta
hasta daSup
daSup hacer
hacer
t[eqInf,j]:=eqInic+j-daInf
t[eqInf,j]:=eqInic+j-daInf
fpara;
fpara;
para
para i:=eqInf+1
i:=eqInf+1 hasta
hasta eqSup
eqSup hacer
hacer
t[i,daInf]:=t[i-1,daSup];
t[i,daInf]:=t[i-1,daSup];
para
para j:=daInf+1
j:=daInf+1 hasta
hasta daSup
daSup hacer
hacer
t[i,j]:=t[i-1,j-1]
t[i,j]:=t[i-1,j-1]
fpara
fpara
fpara
fpara
fin
fin

J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 58

Calendario de un campeonato
v

Coste temporal:
Recurrencia:

( )

T (n) = 2T n 2 + n 2 4

Por tanto, O(n2).

Y si n no es potencia de 2?
Supongamos que est resuelto para n par.
Si n es impar (mayor que 1), no bastan con n-1
das para la competicin, sino que se necesitan n.
Basta con resolver el problema resultante de
aadir un participante (ficticio) ms: el n+1.
Como n+1 es par, podemos calcular el
calendario, que consta de n das.
Una vez resuelto, si al participante i-simo le
toca jugar el da j-simo contra el participante
n+1 (ficticio), eso significa que j es el da de
descanso para el participante i.

J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 59

Calendario de un campeonato
v

Y si n es par?
Si n div 2 es par, se puede aplicar el algoritmo
formarTabla (visto para el caso n=2k).
Si n div 2 es impar:
Paso 1:
u Se calcula la primera parte de la competicin
para los n div 2 participantes de numeracin
inferior, aadiendo un participante ficticio.
u Se calcula la primera parte de la competicin
para los otros n div 2 participantes ,
aadiendo otro participante ficticio.
Paso 2:
u El da j-simo, 1jn div 2, se hace jugar
entre s a los dos participantes, uno de
numeracin inferior y otro superior, a los
que les haba tocado el j como da de
descanso en el Paso anterior.
Paso 3:
u Se completa el resto de la tabla con
competiciones cruzadas, de forma parecida
a como se hizo en el algoritmo
completarTabla.

J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 60

Calendario de un campeonato
1
2

1
2
1

3
c

1
c
3

.
.
.

1 2 3
1
2
3
c

2
1
c
3

3
c
1
2

.
.
.
1 2 3

4
5
a
d

c
3
2
1

5
4
d
a

a
d
4
5

d
a
5
4

.
.
.

1 2 3 4 5
1
2
3
4
5
a

2
1
a
5
4
3

3
5
1
a
2
4

1
2
3
4
5
6
7
8
9
10

4
3
2
1
a
5

5
a
4
3
1
2

.
.
.
1 2

a
4
5
2
3
1

6 7 8 9
7
6 10 8
8
b 6 7
9 10 b 6
10 9 7 b
b
8 9 10

10
b
9
8
6
7

b
9
10
7
8
6

1 2

2
1
8
5
4
7
6
3
10
9

4
3
2
1
10
9
8
7
6
5

5
7
4
3
1
10
2
9
8
6

6
4
5
2
3
1
9
10
7
8

8
9
10
6
7
4
5
1
2
3

9
10
6
7
8
3
4
5
1
2

10
6
7
8
9
2
3
4
5
1

7
8
9
10
6
5
1
2
3
4

3
5
1
9
2
8
10
6
4
7

J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 61

También podría gustarte