关于如何快速搜索2D阵列的任何想法?

时间:2010-03-30 14:21:10

标签: arrays optimization programming-languages matrix logic

我像这样一个2D数组,就像一个矩阵:

{{1, 2, 4, 5, 3, 6},
{8, 3, 4, 4, 5, 2},
{8, 3, 4, 2, 6, 2},
//code skips... ...

}

(数组未排序) 我希望获得所有“4”位置,而不是逐个搜索数组,并返回位置,如何更快/更有效地搜索它?提前。

4 个答案:

答案 0 :(得分:6)

你做不到。没有神奇的方法。您的算法始终需要检查矩阵中的每个单元格,因此对于大小为O(n*m)的矩阵,它始终为n * m

如果您可以先排序您的矩阵,那么您可以使用O(log(n) * m),因为您可以在每行内使用二进制搜索。

答案 1 :(得分:1)

要做到这一点的唯一方法是让m * n以某种方式预先排序。你的问题不清楚是否可能。

答案 2 :(得分:1)

没有明显的算法优化(除非您对数据有一些先验知识,例如它已经排序,或者您知道有多少4个)。但是,您可以使用微观优化,例如如果你的数组是32位int并且你可以使用SSE,那么你可以一次加载和比较4个元素。

答案 3 :(得分:0)

您可以选择速度或内存消耗。如果内存不重要,您可以创建存储值的位置列表。所以你仍然有你的m * n数组,但另外还有一个“位置列表”数组。您必须创建“setter”方法,每次添加或更改值时,这些方法会在列表中记下一个位置。因此,我们的想法不是改进搜索,而是避免搜索。

示例:

你有一个2 * 2阵列。

{{0,0}
 {0,0}}

你想在里面加一个4。因此,您必须调用使用参数X,Y和Value调用的方法write。此方法会将您的数组更改为

{{4,0},
 {0,0}}

还要创建一个列表

List4=>{(0,0)}
用四肢的位置。如果你添加第二个4,它看起来像

{{4,0}
 {4,0}}
List4=>{(0,0),(1,0)}

因此,如果你想在矩阵中找到所有4个,你只需要去List4中的所有位置。当然,您必须为数组中的每个值创建一个列表。因此,如果矩阵仅包含每个值一次,则最多可以有m * n个带位置的列表。