"Ejemplos (clases de programación de estudiantes)"
Métodos de procesamiento de pensamiento normal y métodos de procesamiento de optimización:
Por ejemplo, las clases de programación para estudiantes. Los estudiantes y los cursos son una relación de muchos a muchos.
Según la lógica normal, debe haber una tabla de asociación para mantener la relación entre los dos.
Ahora agregue una restricción para la verificación. Por ejemplo: los cursos que Zhang San aprendió el semestre pasado no debería programarse para tales cursos al programar clases.
Por lo tanto, debe aparecer una tabla de restricciones (es decir, tabla de grado histórico).
Es decir: los horarios de selección del curso de los estudiantes requieren las tablas de grado de los estudiantes como restricciones.
"Scheme 1: Método de procesamiento normal -
Cuando un estudiante toma la selección del curso nuevamente. Debe verificar el horario de selección del curso del estudiante para ver si ya existe.
Es decir, la siguiente verificación es:
// Consulta si los datos con el código del estudiante y el código del curso A y B existe respectivamente // el conjunto de listas almacena todos los datos de los registros de selección del curso del estudiante en la lista <SentorRecordEntity> ListStudentRecord = Service.findall (); // consulta los datos para ver si StudentRecordEntity ya existe engrado = ListStudentRecord.Find (S => S.StudentCode == A && S.Code == b); If (ensr == null) {// El estudiante no eligió este curso // ....} else {// El estudiante ha seleccionado este curso // ....}El código anterior es muy conciso. Y es muy fácil de entender.
Primero, suponga que hay 5,000 estudiantes y 100 cursos. Luego, para el conjunto de datos para que los estudiantes elijan cursos, el volumen de datos será de 5,000*100. El volumen de datos será el orden de magnitud del nivel de 100,000.
Entre los 100,000 datos, consulta un registro de alumno = un curso = B. La ejecución será ineficiente. Debido a que la consulta del método Find también es la consulta, es decir, la búsqueda atravesando el conjunto de datos.
Entonces, use el código anterior. A medida que el volumen de datos aumenta gradualmente, la eficiencia de ejecución del programa disminuirá significativamente.
PS: El volumen de datos está creciendo, que no es muy adecuado en este ejemplo. El ejemplo puede no ser apropiado. De todos modos, eso es probablemente lo que significa. )
"Scheme 2: Use la memoria para la eficiencia de la optimización
Esta práctica requiere consumo de memoria. O hacer el trabajo de verificación hacia adelante (la inicialización de datos se lleva a cabo durante la implementación del sistema). Es decir: cuando se carga la página, los datos solo se llaman al método público proporcionado para la verificación.
// Código de estudiante al índice de matriz Diccionario privado <String, int> _DicStudentCodetoArrayIndex; // Código de curso al índice de datos Diccionario privado <String, int> _DicCourSecodeToArrayIndex; // Todos los estudiantes List <deudentity> ListStudent = Service.FindallStudent (); // All Course List <ScurseTity> ListCourse = Service.FindallCourse (); // Lista de registros de cursos de todos los estudiantes <SentudentCourseEntity> ListStudentRecord = Service.Finall (); private int [,] _connstudentRecord = New int [liststudent.count, listcourse.count]; // construye una matriz de estudiantes y cursos para encontrar rápidamente diacricionario privado privado. GeneradoC () {for (int i = 0; i <liststudent.count; i ++) _dicstudentcodetetoarrayindex.add (liststudent [i] .code, i)} para (int (int (int ( i = 0; i <listCourse.Count; i ++) {_ DiccourSecodetoArrayIndex.add (ListCourse [i] .code, i)}} // Construye una matriz bidimensional para la coincidencia de selección de cursos de los estudiantes. 1 significa que el estudiante ha seleccionado el curso privado void generatearray () {foreach (studentRecordity sre en liststudentRecord) {int x = _dicstudentcodetoarrayindex [sre.studentcode]; int y = DicCourSecodetoArrayIndex [sre.coursecode]; connstudentRecord [x, y] = 1;}} // Abrir método: consulte si el registro de selección de cursos existe en función del código del estudiante y el código del curso ///// <rurder> Return 1 significa que existe. Return 0 significa que no existe </return> public void VerifyRecordByStudentCodeAndCourSecode (String PstudentCode, String PCourSecode) {int x = _dicstudentCodetOarrayIndex [pstudentCode]; int y = _dicCourSecodetOarrayEx [pcoursecode]; return ConnstudentRecord [x, y];}"Análisis de rendimiento -
Analice la apariencia de la segunda solución.
1. Hay muchas maneras.
2. Hay muchas variables utilizadas.
En primer lugar, tengo que hablar de eso. El propósito de esta optimización es mejorar el fenómeno de retraso (gran cantidad de datos de verificación) que los estudiantes encuentran al elegir cursos.
Los dos esquemas anteriores se analizan por separado:
Suponga que el estudiante es n y el curso es M
La primera solución:
La complejidad del tiempo es fácil de calcular la primera solución con un mínimo de O (NM)
La segunda solución:
1. Hay muchos códigos. Pero el usuario solo proporciona un método VerifyRecordByStudentCodeAndCourSecode.
2. Hay muchas variables, porque esta solución es usar la memoria para mejorar la eficiencia.
Proceso de ejecución de este método: 1. Use el código en el diccionario para encontrar index2 y use índice para consultar la matriz.
En el primer paso, la consulta en el diccionario utiliza el algoritmo de búsqueda hash. La complejidad del tiempo es O (LGN) y el tiempo es relativamente rápido. El segundo paso es que la complejidad del tiempo es O (1), porque la matriz es continua. El índice buscará directamente la dirección correspondiente.
Por lo tanto, la segunda solución se usa para la verificación, y la complejidad del tiempo de la segunda solución es O (LGN+LGM)
-Resumir-
A través del análisis anterior, se puede ver que los esfuerzos de memoria pueden mejorar la eficiencia de ejecución del programa. Lo anterior es solo un ejemplo, y la calidad de la optimización depende de la estructura de datos utilizada.
Lo anterior es todo el contenido de este artículo sobre el código de instancia de la estructura de datos de optimización de rendimiento de Java, espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!