我像这样一个2D数组,就像一个矩阵:
{{1, 2, 4, 5, 3, 6},
{8, 3, 4, 4, 5, 2},
{8, 3, 4, 2, 6, 2},
//code skips... ...
}
(数组未排序) 我希望获得所有“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个带位置的列表。