给定一个2D平方(n * n)矩阵,我试图找出是否有一种方法在矩阵的上三角形上执行一个小于O(n ^ 2)时间的操作[最好在线性时间] 。请注意,矩阵元素是连续的,如示例所示.i.e:每行和每列中的所有值都已排序。我已使用O(n ^ 2)复杂度解决了这个问题。示例如下:
21 22 23 24 25
26 27 28 29 30
31 32 33 34 35
36 37 38 39 40
41 42 43 44 45
现在,如果我想对上三角形执行XOR运算,则意味着对以下元素进行异或运算: 21 ^ 22 ^ 23 ^ 24 ^ 25 ^ 26 ^ 27 ^ 28 ^ 29 ^ 31 ^ 32 ^ 33 ^ 36 ^ 37 ^ 41 = 35,这是理想的结果。
换句话说,我基本上是异议:
21 22 23 24 25
26 27 28 29
31 32 33
36 37
41
我尝试通过生成二进制等值来查找模式来解决使用DP,但找不到任何一致的模式。
答案 0 :(得分:0)
评论后编辑:
中的方法long long f(long long a) {
long long res[] = {a,1,a+1,0};
return res[a%4];
}
long long getXor(long long a, long long b) {
return f(b)^f(a-1);
}
创建一个这样的循环:
long FinalXor = 0;
for(int i = 0 ; i< n; i++){
FinalXor =FinalXor^getXor(m(i,0),m(i,0)+ n-i)
}
您只需要遍历每行的第一个值,生成复杂度为O(n)的算法
答案 1 :(得分:0)
考虑到网格中数字模式的约束,有一种方法可以在O(n)时间内完成此操作。 首先需要编写一个函数,它能够在O(1)时间内给出[1,n]中所有数字的xor和的结果。
//iteratate in every row of the grid to find out xor sum of that row
//and xor add that sum with the final_xorsum
int final_xorsum=0;
for(i=0;i<n;i++) {
final_xorsum^=xor_sum(biggest_num_in_row_i)^xor_sum(smallest_num_in_row_i-1);
}
cout<<final_xorsum<<endl;
//this function will retrun xor sum value of all the numbers [1...n]
//example: xor_sum(5) = 1^2^3^4^5
int xor_sum(int n) {
int vals[4] = {a,1,a+1,0};
return vals[a%4];
}
在此处阅读有关xor_sum函数的更多信息: Find XOR of all numbers in a given range