Existen diversos algoritmos que solucionan esto.