Buenas, quería consultar si la idea de esta solucón es correcta.
El algoritmo se basa en llevar un registro de la calse de equivalencia a la que pertenece cada tarjeta. En un principio todas estan en su misma clase. Luego, a medida que voy poniendo tarjetas en la misma clase, chequedo si la calse a la que le acabo de agregar un elemento tiene n/2 o más elementos. Si esto se cumple, por sugerencia sé que debo retornar true y salir, de lo contrario debo continuar.
Algoritmo:
// arreglo para saber a que clase de equiv pertenece cada tarjeta
claseEquiv[t] = t para toda tarjeta t
largo = claseEquiv.largo()
Algoritmo(tarjetas, inf, sup)
// Caso base
if (sup == inf + 1)
if (equivalentes([tarjetas[inf], tarjetas[sup]))
// Si son equivalentes actualizo la calse de equiv de una de las tarjetas
claseEquiv[tarjetas[inf]] = claseEquiv[tarjetas[sup]]
// Chequedo si hay n/2 tarjetas en la clase de equiv de tarjetas[sup]
contador = 0
foreach t en claseEquiv
if (claseEquiv[t] == claseEquiv[tarjetas[sup]]
contador++
endif
endfor
if contador >= largo/2
return true
else
return false
endif
else
return false
else
//Paso recursivo
return Algoritmo(tarjetas, inf, (sup / 2) - 1) || Algoritmo(tarjetas, (sup / 2), sup)
endif
end