2016-10-27 5 views
0

나는이 코드를 C로 작성하여 실행하는 데 너무 오래 걸렸다. 그것을 향상시킬 방법이 있습니까? 내가 원하는 것은 각 행의 값을 합하여 벡터에 값을 저장하는 것입니다. 이 코드에서 i1은 행렬의 행 위치, 열 및 관련 값을 포함하는 값입니다. i1은 정렬되지 않습니다.c (희소 행렬 표현)의 코드 개선

while(a < 2*var) 
{ 
    for (int c=0; c < 2*var; c++) 
    { 
     if (i1[c][0] == a) 
     { 
      diag[b] += i1[c][2]; 
     } 
    } 
    a = a+1; 
    b = b+1; 
} 

어떤 아이디어 나 제안을 주시면 감사하겠습니다. 고맙습니다.

+5

스택 오버플로 코드를 작동하지 않는 전문. [Code Review On-Topic Check] (http://codereview.stackexchange.com/help/on-topic)의 6 개 질문에 모두 "예"라고 확신 할 수 있으면 [codereview.se] . – usr2564301

+0

게시 한 코드의 계산 복잡도는'O (N^2) '입니다. 매트릭스에 포함 된 데이터의 구조를 모른 채 어떻게 향상시킬 수 있는지 알 수 없습니다. 계산상의 복잡성을 개선하기위한 전략은 매트릭스의 내용에 대해 가정 할 수있는 가정에 크게 의존합니다. –

답변

1

b = a + const, 당신은 단순히 diag[i1[c][0] + const] += i1[c][2]를 사용할 수 있으며, O (N)에 O (N 2)에서 복잡성을 줄일 수 있습니다. ai1[c][0] 정수 유형은

0

경우에는 단일 루프로 중첩 루프를 변경할 수 있습니다

for (int c = 0; c < 2 * var; c++) { 
    if (i1[c][0] >= a && i1[c][0] < 2 * var) { 
     diag[b + (i1[c][0] - a)] += i1[c][2]; 
    } 
} 
b += 2 * var - a; 
a = 2 * var;