- giveの例(学生はクラスをスケジュールします) -
通常の思考処理方法と最適化処理方法:
たとえば、学生向けのスケジューリングクラス。学生とコースは多くの関係です。
通常のロジックによれば、2つの関係を維持するための関連表があるはずです。
ここで、検証のための制約を追加します。たとえば、Zhang Sanが学期を学んだコースは、クラスをスケジュールする際にそのようなコースのスケジュールをスケジュールすべきではありません。
したがって、制約テーブル(つまり、履歴グレードテーブル)が表示される必要があります。
つまり、学生のコース選択スケジュールには、制約として生徒の成績表が必要です。
- シェーム1:通常の処理方法 -
学生が再びコースの選択をするとき。学生のコース選択スケジュールを確認して、既に存在するかどうかを確認する必要があります。
つまり、次の検証は次のとおりです。
//クエリ学生コードとコースコードAとBのデータがそれぞれ存在するかどうか//リストは、リストの学生コース選択レコードのすべてのデータを保存します<StudentRecordEntity> listStudentRecord = serving.findall(); //データをクエリして、学生のレコードが既に存在するかどうかを確認するensr = listStudentRecord.find(s => s.StudentCode == a && s.code == b); if(ensr == null){//学生はこのコースを選択しませんでした// ....} else {//学生がこのコースを選択しました// ....上記のコードは非常に簡潔です。そして、それはとても理解しやすいです。
まず、5,000人の学生と100のコースがあるとします。次に、学生がコースを選択するデータセットの場合、データボリュームは5,000*100になります。データボリュームは、100,000レベルの大きさになります。
100,000のデータの中で、学生= aコース= Bのレコードをクエリします。実行は非効率的です。 Findメソッドのクエリは、クエリ、つまりデータセットを通過することで検索する場所でもあるためです。
したがって、上記のコードを使用します。データボリュームが徐々に増加すると、プログラムの実行効率は大幅に低下します。
PS:データボリュームは増加していますが、この例ではあまり適していません。例が適切ではないかもしれません。とにかく、それはおそらくそれが意味するものです。 ))
- シェーム2:最適化効率のためにメモリを使用してください -
このプラクティスには、メモリ消費が必要です。または、検証が前方に動作します(データの初期化は、システムの展開中に実行されます)。つまり、ページが読み込まれると、データは検証のために提供されたパブリック方法にのみ呼び出されます。
//アレイコードへのアレイインデックスプライベートディクショナリー<文字列、int> _dicstudentcodetoarrayindex; //データインデックスプライベートディクショナリー<文字列、int> _diccoursecodetoarrayindex; //すべての学生リスト<StudentStudity> listStudent = service.findallstudent(); listCourse = service.findallcourse(); //すべての学生のコース選択記録リスト<StudentCourseEntity> listStudentRecord = service.finall(); private int [、] _connstudentRecord = new int [listStudent.count、listcourse.count]; i = 0; i <listStudent.count; i ++)_dicstudentcodetoarrayindex.add(listStudent [i] .code、i)} for(int i = 0; i <listcourse.count; i ++){_ _ _ diccoursecodetoarryindex.add(construmtion ad(curse [i] .curse [i] .course [i] f.course学生のコース選択マッチング用の2次元配列。 1は、生徒がコースを選択したことを意味しますgeneratearray(){foreach(desudent recordentity sre in liststudentrecord){int x = _dicstudentcodetoarrayindex [sre.studentcode];方法:クエリコース選択レコードが学生コードとコースコードに基づいて存在するかどうか/// <リターン> return 1は、それが存在することを意味します。 return 0は、それが存在しないことを意味します</returns> public void viod verifyrecordbystudentcodeandcoursecode(string pstudentcode、string pcoursecode){int x = _dicstudentcodetoarrayindex [pstudentCode]; ConnStudentRecord [x、y];}- パフォーマンス分析 -
2番目のソリューションの外観を分析します。
1.多くの方法があります。
2。使用される多くの変数があります。
まず第一に、私はそれについて話さなければなりません。この最適化の目的は、学生がコースを選択する際に遭遇するラグ現象(大量の検証データ)を改善することです。
上記の2つのスキームは別々に分析されます。
学生はnであり、コースがmであると仮定します
最初の解決策:
時間の複雑さは、最小のO(nm)で最初のソリューションを簡単に計算できます
2番目のソリューション:
1.多くのコードがあります。ただし、ユーザーはVerifyRecordByStudentCodeandCourseCodeメソッドのみを提供します。
2。この解決策は、メモリを使用して効率を向上させることであるため、多くの変数があります。
このメソッドの実行プロセス:1。辞書でコードを使用してindex2を見つけ、インデックスを使用して配列をクエリします。
最初のステップでは、辞書のクエリはハッシュ検索アルゴリズムを使用します。時間の複雑さはO(LGN)であり、時間は比較的速いです。 2番目のステップは、アレイが連続しているため、時間の複雑さがO(1)であることです。インデックスは、対応するアドレスを直接検索します。
したがって、2番目のソリューションは検証に使用され、2番目のソリューションの時間の複雑さはO(LGN+LGM)です
- サンマリアス -
上記の分析を通じて、メモリの取り組みがプログラムの実行効率を改善できることがわかります。上記は単なる例であり、最適化の品質は使用されるデータ構造に依存します。
上記は、Java Performance Optimization Data Structure Instanceコードに関するこの記事の全体的な内容です。すべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!