2012-01-24 9 views
1

私は数字がスペースで区切られた(n x n)マトリックスを表すいくつかの数字を持つテキストファイルを入力する簡単なJavaプログラムを書いています。 EX用:私のデータを保存して操作するのに最適なデータ構造ですか?

1 2 3 4 
5 6 7 8 
9 1 2 3 
4 5 6 7 

私はその後、私はその後、adjecent数を比較すると、特定のルールに基づいて特定の番号を削除、含まれる(データを操作するために使用するデータ構造にこれらの番号を保存したい た場合。 。数がそれ以上の他のすべての数字はスペースの量を落下、削除された上記の例の場合 、私は8と9を削除して言うならば、結果は次のようになります。

() 2 3() 
1 6 7 4 
5 1 2 3 
4 5 6 7 

ので、数字が落ちます 最後に、与えられた行列は常に正方形です(したがってalwa ys n x n、nは常に与えられ、常に正である)、したがって、データ構造は、任意のn値を実質的に受け入れるために柔軟でなければならない。

私はもともと2次元配列で実装していましたが、効率を向上させるために使用できるデータ構造がより優れているというアイディアがあれば、私は迷っていました。 (行と列)の隣の数字 最終的に、muプログラムは自動的に隣の数字をルールと照らし合わせてチェックし、数字を削除し、マトリックスをフォーマットし直していきます。任意のn×nの行列のために、可能な限り移動の最小量で可能なマトリックスからのような多くの番号を削除することAIを作成する。

答えて

0

LinkedListの配列を試してください。

0

数字が自動的に落ちるようにするには、coloumnsのリストを使うことをお勧めします。

1

私の意見では、あなたが始めるときに配列の長さを知っていれば、配列を使うほうが良いでしょう。シンプルなデータ型は、ナビゲートしやすくなります(直接アクセス)。次に、LinkedListsを使用して、マトリックス内のデータを再配置することなく中間の値を削除することができます。これにより、 "トップ"値がnullになります。あなたの例では:

null 2 3 null 
1 6 7 4 
5 1 2 3 
4 5 6 7 

これは役に立ちます。

1

アレイアクセスはかなり高速です。隣接する要素にアクセスするのは簡単です。関連するインデックスを増やすだけです(境界を認識する)。十分にテストされた操作をカプセル化するためのメソッドを記述することができます。複雑になるかもしれませんが、要素が落ちることはありますが、よくテストされたメソッドを記述することによってモジュール化すれば、それほど悪くはありません。

絶対に最高のスピードを必要としない場合は、他にもオプションがあります。

変更された循環リンクリストを考慮する必要があります。スドクソルバーを実装するときは、the structure outlined hereを使用しました。イメージを見ると、2次元配列を必要に応じて変更できることがわかります。ポインタを移動するだけでよいからです。

私はデータの構造を記述した写真のスクリーンショットを投稿しますが、著者の著作権やその他の権利に違反していると誰かが私に警告すると感謝します。それを取る...

enter image description here

1

あなたはサイズn*nと1次元配列を使用することができます。座標(i,j)使用myMatrix[i + j * n]で要素にアクセスするには

int []myMatrix = new myMatrix[n * n]; 

。要素を落とすには、System.arraycopyを使用して行を移動します。

()穴の特殊な値(例:Integer.MIN_VALUE)をマークとして使用してください。

私はそれが最も速く、最もメモリ効率の良いソリューションであると期待しています。

関連する問題