2011-05-08 2 views

답변

0

아니요. 그게 당신이 할 수있는 최선의 방법입니다.

2

O (n^2) 시간이지만 O (1) 공간 (두 개의 루프 사용, 아래 코드 참조)을 사용하는 알고리즘을 만들 수 있지만 시간 복잡도를 향상시킬 수는 없습니다. O (n) 이하.

for(i=0;i<10;i++) { 
    count = 0; 
    for(j=0;j<10;j++) 
    if (c[j] == i) count++; 
    cout<<i<<": "<<count<<endl; 
} 

O (1)의 공간에 대한 다른 possiblity가

시간 복잡도 O 있어야에서 적절한 배열의 정렬 후, 일단이 통과 될 것이다 (N 로그 n)에서 적절한 병합 정렬을 사용.

+0

예, 당신은 O (1) 범위로 당신을 데려 갈 것입니다 "스파게티 정렬"스타일의 접근 방식을 생각할 수 있습니다. –

+0

@ 리카르도 : 좋았어, 이것에 대해 몰랐어. 이론적으로는이 방법이 효과적이지만 CPU 코어 나 양자 컴퓨터가 필요합니다. – schnaader

+2

@ 리카르도 (Rikardo) : Turing 스타일 결정 성 계산 모델을 기반으로하지 않는 솔루션은 실제 프로그래밍에 아직 도움이되지 않습니다. 나는 당신이 "할 수있다"라는 단어의 정의를 갈아 치우고 있다고 생각합니다 :-) –

0

"효율적인"이란 무엇입니까? 실적 요구 사항 및 성과 측정 결과를 보여주십시오. 그런 다음 효율적인지 알려줄 수 있습니다. 그때까지 이것은 많은 잘못된 대답과 정답이없는 열린 질문입니다. 답변은 지금까지 올바른 단어 '능률적 인'은 '가능한 빨리 실행'을 의미합니다.

RAM이 적은 고속 컴퓨터를 가지고있을 수도 있습니다.

항상 코드 조각을 빠르게 만들거나 디스크 공간을 줄이거 나 사용량을 줄이거 나 메모리를 덜 사용할 수 있습니다. 충분히 효율적이지 않은 경우, 필자가 손으로 만든 공예품 조립품을보다 빠르게 볼 수 있습니다. 보통 그것은 시간과 노력의 낭비입니다. 프로파일되지 않은 최적화 코드는 바보 게임입니다.

+0

프로파일 링과 그것이 실행되는 알고리즘과 시스템의 실제 세부 사항은 중요하지만 시간/공간의 복잡성은 효율성을 최적화하는 기회를 제공합니다 세부 사항. O (n^2)와 O (n)의 차이점은 큰 n에 대해서는 극단적이며 느린 알고리즘을 선택하면 수작업으로 만들어진 어셈블리조차도 도움이되지 않습니다. – schnaader

0

모든 숫자가 1 ~ n 범위에 있으면 O (n) 시간 복잡도와 O (1) 공간 복잡도로 수행 할 수 있습니다.

A [X] = Y 인 인덱스 A와 A가있는 경우 인덱스 Y에있는 값에 N을 더합니다. A [Y]는 A [Y] = original + N이됩니다. 계속해서, 값은 k> = 0. 형태의 (original + KN) 형태가 될 것입니다. 원래의 원소를 검색하기 위해 (x + kn) % n = x부터 (N + 원 + KN)/N.

관련 문제