1.はじめに
データ構造には、線形構造と非線形構造が含まれます。
1.1線形構造
- 線形構造は最も一般的なデータ構造であり、データ要素と添え字の間の1対1の対応が特徴です。
- 線形構造には、シーケンシャルストレージ構造(配列)とチェーンストレージ構造(リンクリスト)の 2つの異なるストレージ構造があります。順次格納された線形テーブルは順次テーブルと呼ばれ、順次テーブルに格納されたデータはストレージスペースで連続しています。チェーンストレージ線形テーブルはリンクリストと呼ばれ、リンクテーブルのデータは必ずしもストレージスペース、要素で連続しているとは限りませんノードは、データ要素と隣接する要素のアドレス情報を格納します。
- 一般的な線形構造は、配列、キュー、リンクリスト、スタックです。
1.2非線形構造
- 非線形構造には、2次元配列、多次元配列、一般化されたテーブル、グラフ構造、およびツリー構造が含まれます。
第二に、スパース配列の概念と実践
2次元配列に多くの無意味なデータがある場合、疎配列を選択して配列を保存できます。
2.1実際のニーズ
バックギャモンプログラムの実現には、セーブ、エグジット、プレイ継続機能があります。
この2次元配列のデフォルト値は0であるため、無意味なデータが大量に記録されるため、スパース配列を使用して配列を保存できます。
2.2基本的な紹介
2.2.1スパース配列の処理方法は
- 配列の行と列の数、および存在するさまざまな値の数を記録します。
- 2次元配列のサイズを縮小するために、小規模な配列に異なる値を持つ要素の行と値を記録します。
2.2.2応用例
変換された配列の説明:
- [0]列:元の2次元配列が6行と7列であり、そのうち8つのデータ値がデフォルト値ではないことを示します。
- [1]列:元の2次元配列の行0と列3の位置を示すデータ値は22です。その後のデータ表現はこれに似ています。
2.2.3コードの実装
2.2.3.1思考分析
- 2次元配列をスパース配列に変換するアイデア
- 元の2次元配列をトラバースして、有効なデータの合計数を取得します
- 合計によれば、スパース配列sparseArr int [sum + 1] [3]を作成できます
- 2次元配列の有効データをスパース配列に格納します
- スパース配列を元の2次元配列に変換するアイデア
- まず、スパース配列の最初の行を読み取り、最初の行のデータに基づいて元の2次元配列を作成します(例:chessArr2 = int above [11] [11])。
- スパース配列の最後の数行のデータを読み取り、元の2次元配列に割り当てます。
2.2.3.2コード
コードの実装:https : //github.com/goSilver/daydayup/blob/master/datastructure/src/hanshunping/chapter03/SparseArray.java
3.キューの概念と実践
3.1キューの概要
- キューは順序付けされたリストであり、配列またはリンクリストとして実装できます。
- 先入れ先出しの原則に従います。
3.2アレイシミュレーションキューのアイデア
キューは順序付けられています。配列メカニズムを使用してキューをシミュレートする場合、配列に対して次のステートメントを作成する必要があります。
-
maxSizeはキューの最大容量です。
-
キューの入力と出力はそれぞれ前面と背面から処理されるため、キューの前面と背面の添え字を記録するには、2つの変数frontとRearが必要です。フロントは、データ出力で変化するキューの先頭を表し、リアは、データ入力で変化するキューの終わりを表します。以下に示すように:
-
キューにデータを保存するときは、2つの手順が必要です。最初にキューがいっぱいかどうかを確認し、ポインターの後方がキューの最大容量maxSize-1より小さい場合は保存できます。それ以外の場合はデータを保存できません。2番目の手順はテールです。 1ビット戻ります(リア++)。
-
データをフェッチするときは、キューが空かどうかを判別する必要があります。front== Rearの場合は、キューが空であることを意味します。
3.2.1コード
コードの実装:https : //github.com/goSilver/daydayup/blob/master/datastructure/src/hanshunping/chapter03/arrayqueue/ArrayQueueDemo.java
3.3配列を使用したリングキューの最適化のシミュレーション
3.2での実装では、配列が1回しか使用できず、再利用できないという問題がありますが、ここでは単純なアルゴリズムを使用して、配列を循環配列に改善できます。(変調)
アイデアの説明:
- フロント変数の意味を調整します。フロントはキューの最初の要素を直接指し、フロントの初期値は0になります。
- リア変数の意味を調整します。リアはキューの最後の要素の最後の位置を指します。慣例としてスペースを空ける必要があるため、リアの初期値は0です。
- キューがいっぱいになると、条件は(リア+ 1)%maxSize = front [full];になります。
- キューが空の場合、rear == front [empty];
- キュー内の有効なデータの数:(リア+ maxSize-front)%maxSize
3.3.1コード
コードの実装:https : //github.com/goSilver/daydayup/blob/master/datastructure/src/hanshunping/chapter03/arrayqueue/CircleArrayQueueDemo.java