スパース配列とキューの概念と実践

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次元配列をスパース配列に変換するアイデア
  1. 元の2次元配列をトラバースして、有効なデータの合計数を取得します
  2. 合計によれば、スパース配列sparseArr int [sum + 1] [3]を作成できます
  3. 2次元配列の有効データをスパース配列に格納します
  • スパース配列を元の2次元配列に変換するアイデア
  1. まず、スパース配列の最初の行を読み取り、最初の行のデータに基づいて元の2次元配列を作成します(例:chessArr2 = int above [11] [11])。
  2. スパース配列の最後の数行のデータを読み取り、元の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

おすすめ

転載: www.cnblogs.com/csh24/p/12725551.html