¿Cómo idearé un algoritmo eficiente para determinar todos los cursos que debo tomar antes de un curso en particular sin un orden topológico?

Me gustó el enfoque de Michael Levin. Aquí hay otra forma en que puede lograr la misma funcionalidad usando java Maps y memotization.

Suposición: tiene una lista de cursos y los cursos de requisitos previos de cada curso.

Cualquier adición adicional del curso de requisitos previos se manejará mediante programación.

Grupos de interés:

Curso de clase {

cadena privada courseName;

List preRequisiteCourseList;

generar captadores;

public void updatePreRequisiteCourseList (Curso curso) {

this.getPreRequisiteCourseList (). add (curso);

}

}

Entrada de clase {

si input es un archivo, analice el archivo, cree una instancia de entrada y agréguelo a la lista.

si la fuente de datos, busca información de entrada, agrégala a la lista. Si hay alguna otra fuente, analícela y cree una instancia de entrada y agréguela a la lista.

}

curso CourseLoader {

mapa estático privado courseMap = new HashMap ();

estático{

// carga ansiosa si la lista de entrada del curso está disponible; de lo contrario no hay necesidad de llamar a esto.

loadCourseFrom (entrada);

}

Public static Map loadCourseFrom (inputList) {

para (cada entrada) {

if (courseMap .containsKey (input.getCourseName ()) {

courseMap .get (input.getCourseName ()). updatePreRequisiteCourseList (input.getCourse ());

}

courseMap .put (input.getCourseName (), input.getCourse ());

}

}

Conductor de clase {

// llame a esto si la lista de entrada cambia y está disponible en tiempo de ejecución.

CourseLoader.loadCourseFrom (entrada);

Curso curso = CourseLoader.getCoursesFor (courseName);

System.out.println (course.getPreRequisiteCourseList ());

}

Notas:

El curso de carga será un proceso único.

La obtención del curso de requisitos previos para un nombre de curso dado será constante.

PD: No compilé esto, pero el diseño seguramente será el mismo.

Simplemente implemente la recursividad con la memorización: una función recursiva que toma el curso que necesita estudiar al final, toma una referencia (o un puntero) al conjunto de todos los requisitos previos y también tiene un caché. Comenzará recursivamente a partir del curso final, pasará por todos los requisitos previos directos, los colocará en caché y en el conjunto de todos los requisitos previos e irá recursivamente de ellos. Sin embargo, se detendrá si se solicita de forma recursiva un curso desde el caché. El conjunto se puede implementar como un árbol de búsqueda binario equilibrado o como una tabla hash. Dependiendo de la elección, el tiempo de ejecución será [matemático] O (E \ log V) [/ matemático] o [matemático] O (E) [/ matemático] respectivamente, si [matemático] E [/ matemático] es el total número de dependencias directas entre un curso y un requisito previo para ello y [matemáticas] V [/ matemáticas] es el número total de cursos. En la práctica, dicho algoritmo “vago” funcionará mucho más rápido porque explorará solo las dependencias que necesita y solo los requisitos previos del curso dado. Puede funcionar mucho más rápido que el tipo de topología [matemática] O (E + V) [/ matemática] en la práctica si las dependencias son escasas (que probablemente lo sean).

Algo como esto hará:

def FindPrerequisutes (
curso,
prerrequisitos directos,
todos_prerequisitos,
cache):
si curso en caché:
regreso
cache.add (curso)
para p en direct_prerequisites [curso]:
all_prerequisites.add (p)
FindPrerequisites (
pags,
prerrequisitos directos,
todos_prerequisitos,
cache)

More Interesting

¿Cuáles son los mejores algoritmos de partición de gráficos para gráficos grandes?

¿Es CodeChef la opción correcta para practicar problemas algorítmicos hoy en día?

¿Cuál es el algoritmo utilizado para llenar el tablero en el juego Bejeweled Blitz?

¿Para qué sirven las estructuras y algoritmos de datos en el desarrollo de aplicaciones, con ejemplos?

Cómo declarar un conjunto de cadenas de tamaño desconocido para obtenerlo del usuario sin usar la función de asignación en C

¿Cuándo debo usar un árbol de búsqueda binario sobre un mapa hash?

Dadas las coordenadas cartesianas de una gran colección (finita) de puntos en 3 espacios, ¿qué combinación de algoritmos y aplicaciones proporcionan la mejor visualización en 3D de la configuración geométrica de estos puntos?

¿Qué algoritmos se pueden usar para determinar si dos preguntas (como las de Quora) son de alguna manera similares?

¿Qué tan difícil es aprender por sí mismo cómo codificar algoritmos eficientes?

¿Cuáles son las ventajas de los diferentes algoritmos de clasificación?

Cómo resolver el problema de invertir la cadena dada si el tamaño de la cadena es mayor que el tamaño de mi RAM

Si tengo que crear un sitio de redes sociales como Facebook, ¿qué cosas tengo que estudiar comenzando desde el front-end hasta el back-end hasta el servidor y los servidores web? ¿Cuáles son todas las cosas que uno debe saber en profundidad?

¿Cuál es la mejor manera de aprender a escribir algoritmos?

¿Puedo encontrar el camino hamiltoniano más corto en un gráfico completo ponderado no dirigido en tiempo polinómico (donde todos los pesos no son negativos)?

Quiero desarrollar un software profesional, ¿qué debo hacer?