—10 세의 예제 (학생 일정 수업) -
정상적인 사고 처리 방법 및 최적화 처리 방법 :
예를 들어, 학생들을위한 수업을 예약합니다. 학생과 코스는 다수의 관계입니다.
정상 논리에 따르면, 둘 사이의 관계를 유지하기위한 연관성 테이블이 있어야합니다.
이제 확인에 대한 제약 조건을 추가하십시오. 예를 들어 : Zhang San 과정은 지난 학기에 수업을 예약 할 때 그러한 과정에 대한 예약을 예약해서는 안됩니다.
따라서 제약 테이블 (즉, 역사적 등급 테이블)이 나타나야합니다.
즉, 학생들의 코스 선정 일정에는 학생의 학년 테이블이 제약으로 필요합니다.
—Scheme 1 : 정상 처리 방법 -
학생이 코스 선택을 다시 할 때. 학생의 코스 선택 일정을 확인하여 이미 존재하는지 확인해야합니다.
즉, 다음 검증은 다음과 같습니다.
// 학생 코드와 코스 코드 A와 B가있는 데이터가 각각 존재하는지 여부를 쿼리하십시오. // 목록 세트는 목록에 학생 코스 선택 레코드의 모든 데이터를 저장합니다. // StudentRecordentity가 이미 존재하는지 확인하기 위해 데이터를 쿼리합니다. if (ensr == null) {// 학생 이이 과정을 선택하지 않았습니다 // ....} else {// 학생 이이 과정을 선택했습니다 // ....}위의 코드는 매우 간결합니다. 그리고 이해하기가 매우 쉽습니다.
첫째, 5,000 명의 학생과 100 개의 코스가 있다고 가정합니다. 그런 다음 학생들이 코스를 선택할 수있는 데이터 세트의 경우 데이터 볼륨은 5,000*100입니다. 데이터 볼륨은 100,000 레벨의 크기입니다.
100,000 데이터 중에서 학생의 레코드를 쿼리하십시오 = A 코스 = B. 실행은 비효율적입니다. 찾기 메소드의 쿼리는 또한 쿼리, 즉 데이터 세트를 통과하여 검색하기 때문입니다.
따라서 위의 코드를 사용하십시오. 데이터 볼륨이 점차 증가함에 따라 프로그램의 실행 효율이 크게 떨어질 것입니다.
추신 : 데이터 볼륨이 커지고 있으며이 예에서는 그다지 적합하지 않습니다. 예제는 적절하지 않을 수 있습니다. 어쨌든, 아마 그것이 의미하는 바일 것입니다. ))
- 스케일 2 : 최적화 효율성을 위해 메모리를 사용합니다 -
이 연습에는 메모리 소비가 필요합니다. 또는 검증 작업을 수행하십시오 (데이터 초기화는 시스템 배치 중에 수행됩니다). 즉, 페이지가로드되면 데이터가 제공된 공개 방법으로 만 호출됩니다.
// 학생 코드가 배열 인덱스 개인 사전 <문자열, int> _dicstudentCodetoArrayIndex; // 데이터 인덱스 개인 사전 <문자열, int> _diccoursecodetoArrayIndex; // 모든 학생 목록 <verthedstudent = service.findallstudent (); // 모든 코스 목록 <Coussentity> rowsentity> service.findcoc인. 학생들의 코스 선택 기록 목록 <TudentCourseEntity> ListStudErcord = service.finall (); private int [,] _connstudentRecord = new int [liststudent.count, listcourse.count]; // 학생 및 코스를 신속하게 찾기위한 배열 및 코스 구성 (int i <student); _DICSTUDENTCODETOARRAYINDEX.ADD (int i = 0; i <listcourse.count; i ++) {_ diccoursecodetoArrayindex.add (listStudent [i] .code, i)}} {_ diccoursecodetoarrayindex.add (listcourse [i] .code, i)}}}}}}}}}}}}. 1 학생이 코스를 선택했음을 의미합니다. Private void generatearray () {foreach (liststudentRecord의 StudentRecordentity sre) {int x = _dicstudentCodetOarrayIndex [sre.studentCode]; int; y = diccoursecodetoarrayindex [sre.coursecode]; connstudentRecord [x, y] = 1;}} // 열기 메소드 : 쿼리 코스 선택 레코드가 학생 코드와 코스 코드를 기준으로 존재하는지 /// <returns> 반환 1은 존재 함을 의미합니다. 반환 0은 존재하지 않음을 의미합니다. </returns> public void void void void void void instudentCodeanDCoursecode (String pstudentCode, String pcoursecode) {int x = _dicstudentCodetoArrayIndex [pstudentCode]; int y = _diccoursoArrayindex [pcoursecode]; ConnstudentRecord [x, y];}- 성능 분석 -
두 번째 솔루션의 모양을 분석하십시오.
1. 여러 가지 방법이 있습니다.
2. 사용 된 많은 변수가 있습니다.
우선, 나는 그것에 대해 이야기해야합니다. 이 최적화의 목적은 학생들이 코스를 선택할 때 만나는 지연 현상 (많은 양의 검증 데이터)을 개선하는 것입니다.
위의 두 가지 체계는 별도로 분석됩니다.
학생이 N이고 코스가 m이라고 가정합니다.
첫 번째 해결책 :
시간 복잡성은 최소 O (NM)로 첫 번째 솔루션을 쉽게 계산할 수 있습니다.
두 번째 해결책 :
1. 많은 코드가 있습니다. 그러나 사용자는 verifyRecordByStudentCodeanDCourSecode 메소드 만 제공합니다.
2.이 솔루션은 메모리를 사용하여 효율성을 향상시키는 것이기 때문에 많은 변수가 있습니다.
이 방법의 실행 프로세스 : 1. 사전에서 코드를 사용하여 index2를 찾아 인덱스를 사용하여 배열을 쿼리하십시오.
첫 번째 단계에서 사전의 쿼리는 해시 검색 알고리즘을 사용합니다. 시간 복잡성은 O (LGN)이고 시간은 비교적 빠릅니다. 두 번째 단계는 배열이 연속적이기 때문에 시간 복잡성이 O (1)이라는 것입니다. 인덱스는 해당 주소를 직접 찾습니다.
따라서 두 번째 솔루션은 검증에 사용되며, 두 번째 솔루션의 시간 복잡성은 O (LGN+LGM)입니다.
-Summarize-
위의 분석을 통해 메모리 노력이 프로그램의 실행 효율을 향상시킬 수 있음을 알 수 있습니다. 위의 예는 단지 예일 뿐이며 최적화 품질은 사용 된 데이터 구조에 따라 다릅니다.
위는 Java 성능 최적화 데이터 구조 인스턴스 코드에 대한이 기사의 전체 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!