― Exemplos de Didras (aulas de agenda dos alunos) -
Métodos de processamento de pensamento normal e métodos de processamento de otimização:
Por exemplo, agendar aulas para estudantes. Estudantes e cursos são um relacionamento muitos para muitos.
De acordo com a lógica normal, deve haver uma tabela de associação para manter a relação entre os dois.
Agora adicione uma restrição de verificação. Por exemplo: os cursos que Zhang San aprendeu no último semestre não deve ser agendado para esses cursos ao agendar aulas.
Portanto, uma tabela de restrições (isto é, a tabela de grau histórica) precisa aparecer.
Ou seja: os cronogramas de seleção de cursos dos alunos exigem as mesas de nota dos alunos como restrições.
―Scheme 1: Método de processamento normal -
Quando um aluno toma a seleção do curso novamente. Você precisa verificar o cronograma de seleção do curso do aluno para ver se ele já existe.
Isto é, a verificação a seguir é:
// consulta se os dados com o código do aluno e o código do curso A e B existem respectivamente // O conjunto de listas armazena todos os dados dos registros de seleção do curso do aluno na lista <TentudentRecordentity> listStudentRecord = Service.findall (); // consulta os dados para ver se já existe o StudentRecordentity If (ensr == null) {// aluno não escolheu este curso // ....} else {// aluno selecionou este curso // ....}O código acima é muito conciso. E é muito fácil de entender.
Primeiro, suponha que haja 5.000 estudantes e 100 cursos. Então, para o conjunto de dados para os alunos escolherem cursos, o volume de dados será de 5.000*100. O volume de dados será a ordem de magnitude do nível de 100.000.
Entre os 100.000 dados, consulte um registro de Student = A Course = B. A execução será ineficiente. Como a consulta do método Find também é onde a consulta, ou seja, pesquisando atravessando o conjunto de dados.
Portanto, use o código acima. À medida que o volume de dados aumenta gradualmente, a eficiência da execução do programa cairá significativamente.
PS: O volume de dados está crescendo, o que não é muito adequado neste exemplo. O exemplo pode não ser apropriado. De qualquer forma, é provavelmente o que significa. )
- Scheme 2: Use a memória para eficiência de otimização -
Essa prática requer consumo de memória. Ou faça o trabalho de verificação adiante (a inicialização dos dados é realizada durante a implantação do sistema). Ou seja: quando a página é carregada, os dados são chamados apenas para o método público fornecido para verificação.
// Código do aluno para matar Índice Dicionário Privado <String, Int> _dicStudentCodeToArrayIndex; // Código do curso para Índice de Dados Dicionário Privado <String, Int> _dicCourSecODeToarrayIndex; // All Students List <StudentEntity> ListStudent = Service.FindAldurSoUrture.; Lista de registros de seleção de cursos dos alunos <CurtureEntity> listStudEntRecord = Service.Finall (); private int [,] _ConnStudEntrecord = new int [listStudent.count, listcourse.count]; // Construa uma matriz de estudantes e curações para encontrar rapidamente o Índice de Dictionary privado, o privado genérico () (INT; _DicStudentCodeToarrayIndex.add (listStudent [i] .code, i)} para (int i = 0; i <listCourse.count; i ++) {_ dicCourSecOtetoArrayIndex.add (listcourse [i] .code, i)}}} // 1 significa que o aluno selecionou o curso privado void generateArray () {foreach (StudentRecordentity sre em listStudentRecord) {int x = _dicStudentCodeToarrayIndex [sre.studentcode]; y = dicCourSecodeTOARRAYIndex [sre.courSecode]; ConnStudentRecord [x, y] = 1;}} // Método aberto: consulta se o registro de seleção do curso existe com base no código do aluno e no código do curso /// <retorno> retornar 1 significa que existe. Retornar 0 significa que ele não existe </leturns> public void verifyRecordByStudentCodeAndCourSecode (String pStudentCode, String pcourSecode) {int x = _dicStudentCodeToarrayIndex [PstudentCode]; Int y = _dicCousSecoArrayRayEx [PSTUDENTCODE]; ConnStudentRecord [x, y];}― Análise de desempenho -
Analise a aparência da segunda solução.
1. Existem muitas maneiras.
2. Existem muitas variáveis usadas.
Primeiro de tudo, tenho que falar sobre isso. O objetivo desta otimização é melhorar o fenômeno do atraso (grande quantidade de dados de verificação) que os alunos encontram ao escolher cursos.
Os dois esquemas acima são analisados separadamente:
Suponha que o aluno seja n e o curso é M
A primeira solução:
A complexidade do tempo é fácil de calcular a primeira solução com um mínimo de O (nm)
A segunda solução:
1. Existem muitos códigos. Mas o usuário fornece apenas um verificadorRecordByStudentCoDeAndCourSecode Method.
2. Existem muitas variáveis, porque esta solução é usar a memória para melhorar a eficiência.
Processo de execução deste método: 1. Use o código no dicionário para encontrar o index2 e usar o índice para consultar a matriz.
Na primeira etapa, a consulta no dicionário usa o algoritmo de pesquisa de hash. A complexidade do tempo é O (LGN) e o tempo é relativamente rápido. O segundo passo é que a complexidade do tempo é O (1), porque a matriz é contínua. O índice procurará diretamente o endereço correspondente.
Portanto, a segunda solução é usada para verificação e a complexidade do tempo da segunda solução é O (LGN+LGM)
-Resumir-
Através da análise acima, pode -se observar que os esforços de memória podem melhorar a eficiência da execução do programa. O exposto acima é apenas um exemplo, e a qualidade da otimização depende da estrutura de dados usada.
O exposto acima é o conteúdo inteiro deste artigo sobre o código da instância da estrutura de dados de otimização de desempenho Java, espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!