2

よりも複雑な行列演算を最適化するには、行列の上三角の演算を行う方法があるかどうかを調べようとしています。O(n^2)時間未満[好ましくは線形時間]。行列要素はexample.i.eに示すように連続していることに注意してください。各行と列のすべての値がソートされます。これをO(n^2)の複雑さを使って解決しました。以下の例: 21^22^23^24^25^26 ^:私は上三角にXOR演算を実行する場合2次元正方形(n * n)の行列を与えられた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

は今、それは以下の要素を-ing XORを意味します27^28^29^31^32^33^36^37^41 = 35であり、これは所望の結果である。すなわち

、私は基本的にXOR-ING午前:

21 22 23 24 25 26 27 28 29 31 32 33 36 37 41

Iは、それらのバイナリ等価物を生成することによって、パターンを見つけることによりDPを使用して解決しようとしたが、任意の一貫したパターンを見つけることができませんでした。コメントの後

+3

この質問は少しあいまいです。だからあなたが望むのは、上三角のxorを計算することだと仮定します。 **あなたは三角形の各要素(= n^2/2要素)を見る必要があるので、O(n^2/2)= O(n^2)は下限です**。これは*いくつかの計算*のために変更することができますが、xor関数は非常に敏感です(あまりプルーニングはできません;最後の値はすべてのビットを変更する可能性があります)。 – sascha

+0

@sascha一方、行列がn * n個の要素を含む場合、それは入力 - > O(n/2)のサイズとみなされます。 – JimmyB

+0

2次元行列で与えられた数を生成するパターンはありますか? –

答えて

0

編集:this post

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)の複雑さを持つアルゴリズムを生成する行

+0

あなたのお返事ありがとうございます。私は何か似たようなことをしました。しかし、連続したすべての数値を実際にXORしなくても、直接的に答えられるビット操作で遊ぶ方法があるかどうかは疑問でした。質問に編集がありました。この例に示すように、行列の要素が連続していることは忘れてしまいました。つまり、row要素とcol要素がソートされます。この編集は、今でも組み込まれています。 – user5566364

+0

さて、そのことを念頭に置いて、もっと良い解決策があると思います。[this](http://stackoverflow.com/questions/10670379/find-xor-of-all-numbers-in-a-given-range)各ラインの要素のxorを計算し、すべての結果をxorと計算する。 値は連続しているので、一度に各行にgetXorメソッドを適用するとO(N)で計算できます – AugustoQ

+0

範囲が 'FinalXor = FinalXor^getXor(m(i、0) )、m(i、0)+ n-(i + 1)) 'である。しかし、私は彼らが参照されたポストでルックアップテーブルをどのように形成しているかをはっきりと理解できませんでした。あなたが{a、1、a + 1,0}のパターンがどのようにして決定されるかを説明できれば、大きな助けになるでしょう。 – user5566364

0

グリッド内の数字のパターンに制約がある場合、O(n)時間にこれを実行できる方法があります。 まず、O(1)時間内の[1、n]にあるすべての数のxまたは合計の結果を得る関数を書く必要があります。

//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

+0

ありがとうございました。 int vals [4] = {a、1、a + 1,0}の背後にある根拠について説明してください。 返り値[a%4]; ' – user5566364

+0

@ user5566364、これは、連続したxor系列(0,1,2,3,4,5,6,7)で気づくパターンから説明できます=>( 0,1,3,0,5,1,7,0 ..)。詳細はリンクを参照してください –

関連する問題