例如给定3 x 3矩阵
1 2 3
4 5 6
7 8 9
的最大xor值= 15 子矩阵
2
5
8
是具有索引1的列矩阵
对于1D数组,trie是一种可能的方法,但是无法想到2D阵列的任何方法
答案 0 :(得分:1)
直接的解决方案是
枚举所有可能的行范围(上限和下限)
对于每个范围,将范围中的行垂直相加到一行。
假设我们正在研究问题中的示例,并且我们试图找到从Row2开始并在Row3结束的子矩阵中的最大xor。
然后我们可以将4 5 6
和7 8 9
垂直相加到
4 xor 7 5 xor 8 6 xor 9 = 3 13 15
将算法用于一维数组。在这个例子中,我们可以发现7 8 9
的最大xor和是15,表示子矩阵
6
9
这将是一个O(n ^ 3log(最大值))解决方案。
答案 1 :(得分:0)
您可以使用https://en.wikipedia.org/wiki/Fenwick_tree进行快速xor计算和更新。段树是可以使用的另一种结构。它具有类似的特性,但使用更多的内存。两者都可以用于1D阵列情况。
答案 2 :(得分:0)
加速暴力尝试所有可能性方法的一种方法是找到一种方法来计算任意子矩阵的结果,而不需要将所有元素拼凑在一起。你可以这样做,如果你准备一个表,其中T(x,y)的条目是所有元素(i,j)的xor,其中i <= x和j&lt; = y,因为你可以计算任何sub -matrix通过xorring四个元素。
现在,如果你想要答案,例如子矩阵M(3-10,5-23)你应该发现它是T(10,23)^ T(2,23)^ T(10,4)^ T(2,4)
第一个术语涵盖了您想要的所有元素,但包括i和j值太低的元素。第二项删除i值太低的那些。第二个术语删除了j值太低的那些术语,但同时也删除了i和j值都太低的那些。最后一项更正了这次双重删除。
答案 3 :(得分:0)
可能与2D Matrix中的最大和矩形有关? :)