Big O에서 상수 요소를 무시하는 것에 대한 정당성


20

복잡성이 3n과 같은 상수를 갖는 경우 여러 번이 상수를 무시하고 O (3n)이 아니라 O (n)이라고 말합니다. 그러한 세 가지 변화를 어떻게 무시할 수 있습니까? 어떤 것이 다른 것보다 3 배 더 빠르게 변합니다! 우리는 왜이 사실을 무시합니까?


"can"의 의미는 중요하다. 실제로, 우리는 일반적으로 그러한 변화를 무시할 수 없지만 (즉, 실제 세계에서 알고리즘 성능을 기술하는 것)은 Landau 표기법이 아닙니다. 보다 정확한 형식주의 존재합니다.
Raphael

답변:


22

점근 적 표기법이 어떻게 일정한 요소를 무시 하는지를 합리화하기 위해 나는 보통 다음과 같이 생각합니다.

예를 들어, 충분히 큰 입력에 대해 입력 크기를 두 배로 늘리면 걸리는 단계 수의 두 배를 넘지 않기 때문에 3n 단계 를 취하는 함수 는 O(n) 이라고합니다. 마찬가지로, O(n2) 는 입력 크기를 두 배로 늘리면 최대 단계 수를 4 배로 늘리며, O(logn) 은 입력 크기를 두 배로 늘리면 단계 수를 거의 일정하게 증가시킵니다.

어떤 알고리즘이 절대적으로 더 빠르지 않고 어떤 알고리즘이 더 잘 확장되는지를 알려주는 도구입니다.


11

다른 답변은 이미 설명한 것처럼 우선, , 또는 단어에 넣어, 함수이다 O ( 3 N ) 경우에만이 경우 O ( N ) . f = O ( 3 n ) 는 모든 n N , f ( n ) C 33 가되도록 점 N 과 계수 C 3 이 있음을 의미합니다.O(3n)=O(n)O(3n)O(n)f=O(3n)NC3nN . 이제 C 1 = 3 C 3 : 모든 n N , f ( n ) C 1n 에 대해 f = O ( n )을 선택 합니다. 대화의 증거는 비슷합니다.f(n)C33nC1=3C3nNf(n)C1nf=O(n)

이제 이것이 올바른 도구 인 이유입니다. 알고리즘의 복잡성을 측정 할 때 단위를 제공하지 않습니다. 우리는 초 또는 기계 지침을 세지 않습니다 : 우리는 각각 정해진 시간이 걸리는 지정되지 않은 기본 단계를 계산합니다. 다른 머신에서 동일한 알고리즘을 실행하면 명령 당 필요한 시간이 변경되므로 클럭 주파수에 곱하고 실행 시간은 f ( n ) 에서 f ( n ) / 3으로 이동합니다.3f(n)f(n)/. 동일한 언어를 다른 언어로 또는 다른 시스템에서 구현하는 경우 각 기본 단계에서 소요되는 시간이 다를 수 있지만 너무 자세합니다. 이러한 차이에 대해서는 거의 신경 쓰지 않습니다.

정확한 타이밍을 고려할 때 점근 적 복잡성은 관련이 없습니다. 점근 적 복잡성은 처리중인 실제 입력 크기 일 수도 있고 아닐 수도있는 매우 큰 입력 크기에서 발생하는 상황을 알려줍니다.


또한 "알고리즘 분석에 대한 소개" 에서 Sedgewick o(g)은 올바른 척도로 사용하는 것을지지 합니다. 즉, 런타임을 설명하는 방법으로 T ( n ) =1(여러분은 원한다면 지배적 인 기본 연산의 관점에서 OP를 방해하는 상수 요소 포함). ()()=1
vonbrand

2
@vonbrand Sedgewick은 실제로 그렇게 말합니까? 의 일반적인 정의 , 즉 LIM N ( T ( N ) / g ( N ) ) = 0 (즉, 일부 다른 방법으로 주위 한계 제로 아닌 통일).()영형(()limn(T(n)/g(n))=0
데이비드 Richerby

3

Big-O의 정의를 상기하십시오.

이 존재 IFF에 C를 > 0 이되도록 F ( N ) C g ( N ) 모두를위한 N은 .f(n)O(g(n))c>0f(n)cg(n)n

이 정의에 따르면 모든 상수 d에 대해 이 있습니다. O 표기법 의 목적은 이러한 방식으로 표현을 단순화하는 것입니다. 실제로, 3 , n은 빠르게로 3 배 증가 N을 ,하지만 그들은 모두 선형이다. 이것이 정당한지 아닌지는 문맥에 달려 있습니다. 그러나 O 표기법 을 사용하기로 동의하면 정의에 따라 다릅니다.dnO(n)dO3nnO


2
이것은 Big-O에 대한 훌륭한 설명을 제공하지만이 정의를 사용하는 이유에 대한 설명은 없습니다.
jmite

내가 쓴 것처럼-목적은 우리의 삶을 단순화하는 것입니다. 원자 연산의 정확한 비용을 알지 못하거나 점근 적 표기법에 관심이 있기 때문입니다. 나는 왜 WHY가 흥미로운 수학적 질문이 아니라 철학적 인 질문이라고 생각합니다. 기술적으로는 그것 없이도 할 수 있습니다. 그것은 일을 정말 못 생기고 어렵게 만듭니다.
Shaull

3

Big O 표기법은 성능 변동을 측정하는 단위가없는 평균이므로 계산 프리미티브의 상대적 비용에 영향을받지 않습니다.

간단히 말해서 : Big O 표기법은 단위가없는 상대 측정 유형입니다 (절대 측정과 반대). 상수가 중요하게 작용하는 절대 성능이 아닌 성능 변동 만 측정 할 수 있습니다. 장점은 양의 고정 상한 및 하한을 갖는 한, 기본 운영의 상대 비용을 무시할 수있는 더 간단한 분석을 허용함으로써 구현을 크게 독립적으로 만든다는 것입니다. 그러나 그 결과로 지속적인 요소는 의미가 없습니다 . 그럼에도 불구하고 의도 된 목적으로도 점근 적 복잡성 분석은 다른 이유로 의문을 제기 할 수 있으며 주의해서 고려해야합니다. 예를 들어, 원시 입력 크기가 고려할 올바른 매개 변수가 아닐 수 있습니다.

첫 번째는 귀하의 질문이 정확하게 언급되지 않았다는 것입니다. 3 n 에서 상수 을 무시하면 실제로 "3 중 변화"가 있지만 둘 다 동일한 속도로 변하기 때문에 "[한] 것이 다른 것보다 3 배 더 빠르게 변한다"고 주장 할 수 없습니다.33n

Landau 표기법에서 상수를 무시해야하는 좋은 이유는 신뢰할 수있는 단위가 없기 때문입니다. 누군가가 A가 B보다 두 배 더 멀리 살고 있다고 말하면 이것은 모든 단위와 독립적으로 의미가 있습니다. 광년으로 측정하는 동안 거리를 인치 단위로 측정하더라도 동의 할 수 있습니다. 그러나 절대 거리 측정에는 단위를 지정해야하며 숫자 형식은 선택한 단위에 따라 다릅니다.

알고리즘에 걸리는 실제 시간은 기본 연산의 실행 시간에 따라 달라지며 이는 기계에 따라 다릅니다. 기본 연산의 수를 셀 수는 있지만 모두 동일한 시간이 걸린다고 생각할 이유는 없으며 여러 연산을 단일 연산으로 합성하거나 연산을 작은 연산으로 분해하여 숫자를 계산할 수 있습니다. 참조 가상 머신에 동의하지 않는 한 조작의 의미는 실제로 의미가 없습니다. 독립적 인 참조가 장점입니다.

이 접근법의 장점에 대한 또 다른 관점은 비용에 상한과 양의 하한이있는 한 분석에서 관심있는 모든 요소가 기본 작업 수를 계산한다는 것입니다. 개별 비용에 대해 걱정할 필요가 없습니다.

그러나 그 이점에 대한 대가는 계산 비용 평가가 지정되지 않은 단위로 주어지고 계산 시간이 예를 들어 나노초 또는 밀리 니아가 될 수 있다는 것입니다. 다시 말해, 상수를 변경하는 것은 상수를 변경하는 것과 분리 할 수 없고 참조 단위가 사용되지 않기 때문에 상수가 의미가 없습니다 .

마찬가지로 Patrick87 하였음 이 방법은 입력 크기에 대해서 알고리즘 비늘 충분히 이해할 수 있지만 짧은 기준 유닛에 의존 성능의 절대 측정을 제공하지 않을 것이다. 서로 다른 알고리즘의 성능을 실제로 비교하고자 할 때 공통 참조 추상 기계를 사용하지 않을 수 있지만, 실현 세부 사항에 의해 비교가 편향되지 않는 것이 더 어렵습니다. 점근 적 복잡성에서는 알고리즘을 자체와 비교하기 때문에이 위험을 피할 수 있습니다.

어쨌든 순진한 프로그래머 만 알고리즘을 선택하기 위해 점근 적 복잡성에만 의존합니다. 말할 수없는 상수 및 실제 기본 운영 비용을 포함하여 다른 많은 기준이 있습니다. 더욱이 최악의 복잡성은 나쁜 지표가 될 수있다. 최악의 복잡성의 원인은 드물게 발생할 수 있고, 입력의 조각이 작 으면서도 영향이 제한적일 수 있기 때문이다. 예를 들어 Tree Adjoining Grammars에 대한 일반적인 파서 는 이론적으로 복잡한 를 가지며 실제로 사용할 수 있습니다. 내가 아는 최악의 경우는 Damas-Hindley-Milner 다형성 유형 추론입니다.O(n6)ML에 사용되는 알고리즘으로, 지수 최악의 복잡한 경우가 있습니다. 그러나 이것이 ML 사용자를 괴롭 히거나 ML에서 매우 큰 프로그램을 작성하지 못하게하는 것처럼 보이지는 않습니다. 중요한 상수 이상이 있습니다. 실제로, 점근 적 분석은 계산 비용의 측정치를 입력의 복잡성의 일부 측정과 관련시킨다. 그러나 원시 크기가 올바른 측정 방법이 아닐 수도 있습니다.

복잡성은 결정 가능성과 비슷하지만 이론적으로는 좋지 않지만 대부분의 데이터 공간과 관련이 없을 수도 있습니다. 점근 적 복잡성 분석은 모든 도구와 마찬가지로 장점과 한계가있는 훌륭하고 잘 설계된 도구입니다. 의미가없는 상수를 명시하거나 명시하지 않고 판단을 사용해야합니다.


2

다른 답변 빅-O의 정의에 따라, 우수한 이유에 대한 설명을 제공 .O(n)=O(3n)

우리가 실제로 CS에서 이것을하는 이유에 관해서는 알고리즘의 효율성에 대한 간략한 설명을 얻었습니다. 예를 들어, if 문이있는 알고리즘이있을 수 있는데, 한 분기는 명령어를 실행하고 다른 분기 는 3 개의 n 명령어를 실행 합니다. 이는 동일한 길이의 입력에 대해서도 각 입력에 대해 정확한 숫자가 변경됨을 의미합니다. 각 입력에 대해 숫자를 찾을 수 있지만 big-O 표기법을 사용하면 모든 입력에 대해 시간 복잡성을 측정 할 수 있습니다.n3n

이것은 알고리즘이 얼마나 빠른지 추측 할 때 훨씬 유용합니다. 그렇지 않으면, 우리는 거대한 조각 별 함수를보아야하는데, 이해하기가 매우 어려울 것입니다.

다른 주요 이유는 이러한 측정이 하드웨어에 독립적이기 때문입니다. 다른 컴파일러와 아키텍처는 동일한 코드를 매우 다른 명령어 세트로 변경합니다. 그러나 명령의 수가 선형, 지수 등이라는 것을 알고 있다면 컴파일하거나 실행하는 실제 컴퓨터에 관계없이 알고리즘 속도를 유지한다는 아이디어가 있습니다.


1

의미 LIM SUP N F ( N를 )f(n)=O(g(n)).lim supnf(n)g(n)<+

이것이 에 대해 참이면 g ( n ) = 3 n 에 대해서도 참 이며, 그 반대도 마찬가지입니다.g(n)=ng(n)=3n

마찬가지로, . 여기서 동등성은 f 가 LHS에 속하는 경우 f 가 LHS에 속하는 것을 의미합니다 . 여기서 = 부호는 혼란 스럽기 때문에 개인적으로 싫어하는 심각한 표기법 남용입니다.O(n2)=O(.00005321n2+1000000000n+1046803)f=


2
=O(...)

fO(g)fO(nn2)f(x)=h(x)xx=n=
yo '

f(n)f

나는 그것이 표기법의 남용이라는 것을 알면서도 보통 그렇게한다.;)
yo '

-1

간단히 설명하겠습니다. n = 100000을 봅시다. 이제 3n은 무엇입니까? 그것은 300000입니다 ( 예, 그것은 3의 n입니다 ) 그러나 n ^ 2는 무엇입니까? 10000000000 . ( n의 1 라크 접기) n 과 n ^ 2를 비교합니다. 1 라크와 비교할 때 3은 무시할 만하다. 제거 할 수 있습니다.

n이 수십억 또는 수조인지 생각하십시오. 이 경우에 우리는 3을 수십억 또는 수조와 비교할 것입니다. 이제 우리는우리가 무시할 수 있는지 알고 있습니다 .3.


2
3 년은 여전히 ​​1 년보다 깁니다.
Yuval Filmus

이것이 도움이되는 방법으로 질문에 어떻게 대답하는지 알 수 없습니다. 그것은 기존의 오래된 답변 위에 아무것도 추가하지 않습니다.
Raphael
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.