存储和操作数据的最佳数据结构?

时间:2012-01-24 15:02:17

标签: java data-structures

我正在编写一个简单的Java程序,它将输入一个文本文件,其中有一些数字代表一个(n×n)矩阵,其中数字用空格分隔。例如:

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

然后我想将这些数字存储在一个数据结构中,然后我将用它来操纵数据(包括,比较基本数字以及根据特定规则删除某些数字)。 如果删除了一个数字,则其上方的所有其他数字都会减少空格量。 对于上面的例子,如果我删除8和9,那么结果将是:

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

因此数字在他们的专栏中落下。 最后,给定的矩阵将始终为正方形(因此总是n x n,其中n将始终给定并且始终为正),因此,数据结构必须灵活,几乎可以接受任何n值。

我最初是在一个二维数组中实现它,但是如果有人知道我可以使用更好的数据结构来提高效率,那我就会徘徊(这样可以让我更快地访问所有矩阵中的相邻数字(行和列)。 最终,mu程序将根据规则自动检查相邻数字,我删除数字,重新格式化矩阵,并继续前进,最后我希望能够创建一个AI,将从矩阵中删除尽可能多的数字对于任何nxn矩阵,可以在尽可能少的移动中使用。

5 个答案:

答案 0 :(得分:1)

在我看来,你知道你开始时阵列的长度,你最好使用数组。简单的dataType将更容易导航(直接访问)。然后,使用LinkedLists,您将能够删除中间值,而无需重新排列矩阵内的数据。这将使您的“top”值为null。在你的例子中:

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

希望这有帮助。

答案 1 :(得分:1)

数组访问非常快。访问相邻元素很容易,因为您只需增加相关索引(了解边界)。您可以编写方法来封装经过良好测试的操作。虽然元素“倒下”可能会变得复杂,但如果你通过编写经过良好测试的方法将其模块化,那么这应该不会太糟糕。

所有这一切,如果你不需要绝对最佳速度,还有其他选择。

您还可以考虑修改循环链接列表。在实现数独求解器时,我使用了the structure outlined here。查看图像,您将看到这将允许您根据需要修改二维数组,因为您需要做的就是移动指针。

我会在这里发布描述数据结构的相关图片的屏幕截图,但如果我违反了某种版权或作者的其他权利,有人会警告我,我会很感激,在这种情况下,我会把它拿下来......

enter image description here

答案 2 :(得分:1)

您可以使用大小为n*n的一维数组。

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

要访问坐标为(i,j)的元素,请使用myMatrix[i + j * n]。要删除元素,请使用System.arraycopy移动线条。

使用特殊值(例如Integer.MIN_VALUE)作为()洞的标记。

我希望它是最快且最节省内存的解决方案。

答案 3 :(得分:0)

尝试一个LinkedList s的数组。

答案 4 :(得分:0)

如果您希望数字自动下降,我建议您使用列表作为颜色。