시간 복잡도 T(n)을 어떻게 찾고 이것이 긴밀하게 묶여 있음(Big Theta)을 표시합니까?
-
19-08-2019 - |
문제
최악의 경우에 시간 복잡도를 부여하는 방법을 알아내려고 노력 중입니다.내 분석이 확실하지 않습니다.나는 중첩을 읽었습니다 for
루프 빅 O는 n^2
;이게 맞나요? for
루프를 사용하여 while
내부 루프?
// A is an array of real numbers.
// The size of A is n. i,j are of type int, key is
// of type real.
Procedure IS(A)
for j = 2 to length[A]
{
key = A[ j ]
i = j-1
while i>0 and A[i]>key
{
A[i+1] = A[i]
i=i-1
}
A[i+1] = key
}
지금까지 나는 :
j=2 (+1 op)
i>0 (+n ops)
A[i] > key (+n ops)
so T(n) = 2n+1?
하지만 꼭 안으로 들어가야 할지 잘 모르겠습니다. while
그리고 for
최악의 경우 시간 복잡도를 분석하는 루프...
이제 나는 그것이 단단히 묶여 있다는 것을 증명해야 합니다. 그것이 Big Theta입니다.
나는 그 중첩된 내용을 읽었습니다. for
루프에는 Big O가 있습니다. n^2
.Big Theta도 마찬가지인가요?그렇지 않다면 어떻게 Big Theta를 찾을 수 있을까요?!
**C1= C sub 1, C2= C sub 2, no= n 모두 양의 실수 요소입니다.
찾으려면 T(n)
가치관을 살펴보니 j
while 루프가 몇 번 실행되었는지 살펴보았습니다.
values of J: 2, 3, 4, ... n
Loop executes: 1, 2, 3, ... n
분석:
while 루프 실행을 요약하고 그것이 다음과 같다는 것을 인식합니다. (n(n+1))/2
이것을 내 것으로 지정하겠습니다. T(n)
그리고 그것이 단단히 묶여 있음을 증명하십시오. n^2
.그건 n(n+1)/2= θ(n^2)
스크래치 작업:
Find C1, C2, no є R+ such that 0 ≤ C1(n^2) ≤ (n(n+1))/2 ≤ C2(n^2)for all n ≥ no
To make 0 ≤ C1(n) true, C1, no, can be any positive reals
To make C1(n^2) ≤ (n(n+1))/2, C1 must be ≤ 1
To make (n(n+1))/2 ≤ C2(n^2), C2 must be ≥ 1
PF:
Find C1, C2, no є R+ such that 0 ≤ C1(n^2) ≤ (n(n+1))/2 ≤ C2(n^2) for all n ≥ no
Let C1= 1/2, C2= 1 and no = 1.
0 ≤ c1 (n^2)이 true c1 (n^2) = n^2/2임을 보여줍니다.
n^2/2≥ no^2/2
⇒아니요^2/2≥ 0
1/2 > 0
따라서 C1(n^2) ≥ 0이 참임이 입증되었습니다!C1 (n^2) ≤ (n (n+1))/2가 true c1 (n^2) ≤ (n (n+1))/2임을 보여줍니다.
n^2/2 ≤ (n (n+1))/2 n^2 ≤ n (n+1)
n^2 ≤ n^2+n
0 ≤ n우리가 아는 것은 n ≥ no = 1이기 때문에 사실입니다.
따라서 C1(n^2) ≤ (n(n+1))/2가 참임이 입증되었습니다!(n (n+1))/2 ≤ c2 (n^2)가 true (n (n+1))/2 ≤ c2 (n^2)임을 보여줍니다.
(n+1)/2 ≤ C2(n)
n+1 ≤ 2 C2(n)
n+1 ≤ 2(n)
1 ≤ 2n-n
1 ≤ n(2-1) = n
1≤n
또한 n ≥ no = 1이므로 이것이 사실임을 알 수 있습니다.따라서 1, 2, 3에 의해 θ(n^2 )= (n(n+1))/2는 다음과 같습니다.
모든 n ≥ no에 대해 0 ≤ C1(n^2) ≤ (n(n+1))/2 ≤ C2(n^2)
무슨 일인지 말해보세요 여러분...저는 이 자료를 이해하려고 노력하고 있으며 여러분의 의견을 듣고 싶습니다!
해결책
당신은 그것을 구현하는 것 같습니다 삽입 정렬 알고리즘, Wikipedia가 주장하는 것은 O (n2).
일반적으로 BIG-O를 처리 할 때 상수 C가 아닌 변수 N을 기준으로 구성 요소를 분류합니다. 귀하의 경우, 당신이해야 할 일은 루프를 보는 것입니다.
두 루프가 (더 나쁜 경우) :
for j=2 to length[A]
i=j-1
while i > 0
/*action*/
i=i-1
외부 루프는 O (n)이므로 요소 수와 직접 관련되어 있기 때문입니다.
내부 루프가 외부 루프의 진행 상황에 어떻게 의존하는지 확인하십시오. 즉, 내부 및 외부 루프가 (나오지 않은 문제를 무시하는) 다음과 관련이 있음을 의미합니다.
j's inner value loops ----- ----- 2 1 3 2 4 3 N N-1 ----- ----- total (N-1)*N/2
그래서 총 횟수 /*action*/
is is (n2 -N)/2, O (n)2).
다른 팁
중첩 루프의 수를 보는 것이 솔루션을 얻는 가장 좋은 방법은 아닙니다. 코드에서 수행중인 "작업"을 무거운 부하 N으로 보는 것이 좋습니다. 예를 들어,, 예를 들어,
for(int i = 0; i < a.size(); i++)
{
for(int j = 0; j < a.size(); j++)
{
// Do stuff
i++;
}
}
O (n)입니다.
함수 F는 G의 큰 OH와 G의 Big-Omega에있는 경우 g의 큰 g에 있습니다. 최악의 경우는 데이터 A가 단조롭게도 기능을 감소시킬 때 발생합니다. 그런 다음 외부 루프의 모든 반복에 대해 while 루프가 실행됩니다. 각 명령문이 1의 시간 값을 기여한 경우 총 시간은 5*(1 + 2 + ... + n -2) = 5*(n -2)*(n -1) / 2입니다. 데이터에 대한 2 차 의존성. 그러나 데이터 A가 단조로 증가하는 시퀀스 인 경우, 조건 A [I]> 키는 항상 실패합니다. 따라서 외부 루프는 일정한 시간에 n -3 번 실행됩니다. F의 가장 좋은 경우는 데이터에 선형 의존성을 갖습니다. 평균적인 경우, 우리는 다음 숫자를 A에서 가져 와서 이전에 발생한 분류에서 그 자리를 찾습니다. 평균적 으로이 숫자는이 범위의 중간에있을 것이며, 이는 내부가 최악의 경우보다 자주 절반으로 실행되므로 데이터에 2 차 의존성을 제공합니다.
Big O(기본적으로) 작업을 완료하기 위해 루프의 요소를 몇 번이나 검토할지에 대한 것입니다.
예를 들어 O(n) 알고리즘은 모든 요소를 한 번만 반복합니다.O(1) 알고리즘은 모든 요소를 전혀 반복할 필요가 없으며 인덱스가 있기 때문에 배열에서 찾아야 할 위치를 정확히 알 수 있습니다.이에 대한 예는 배열 또는 해시 테이블입니다.
루프 내부의 루프가 O(n^2)인 이유는 루프의 모든 요소가 자체적으로 ^2번 반복되어야 하기 때문입니다.루프 유형을 변경하는 것은 기본적으로 약 #회 반복이므로 이와 관련이 없습니다.
필요한 반복 횟수를 줄일 수 있는 알고리즘에 대한 접근 방식이 있습니다.그 예로는 "분할 및 정복" 같은 알고리즘 퀵소트, 내가 올바르게 기억한다면 이는 O(nlog(n))입니다.
달성하려는 목표를 보다 구체적으로 알지 못한 채 예시에 대한 더 나은 대안을 찾는 것은 어렵습니다.