[질문]
어떻게 찾을 수 있는 시간 복잡도 알고리즘입니다?
나는 수료하고 [이] [1], [이] [2] 및 기타 여러 가지 링크
어디서 찾을 수 없는 시간 복잡도 및 간단하지는 선택해제합니다 계산 방법에 대한 설명도 있었다.
간단하게 말할 한 코드 (아래 참조).
char h = 'y'; // This will be executed 1 time
int abc = 0; // This will be executed 1 time
루프를 말할 아래와 같은:
for (int i = 0; i < N; i++) {
Console.Write('Hello World !');
}
int , 만 실행됨을 i = 0 이 되면. I = 0 '시간' 이 아니라 실제로 계산됩니까 대한 선언.
, N 번 i++ 이 실행됨을
그래서 이 루프 필요한 작업 수가 있다.
참고: 아직 확신할 수 없습니다, as I am 이 시간 복잡도 대한 잘못된 연인으로써 계산할 수 있습니다.
좋아, 그럼 나는 이 작은 기본 계산이므로 알 수 없지만, 대부분의 경우 시간 복잡도 tpc. 본 것 같아요
누구나 이해할 수 있는 시간 복잡도 계산하십시오 알고리즘입니다 돕는다구요 어떻게 해야 할까요? 나 같은 이를 알고 싶어하는 많은 새내기 확신할 수 있습니다.
[1]: https://www.google.co.in/search? = = = = chrome& 수르세이드 19&, 크롬, 모드용 슈그스프 f& aq, ie = q = How% 20to% 20find% 20time% 20complexity% 20of% 20an% 20algorithm UTF-8&; [2]: q = how% 20to% 20calculate% 20time% 20complexity% 20of% 20an% 20algorithm https://stackoverflow.com/search?
이것은 훌륭한 기사: http://www.daniweb.com/software-development/computer-science/threads/13488/time-complexity-of-algorithm
가장 일반적인 메트릭은 계산에 필요한 시간 복잡도 는 점근 표기법. 이 모든 실행 시간 추정할 수 있도록 절감뿐만 상수입니다 요인에 따라 N N 관련하여 외곽진입 '로 정의된다. 일반적으로 생각할 수 있는 it 다음과 같습니다.
statement;
상수입니다. 실행 시간 맞춰 N. 기술서임을 변하지 않습니다
for ( i = 0; i < N; i++ )
statement;
선형인. 실행 시간 때 n N 복식 도왔으매 높여줍니까 루프 정확하게 비례합니다 실행 시간.
for ( i = 0; i < N; i++ ) {
for ( j = 0; j < N; j++ )
statement;
}
는 이차. 실행 시간 2 루타, 이 때 dna 의 제곱에 비례하는 루프를 통해 실행 시간 캐시-코어 N n N *
while ( low <= high ) {
mid = ( low + high ) / 2;
if ( target < list[mid] )
high = mid - 1;
else if ( target > list[mid] )
low = mid + 1;
else break;
}
사람이 있다. 실행 시간 비례한다 알고리즘입니다 횟수를 2 로 나눈 N 수 있습니다. 이 지역에 있는 각 이터레이션에 반단면 분할합니다 알고리즘입니다 작업 때문이다.
void quicksort ( int list[], int left, int right )
{
int pivot = partition ( list, left, right );
quicksort ( list, left, pivot - 1 );
quicksort ( list, pivot + 1, right );
}
이 N * log (N). 실행 시간 구성되어 있으며, 따라서 알고리즘입니다 ᄂ씨 루프 () 또는 반복 반복) 가 대수 () 는 선형 및 조합으로의 대수.
일반적으로, 모든 항목 (,) 는 1 차원으로 함께 일을 함께 일을 하고 있는 모든 항목 () 는 2 차원 이차 선형 작업 영역을 반으로 나누어 는 대수. 이외에도 대량량 O 등의 조처를 하지 않지만, 삼차, 지수 및 제곱근 they& # 39, re 거의 동일하게 흔하다. 점근 표기법 것으로 묘사되고 있다 (i/o < type>; ) 의 위치를 < type>; 는 정확히 측정하십시오. 퀵 정렬 알고리즘은 O (N * log (N)) 이 될 것으로 묘사된다.
단, 이 중 어느 것도 평균 및 worst case 는 가장 고려해야 한다. 각 줄 것이라는 자체 점근 표기법. 또한 이것은 매우 상투적이고 설명. Big O) 가 가장 일반적인 it& # 39, s 도 있지만, 더 복잡한 i& 있는 # 39, ve 표시됩니다. 또한, 크고 작은 o 표기법 같은 다른 대량량 오메가, 세타 (θ). 아마 won& t # 39, 그들을 만날 외부의 알고리즘입니다 분석 물론이겠지. )
>. 한 시간 복잡도 알고리즘입니다 찾는 방법
또 얼마나 많은 기계 지침 추가했는지 최대 크기의 입력 후 표현식에서는 단순화하십시오 함수로 실행하십시오 등 국내 최대 (N 이 때 매우 큰) 기간 및 단순해집니다 상수입니다 팩터에서의 포함할 수 있습니다.
예를 들어, 우리가 어떻게 볼 수 있으며, 이를 설명하기 위해 기계 지침 '2' 그냥 '단순화하십시오 2N + O (N)'.
우리는 관심을 알고리즘의 성능을 ᄂ씨 커집니다.
이 두 용어를 고려해보십시오 2N 및 2.
이 두 용어를 상대적 영향에 따라 지정하십시오. ᄂ씨 커집니다. 예를 들어, N 은 만명에 이른다.
1 기 는 2 백만, 다음 두 번째 임기 2 개만 있다.
그렇기 때문에 가장 큰 드롭합니다 모두이지만 약관에 대한 많은 N.
이제 2N + 2 "에서 이미 '를' 2n '.
전통적으로, 우리는 지속적으로 관심을 가질 뿐 성능 up factors.
즉, 우리는 don& # 39 는 몇 가지 상수입니다 배수인지 때 N t really care, 경우 성능 차이가 큽니다. 어쨌든 제일 잘 2N 단위는 아니다. 나눌 수 있도록 곱합니다 또는 일정한 팩터에서의 의해 얻기 위해 가장 간단한 표현식입니다.
그래서 '그냥' N '' 2N 됩니다.
여기에서 조롱했기 - [소개 한 시간 복잡도 알고리즘입니다] [1]
컴퓨터 과학에서 시간, 복잡한 알고리즘을 실행할 수 있는 시간) 에 의해 정량화 수행됨을 알고리즘입니다 문자열의 길이를 나타내는 함수로 입력입니다.
흔히 복잡한 알고리즘을 사용하여 표현할 수 있는 시간을 점근 표기법 제외시킵니다 계수와 쇱そ 오더할 약관보다. 이런 식으로 표현할 때 시간 복잡도 입력 크기 때문에 마이그레이션된 설명됨 점근 수 있다고 한다, 즉 '로 정의된다.
예를 들어, n 은 모든 투입물 크기) 에 의해 필요한 시간, 최대 5n< sup> 3< 알고리즘입니다 /sup>; + 3n 의 시간 복잡도를 점근 는 O (n< sup> /sup> 3<;;;). 이 내용은 나중에 자세히 설명하겠습니다.
몇 차례 더 (예:
알고리즘을 실행할 수 있다 '고 같은 시간에 관계없이 일정한 시간이 필요할 경우 입력 크기.
예를 들면 다음과 같다:
알고리즘을 실행할 수 있는 경우)』 는 선형 시간 해당 시간에 따라 선형적으로 비례하는 입력 크기, 즉 바로 실행 시간을 입력으로 크기 캐시-코어.
다음 예제는 고려해보십시오 아래에 나는 그만큼 확장됨 검색: 요소에 대한 복잡한 시간 O (n) 이 있다.
int find = 66;
var numbers = new int[] { 33, 435, 36, 37, 43, 45, 66, 656, 2232 };
for (int i = 0; i < numbers.Length - 1; i++)
{
if(find == numbers[i])
{
return;
}
}
더 (예:
알고리즘을 통해 해당 시간에 비례한다)』 는 대수 에서 실행할 경우 시간이 엑서큐션 대수를 입력 크기.
예: 이진 탐색
이 " 재호출 20 questions"; task 는 게임 - 숨겨진 가치를 간격에 숫자를 어렵지 않다. 할 때마다 너무 높거나 너무 낮은 것 같아요 틀렸다니까 있는가에 것 같다 "고 말했다. 스무고개 게임 전략을 세워야 한다는 생각 번호를 이용하여 이등분하다 시간 간격까지입니다 크기. 이 예는 일반 알려진 문제 해결 방법을 이진 탐색
알고리즘을 통해 해당 시간에 비례한다)』 는 이차 에서 실행할 경우 실행 시간을 만들어 입력 크기.
예를 들면 다음과 같다:
[1]: //careerbaba.in/2014/01/introduction-to-time-complexity-of-an-algorithm/ https://web.archive.org/web/20140929181245/http
비록 몇 가지 좋은 이 질문에 대한 대답. 여기에 다른 답을 줄 수 있는 몇 가지 예는 '반복' 싶다.
여기서 c 는 양의 정수를 상수입니다 // 대한 (int i = 1. 내가 < = n;; i + = c) { 일부 O (1) 표현식에서는 // }
대한 (int i = n; 내가 >. 0; i - = c) { 일부 O (1) 표현식에서는 // }
대한 (int i = 1. 내가 < = n;; i + = c) { 대한 (int j = 1; = n, j <. j + = c) { 일부 O (1) 표현식에서는 // } }
대한 (int i = n; 내가 >. 0; i + = c) { 대한 (int j = i + 1. = n, j <. j + = c) { 일부 O (1) 표현식에서는 // }
예를 들어 선택 정렬 및 삽입 정렬 %s/dbase/ext_table. _을 _O (n ^ 2) 시간 복잡도.
대한 (int i = 1. 내가 < = n;; 나는 * = c) { 일부 O (1) 표현식에서는 // } 대한 (int i = n; 내가 >. 0; i / = c) { 일부 O (1) 표현식에서는 // }
예를 들어 이진 탐색 시간 복잡도 (로근) _을 _O 있다.
여기서 c 는 1 보다 큰 상수입니다 // 대한 (int i = 2. 내가 < = n;; i (i, c) = pow) { 일부 O (1) 표현식에서는 // } 재미있는 것은 //here 스크트 또는 쿠베로트 또는 다른 상수입니다 루트 대한 (int i = n; 내가 >. 0; i (i) = 펀 (fun) { 일부 O (1) 표현식에서는 // }
예를 들어 시간 복잡도 분석
int fun(int n)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j < n; j += i)
{
// Some O(1) task
}
}
}
"' N = 1 번, 내가 안쪽 루프 실행됩니다. 내가 약 2 배 = 안쪽 루프 n/2 실행됩니다. 내가 안쪽 루프 () 는 약 n/3 csetup = 3 시간. I = 4 번 약 n/4 안쪽 루프 실행됩니다. 이드리스트리스트리지오스트리스트리스트리지 내가 = n 은 n / n 번 실행됨을 약 안쪽 루프. "'
따라서 위의 알고리즘입니다 총 시간 복잡도 (n + + + +. (n/2 n/3 n / n) '는', 'n * (1/1 + + + + 1/2, 1/3 1/n) 되는'
중요한 건 ' (1/2 + + + +. 1/1 1/3 1/n)' 가 약 시리즈 같은 _O (로근) _입니다. 따라서 위의 코드는 _O 시간 복잡도 (노로니) _입니다.
Ref: [1] (http://discrete.gr/complexity/) [2] (http://www.geeksforgeeks.org/analysis-of-algorithms-set-4-analysis-of-loops/) [3] (http://www.geeksforgeeks.org/interesting-time-complexity-question/)
1 - 기본 작업 (연산, 비교, array 의 요소를 액세스하면, 할당에서는): 실행 시간은 항상 상수입니다 O (1)
예:
read(x) // O(1)
a = 10; // O(1)
a = 1.000.000.000.000.000.000 // O(1)
2 - 만일 다른 기술서임을: 실행 시간 등의 디렉토리에만 최대 2 개 이상의 가능한 명령문입니다.
예:
age = read(x) // (1+1) = 2
if age < 17 then begin // 1
status = "Not allowed!"; // 1
end else begin
status = "Welcome! Please come in"; // 1
visitors = visitors + 1; // 1+1 = 2
end;
따라서 위의 복잡성입니다 dtep 코드는 T (n) + 2 + 1 = max (1, 1+2) = 6. 따라서 여전히 상수입니다 T = O (n) 는 빅 오 (1).
3 - 루프을 (backup-to-disk 반면 반복하십시오): 실행 시간 엔드입니다 기술서임을 루프을 수가 수를 곱하여 그 안의 운영체 루프을.
예:
total = 0; // 1
for i = 1 to n do begin // (1+1)*n = 2n
total = total + i; // (1+1)*n = 2n
end;
writeln(total); // 1
그렇다면 그 복잡성의 T (n) = 1+4n + 2 + 1 = 4n. 따라서, T (n) = O (n).
4 - 네스트된 루프 (루프을 δ1 루프을): 최소 1 시간 안에 있기 때문에 이 같은 발언은 사용되는 기본 루프을 루프을 호스팅하면서 O (n ^ 2) 또는 O (n ^ 3).
예:
for i = 1 to n do begin // (1+1)*n = 2n
for j = 1 to n do begin // (1+1)n*n = 2n^2
x = x + 1; // (1+1)n*n = 2n^2
print(x); // (n*n) = n^2
end;
end;
몇 가지 공통적인 분석할 때 실행 시간 알고리즘이다.
상수 시간 o (1) - 상수 시간 는 실행 시간 상수입니다 조롱이라면 not 영향을 받는 입력입니다 size.
선형 시간 o (n) - N n 작업을 수행할 때 사용할 수 있는 알고리즘입니다 입력 크기, 차라리 잘 알려져 있다.
로그형 시간 o (log n) - 실행 시간 O (log n) 는 알고리즘입니다 O (n) 보다 약간 있다. 일반적으로 알고리즘입니다 문제를 여러 분할합니다 서브노드 문제 크기가 같습니다. 예: 이진 검색 알고리즘, 이진 변환 알고리즘입니다.
라인라이스미스 시간 o (n log n) - 흔히 발견되는 이 실행 시간 분할 & "; 정복하십시오 algorithms". 나눌 수 있는 문제를 여러 문제를 반복적으로 그리곤요 병합합니다 서브노드 n 하게하면서요. 예: 합병 정렬 알고리즘.
O (n< sup> /sup> 2<;;;) - 이차 시간 여바바 거품 정렬 알고리즘!
O (n< sup> /sup> 3<;;;) - 입방 시간 이 회사는 이와 같은 원리를 통해 O (n< sup> /sup> 2<;;;).
O (2< sup> /sup> n<;;;) - 지수 시간 이 경우 매우 느린 입력으로 커질 경우, n = 1000.000, T (n) 약간만이라도 21000.000. 무차별 대입 알고리즘입니다 이 실행 시간 있다.
O (n!) - 계승 시간 이 최저속!!! 예: 여행 외판원 문제를 (TSP)
이 문서 에서 발췌. 아주 잘 읽기 줘야 할 것 "이라고 설명했다.
예를 들어, 하나의 단순한 반복 할 수 있습니다, 나중에는 이 같은 프로그램을 통해 복잡한 일괄이라는 프로그램에 트리플 루프를 포함될 수 있는 복잡성을 촬영할 수 있을 것이라고 입방 복잡성 때문에 . 함수) 에 따라 성장과 놀이를하고 여기서요.
'성장' 에 시간 - 대수 주문하십시오 로근 일반적으로 테스트타사의 뭔가 반으로 나눌 때 you& # 39, re (이진 탐색, 나무, fopen (루프) 또는 되고 뭔가 같은 것입니다. 예를 들어, 'N' 의 증가는 주문하십시오 일괄이라는 -
int p = 0; 대한 (int i = 1. 내가 <. N; i++) p = p + 2.
int x = 0; 대한 (int i = 0; 내가 <. N; i++) 대한 (int j = 0; j <. N; j++) 대한 (int k = 0; ᄀ씨 <. N; k++) x = x + 2
느슨하게 높다고 볼 수 있는 방법입니다 어떻게 시간 복잡도 요약 운영 또는 런타임 증가로 알고리즘입니다 입력 크기 캐시-코어.
인생의 가장 좋아하는 칵테일 파티 도움을 줄 수 있는 것을 이해할 수 있습니다.
칵테일 파티 게임 충족합니다 한 호스트에서 다른 사람들 누구나 어리석은 할 것이다. 따라서 '때문에' 다른 사람과 충족합니다 N-1 합니다 다음 사람을 만난 당신은 이미 한다 '' 사람, N-2 충족합니다 드릴링됩니다. 이 시리즈는 모두 합쳐 '+' x ^ 2/2 x/2. 'X ^ 2' 가 늘어나면서 attendees 늘어남에 따라 이 기간 때문에, 우리는 그냥 드롭합니다 대량량 fast 다른 건 다.
다른 사람들 얘기를 할 때 다른 사람들이 모두 충족합니다 회의 및 각 방에 합니다.
호스트에서는 뭔가 발표할 것이다. 그리고 그들이 말하는 자는 한 소리 높여 와인글라스. 모두라뇨 으시며 저들이요 이 문제를 doesn& 나타났다 # 39, t 는 이 작업은 항상 같은 시간에 attendees 가부키쇼 있습니다.
모두 나가 식탁에서 문자순으로 호스트에서는 사람들도 있다. 어디 댄? 그는 너회가 그 사이 어딘가에 반드시 아담과 맨디 (맨디 및 잭 사이에 분명 아니다!). 그 사람 사이에 점을 감안하면 조지랑 맨디? 그는 간, 신디 및 프레드 (fred 아담과 막아보자구 사이에 있어야 합니다. 및 드릴링됩니다. 댄 보면 효율적으로 찾을 수 있습니다 다음 반단면 설정 및 절반 수준에도 설정되었습니다. 결국 살펴보겠습니다 (i/o log_2 N) , 것을 뜻한다.
위 알고리즘을 사용하여 식탁에서 앉아보라구요 위치를 찾을 수 있습니다. 많은 사람이 테이블에 르렀을 경우 한 번에 하나씩 이런게야 O (N log N), 즉, 모든 조치를 취할 것이라고 하게하면서요. 이렇게 하면 걸리는 시간을 드러날 때 모든 항목의 컬렉션 정렬하려면 비교할 수 있어야 합니다.
이니고 찾아야 하는 당과 도착할 수 있습니다 - 얼마나 걸릴까요? 의존하기 때는사용할 도착. # 39, ve 최악의 경우 주변 모두가 밀링을 you& 기록했다. o (N) '' 시간이 걸릴 전망이다. 그러나 누구나 걸릴 경우 O (log N) 만 표, 선수단 '앉아' 하게하면서요. 혹시 # 39 만 포도주잔 외치며 host& 활용할 수 있습니다 'o (1)' 의 전력 및 걸리는 시간.
우리가 할 수 있다고 가정하여 호스트입니다 사용할 수 없는 '는' O (log N) 의 하한 이니고 발견사항 알고리즘입니다 및 오버클로킹된 상단 바운드 ',' o (n) 의 상태에 따라 당 때는사용할 도착.
같은 방식을 이해하고 적용할 수 있는 아이디어를 알고리즘은 공간 또는 통신.
커누스 개신교가 인간복제에 대한 적용을 받는 좋은 http://competition. 전 [", 복잡한 Songs"] (https://www.cs.utexas.edu/users/arvindn/misc/knuth_song_complexity.pdf).
>. 정리 2: 임의의 긴 곡을 좁히어 타임코드가 복잡성을 O (1). >. >. 증명: (만기 및 선샤인 밴드 케이시). Sk (15) 에 의해 정의된 노래를 고려해보십시오 갖추고 있지만,
V_k = 'That's the way,' U 'I like it, ' U
U = 'uh huh,' 'uh huh'
>. 모든 ᄀ씨.
O (n) 는 점근 표기법 한 시간 복잡도 알고리즘입니다 쓰는 데 사용됩니다. # 39 에 추가할 때 알고리즘으로, ll get up the number of 실행을 you& 표현식에서는 그 결과 이 같은 표현식에서는 2N + 2, N 은 주인 항 () 이라는 용어는 그 값을 갖는 가장 큰 영향을 미치는 표현식에서는 늘리거나 줄일 경우). 이제 지배 기간 동안 시간 O (N) 은 N 은 콩레스티. 예
For i= 1 to n;
j= 0;
while(j<=n);
j=j+1;
여기서 n + 1 및 실행을 위한 총 실행을 위한 내부 루프 (loop) 는 총 n (n + 1) /2 외부 있다, 그래서 총 실행을 위한 + n (n + 1/2) 는 전체 알고리즘입니다 n + 1 = (n ^ 2+3n) /2. 여기서 n 은 그 지배 기간 ^ 2 시간 복잡도 엔드입니다 알고리즘은 O (n ^ 2)