2

미만의 복잡도로 행렬 연산을 최적화하려면 행렬의 위쪽 삼각형에 연산을 수행하는 방법이 있는지 찾으려고 노력 중입니다. O (n^2) 시간 미만 [바람직하게는 선형 시간]. 행렬 요소는 example.i.e와 같이 연속적입니다. 각 행과 열의 모든 값이 정렬됩니다.이 문제는 O (n^2) 개의 복잡도를 사용하여 해결되었습니다. 아래의 예 : I 상부 삼각형에 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를 의미 : 21^22^23^24^25^26^27^28^29^31^32^33^36^37^41 = 35 이는 원하는 결과입니다. 즉

, 나는 기본적으로 XOR 한창입니다 :

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

내가 그들의 이진 등가물을 생성하여 패턴을 찾아 DP를 사용하여 해결하려고했으나 어떤 일관된 패턴을 찾을 수 없습니다. 주석 후

+3

이 질문은 좀 애매하다. 그래서 여러분이 원하는 것은 위 삼각형에 xor를 계산하는 것입니다. ** 그러면 O (n^2/2) = O (n^2)가 삼각형의 각 요소 (= n^2/2 요소)를 살펴볼 때 필요한 하한값 **입니다. 이것은 일부 계산 *에 대해 변경 될 수 있지만 xor-function은 매우 민감합니다 (많은 프 i이 가능하지 않으며 마지막으로 보는 값은 모든 비트를 변경시킬 수 있음). – sascha

+0

@sascha 한편, 행렬에 n * n 요소가 포함되어 있으면 입력> O (n/2)의 크기로 간주됩니다. – JimmyB

+0

2 차원 행렬에 주어진 숫자를 생성하는 패턴이 있습니까? –

답변

0

편집 :

long FinalXor = 0; 
for(int i = 0 ; i< n; i++){ 
    FinalXor =FinalXor^getXor(m(i,0),m(i,0)+ n-i) 
} 

당신은 각의 첫 번째 값을 통해 루프를해야합니다

방법을 사용하여 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); 
} 

에서이 같은 루프를 만들 O (n)의 복잡도를 갖는 알고리즘을 생성하는 행

+0

답장을 보내 주셔서 감사합니다. 비슷한 것을했습니다. 그러나 실제로 모든 연속 번호를 XOR하지 않고도 직접 해답을 줄 수있는 비트 조작으로 놀 수있는 방법이 있는지 궁금합니다. 질문에 편집이있었습니다.예제에서와 같이 행렬의 요소가 연속적이라는 것을 잊어 버렸습니다. 즉, row 및 col 요소가 정렬됩니다. 어쨌든 편집 내용이 통합되었습니다. – user5566364

+0

음, 그 마음에 나는 더 나은 해결책이 있다고 생각한다. [this] (http://stackoverflow.com/questions/10670379/find-xor-of-all-numbers-in-a-given-range) 솔루션을 사용하여 각 행의 요소 x와 x ​​또는 모든 결과를 계산합니다. 값이 연속적이기 때문에, 한 번에 각 행에 대해 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

감사합니다 Ayon. 'int vals [4] = {a, 1, a + 1,0} 뒤에있는 이유를 설명해 주시겠습니까? return vals [a % 4]; ' – user5566364

+0

@ user5566364, 이것은 연속 xor 시리즈 (0,1,2,3,4,5,6,7) =>에서 알 수있는 패턴에서 설명 할 수 있습니다 01305170 ..). 자세한 설명은 링크를 참조하십시오. –