―Give Exemples (les étudiants de planification des cours) -
Méthodes de traitement normales de réflexion et méthodes de traitement d'optimisation:
Par exemple, planifier des cours pour les étudiants. Les étudiants et les cours sont une relation plusieurs à plusieurs.
Selon la logique normale, il devrait y avoir un tableau d'association pour maintenir la relation entre les deux.
Ajoutez maintenant une contrainte de vérification. Par exemple: les cours que Zhang San a appris au dernier semestre ne devrait pas être prévu pour de tels cours lors de la planification des cours.
Par conséquent, une table de contraintes (c'est-à-dire la table de notes historiques) doit apparaître.
En fait: les horaires de sélection des cours des étudiants nécessitent des tables de notes des étudiants comme contraintes.
―SCheme 1: Méthode de traitement normal -
Lorsqu'un étudiant reprend la sélection du cours. Vous devez consulter le calendrier de sélection des cours de l'étudiant pour voir s'il existe déjà.
C'est-à-dire que la vérification suivante est:
// interroge si les données avec le code étudiant et le code A et B existent respectivement // La liste SET stocke toutes les données des enregistrements de sélection de cours étudiants dans la liste <StudentRecordity> listStudentRecord = Service.Findall (); // interroge les données pour voir si StudentRecorDentity existe déjà SENSR = ListSTUDentRecord.Find (S => S.STUDENTCODE == A && s.code == b); If (enr == null) {// étudiant n'a pas choisi ce cours // ....} else {// étudiant a sélectionné ce cours // ....}Le code ci-dessus est très concis. Et c'est très facile à comprendre.
Supposons d'abord qu'il y ait 5 000 étudiants et 100 cours. Ensuite, pour l'ensemble de données pour que les étudiants choisissent des cours, le volume de données sera de 5 000 * 100. Le volume de données sera l'ordre de grandeur du niveau de 100 000.
Parmi les 100 000 données, interrogez un enregistrement d'étudiant = un cours = B. L'exécution sera inefficace. Parce que la requête de la méthode Find est également l'endroit où la requête, c'est-à-dire la recherche en traversant l'ensemble de données.
Alors, utilisez le code ci-dessus. À mesure que le volume de données augmente progressivement, l'efficacité d'exécution du programme baissera considérablement.
PS: Le volume de données augmente, ce qui n'est pas très approprié dans cet exemple. L'exemple peut ne pas être approprié. Quoi qu'il en soit, c'est probablement ce que cela signifie. )
―Scheme 2: Utilisez la mémoire pour l'efficacité d'optimisation -
Cette pratique nécessite une consommation de mémoire. Ou faire le travail de vérification à l'avance (l'initialisation des données est effectuée pendant le déploiement du système). Autrement dit: lorsque la page est chargée, les données sont appelées uniquement à la méthode publique fournie pour la vérification.
// Code étudiant pour indexer le dictionnaire privé <chaîne, int> _dicstudentCodetoArrayIndex; // Code de cours à indexer les données Dictionnaire privé <String, int> _dicCoursEcodetoArrayIndex; // Tous les étudiants Liste <StudentEntity> ListStudent = Service.FindalStudEx () Liste des enregistrements de sélection des étudiants des étudiants <StudentecoursEentity> listStudentRecord = Service.Finall (); private int [,] _ConnStudentRecord = new int [listStudent.Count, listcourse.count]; // construire un éventail d'étudiants et de cours pour trouver rapidement Dictionary Index private Void genedatedic () {pour (int I = 0; _DicStudentCodetoArrayIndex.add (listStudent [i] .code, i)} pour (int i = 0; i <listCourse.Count; i ++) {_ DicCourSecodeToArrayIndex.add (listCourseal [i] .code, i)}} // Construire un arrivée à deux dimensions pour les étudiants pour les étudiants pour les étudiants. 1 signifie que l'étudiant a sélectionné le cours privé void generatArray () {foreach (StudentRecordentity sre dans listStudentRecord) {int x = _dicstudentCodetoArrayIndex [sre.studentcode]; int y = dicCoursEcodetoArrayIndex [sre.CourSecode]; ConnstudentRecord [x, y] = 1;}} // Méthode ouverte: interrogez si l'enregistrement de sélection du cours existe basé sur le code étudiant et le code de cours /// <retourne> Retour 1 signifie qu'il existe. Return 0 signifie qu'il n'existe pas </ returns> public void VerifyRecordByStudentCodeAndCourSeCode (String pStudentcode, String pcoursEcode) {int x = _dicstudentCodeToArrayIndex [PSTUDENTCODE]; int y = _DicCouReDetoArrayIndex [PCOURSECODE]; ConnstudentRecord [x, y];}«Analyse des performances -
Analyser l'apparence de la deuxième solution.
1. Il existe de nombreuses façons.
2. Il existe de nombreuses variables utilisées.
Tout d'abord, je dois en parler. Le but de cette optimisation est d'améliorer le phénomène de lag (grande quantité de données de vérification) que les étudiants rencontrent lors du choix des cours.
Les deux schémas ci-dessus sont analysés séparément:
Supposons que l'étudiant est n et que le cours est m
La première solution:
La complexité du temps est facile à calculer la première solution avec un minimum d'O (nm)
La deuxième solution:
1. Il existe de nombreux codes. Mais l'utilisateur ne fournit qu'une méthode VerifyRecordByStudentCodeAndCourScode.
2. Il existe de nombreuses variables, car cette solution consiste à utiliser la mémoire pour améliorer l'efficacité.
Processus d'exécution de cette méthode: 1. Utilisez le code dans Dictionary pour trouver l'index2 et utilisez l'index pour interroger le tableau.
Dans la première étape, la requête du dictionnaire utilise l'algorithme de recherche de hachage. La complexité du temps est O (LGN) et le temps est relativement rapide. La deuxième étape est que la complexité temporelle est O (1), car le tableau est continu. L'index consultera directement l'adresse correspondante.
Par conséquent, la deuxième solution est utilisée pour la vérification, et la complexité temporelle de la deuxième solution est O (LGN + LGM)
-Résumer-
Grâce à l'analyse ci-dessus, on peut voir que les efforts de mémoire peuvent améliorer l'efficacité d'exécution du programme. Ce qui précède n'est qu'un exemple, et la qualité d'optimisation dépend de la structure des données utilisée.
Ce qui précède est l'intégralité du contenu de cet article sur le code d'instance de la structure des données d'optimisation des performances Java, j'espère qu'il sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!