2012-01-24 199 views
1

我正在寫一個簡單的Java程序,它將輸入一個文本文件,它將有一些數字表示一個(n×n)矩陣,其中數字用空格分隔。爲前:存儲和操作我的數據的最佳數據結構?

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 

這樣的數字落下在他們的專欄 最後,給出的矩陣將永遠是方形的(所以阿爾瓦ys n x n,其中n將始終給出並始終爲正數),因此,數據結構必須靈活以實際接受任何n值。

我最初是在一個2維數組中實現它,但如果有人想要一個更好的數據結構,我可以使用它來提高效率(我可以更快速地訪問所有數據結構矩陣中的相鄰數字(行和列) 最終,mu程序會根據規則自動檢查相鄰數字,刪除數字,重新格式化矩陣並繼續前進,最後我希望能夠創建一個AI將從基質中的移動,儘可能最少量的除去儘可能多的數字作爲可能的,任何NxN矩陣。

回答

0

如果你想讓數字自動下降,我建議你使用coloumns列表。

1

在我看來,你在開始時知道你的數組長度,你最好使用數組。一個簡單的數據類型將更容易導航(直接訪問)。然後,再次使用LinkedLists,您將能夠刪除中間值而無需重新排列矩陣中的數據。這將使您將「最高」值視爲空。在你的例子中:

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

希望這有助於。

1

數組訪問速度非常快。訪問相鄰的元素很容易,因爲您只需增加相關索引(瞭解邊界)。您可以編寫方法來封裝那些經過良好測試的操作。儘管元素「跌落」雖然可能會變得複雜,但如果您通過編寫經過良好測試的方法進行模塊化,應該不會太糟糕。

所有這一切,如果你不需要絕對最佳的速度,還有其他選擇。

你也可能想考慮一個修改後的循環鏈表。在實施一個數獨求解器時,我使用了the structure outlined here。看着圖像,你會發現,這將允許你修改你的二維數組,因爲你需要做的只是移動指針。

我會在這裏張貼描述數據結構的相關圖片的屏幕截圖,但如果有人會警告我,如果我違反了作者的某種版權或其他權利,那麼我將不勝感激,會把它拿下來...

enter image description here

1

你可以使用一個維排列的大小n*n

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

要訪問元素與座標(i,j)使用myMatrix[i + j * n]。跌倒元素使用System.arraycopy來移動線條。

使用特殊值(例如Integer.MIN_VALUE)作爲()孔的標記。

我認爲這將是最快和最有效的解決方案。