2012-01-24 150 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)作为()孔的标记。

我认为这将是最快和最有效的解决方案。