Big Oh 표기법은 상수 값을 언급하지 않습니다


13

나는 프로그래머이고 방금 알고리즘을 읽기 시작했습니다. 나는 Bog Oh, Big Omega 및 Big Theta라는 표기법을 완전히 확신하지 못합니다. 그 이유는 Big Oh의 정의에 따라, 항상 f (x)보다 크거나 같은 함수 g (x)가 있어야한다고 명시되어 있습니다. 또는 n> n0의 모든 값에 대해 f (x) <= cn입니다.

정의에서 상수 값을 언급하지 않는 이유는 무엇입니까? 예를 들어, 함수 6n + 4를 말하면 O (n)으로 표시됩니다. 그러나 정의가 모든 상수 값에 적합하다는 것은 사실이 아닙니다. c> = 10 및 n> = 1 인 경우에만 유효합니다. c보다 작은 c의 값은 n0의 값이 증가합니다. 왜 상수 값을 정의의 일부로 언급하지 않습니까?


4
상수 값을 정확하게 표현하려면 어떻게 제안합니까?
Daniel B

1
당신의 요점을 한 단계 더 발전 시키면, n을 바인딩하면 모든 종료 함수는 O (1)입니다.
Brian

답변:


23

몇 가지 이유가 있지만 가장 중요한 이유는 상수가 알고리즘 자체가 아니라 알고리즘 구현 의 함수라는 입니다. 알고리즘의 순서는 구현에 관계없이 알고리즘을 비교하는 데 유용합니다.

퀵 정렬 의 실제 런타임 은 일반적으로 C 또는 Python 또는 Scala 또는 Postscript로 구현되는 경우 변경됩니다. 버블 정렬 에도 동일하게 적용됩니다 . 런타임은 구현에 따라 크게 다릅니다.

그러나 변경되지 않는 것은 데이터 세트가 커질수록 기포 정렬을 실행하는 데 필요한 시간이 일반적인 언어의 경우 빠른 언어 정렬을 실행하는 데 필요한 시간보다 언어 나 기계에 관계없이 더 빠르다는 사실입니다. 그것들은 합리적으로 올바른 구현을 가정하여 구현됩니다. 이 간단한 사실을 통해 구체적인 세부 사항을 사용할 수 없을 때 알고리즘 자체에 대한 지능적인 추론을 할 수 있습니다.

알고리즘 의 순서 는 실제 실제 측정에서는 중요하지만 추상 알고리즘을 비교할 때 노이즈 인 경향이있는 요소를 필터링합니다.


22

O (n) 및 기타 순서 표기법은 (일반적으로) 작은 값에 대한 함수의 동작과 관련이 없습니다. 그것은 매우 큰 값들, 즉 n이 무한대로 갈 때 한계에 대한 함수의 동작과 관련이 있습니다.

상수는 기술적으로 중요하지만 일단 n이 충분히 커지면 c의 값은 전적으로 관련이 없으므로 일반적으로 추상화됩니다. c의 값이 중요한 경우 분석에 포함시킬 수 있지만 비교되는 함수의 상수가 매우 크거나 효율성이 특히 중요한 경우가 아니라면 일반적으로 그렇지 않습니다.


3
예를 들어 피라미드를 만드는 것은 O (n)이고, 사진을 정렬하는 것은 O (n log n)입니다. 어떤 시점에서는 피라미드를 새로 만드는 것보다 그림을 정렬하는 데 더 오래 걸릴만큼 충분한 피라미드를 가질 수 있습니다! 그러나 매우 많은 수의 피라미드에 대해서만!
Martin Beckett

좋은 대답이지만 주어진 N과 일반적으로 동일한 "복합"군집에 속하는 두 개의 알고리즘에 대해 OP가 제안하는 것을 정확하게 수행하고 적어도 상대 계수를 포함하는 장점이 있습니다. 다른 요소와 같이 요소 당 명령어 수가 두 배인 선형 알고리즘은 상대적인 차이를 표시하기 위해 두 번째 alg의 * O * (N)에 대해 * O * (2N)이라고 할 수 있습니다 .N의 경우 첫 번째 알고리즘은 항상 두 배이므로 두 번째의 실행 시간; 그러나 * O * (NlogN)과 같은 다른 복잡성 패밀리의 함수와 비교할 때 계수는 중요하지 않습니다.
KeithS

10

정의에 따른 Big O 표기법은 다음과 같이 명시합니다. Big O 표기법은 n '의 오른쪽과 오른쪽에있는 모든 값 n에 대해 f (n)의 값이 cg (n) 이하인 직관을 기반으로합니다. 상수는 n- 제곱 또는 n- 큐브와 같은 고 가치 (가변) 요인으로 갈 때도 중요하지 않습니다. 왜냐하면 상수는 상수 일뿐 그 양만큼 커질 수있는 변동하는 양이 아니기 때문입니다. 다음은 Big-O 표기법의 그래프입니다.
For a given function g(n), we denote by O(g(n)) the set of functions:
O(g(n)) = {f(n): there exist positive constants c and n' such that 0<=f(n)<=c.g(n) for all n > n'}




여기에 이미지 설명을 입력하십시오

이 표기법의 본질은 사실 " how lower is f(n) from c.g(n) and not when it starts becoming lower"입니다.


이 경우 모든 O (n)에 대한 n의 빅 세타도 일정 상수의 정의에 따라 하한이되고 일부 상수의 경우 상한이되기 때문에 n의 빅 세타입니다. 예를 들어 6n + 4는 또한 큰 세타 (n)입니다. c가 10보다 작 으면 항상 하한이기 때문입니다. c가 10보다 크면 상한이다. 그래서 우리는 어떤 Big Oh 표기법에 대해서도 Big theta라고 말할 수 있습니까?
Pradeep

1
"Big Theta는 Big Oh를 의미합니다." 그리고 Big -Oh는 Big-Theta로 대체되어 무증상 범위를 제한 할 수 있습니다.
Vaibhav Agarwal

9

알고리즘 분석에서 Order of Growth 는 주요 추상화이며 입력 크기가 변경 될 때 실행 시간이 변경되는 속도를 제공합니다. 알고리즘에 실행 시간이 있다고 가정 해 봅시다 f(n) = 2n + 3. 이제 입력 크기를 연결하고

n = 10: 2 * 10 + 3 = 23

n = 100: 2 * 100 + 3 = 203

n = 10000: 2 * 10000 + 3 = 20003

n = 1000000: 2 * 1000000 + 3 = 2000003

n = 100000000 : 2 * 100000000 + 3 = 200000003

알 수있는 바와 같이, 성장 순서는 주로 변수에 의해 결정된다 n; 상수 2와 3은 그다지 중요하지 않으며 입력 크기가 커짐에 따라이를 결정하는 데 훨씬 덜 중요해집니다. 이것이 알고리즘 분석에서 함수의 성장 순서를 결정하는 변수에 유리하게 상수가 가중되는 이유입니다.


1

Big-Oh 표기법의 전체 개념은 특히 상수를 무시하고 알고리즘의 런타임을 설명하는 함수의 가장 중요한 부분을 나타내는 것입니다.

잠시 동안 공식적인 정의를 잊어라. 어느 것이 더 나쁜 (빠른 성장) 함수, n^2 - 5000또는 5000 n + 60000? 들면 n5000 주위보다 선형 함수가 큰 (따라서 더)이다. 그 외에도 (정확한 값 5013?) 2 차 방정식이 더 큽니다.

5000보다 큰 양수가 더 많기 때문에 (일반적으로) 더 큰 (더 큰) 함수로 2 차를 취합니다. 주문 표기법 (Big-Oh 등)이이를 시행합니다 (해당 정의를 사용하여 항상 첨가물과 곱셈 상수를 제거 할 수 있음).

물론 일이 항상 간단한 것은 아닙니다. 때때로 당신 그 상수를 알고 싶어합니다. 삽입 정렬 또는 버블 정렬 중 어떤 것이 더 낫습니까? 둘 다입니다 O(n^2). 그러나 하나는 실제로 다른 것보다 낫습니다. 보다 정교한 분석을 통해 여러분이 궁금해하는 것처럼 상수를 얻을 수 있습니다. 일반적으로보다 정확한 함수보다 Big-Oh 함수를 계산하는 것이 훨씬 쉽습니다.

Big-Oh는 이러한 상수를 무시하여 가장 중요한 비교를보다 쉽게하고 단순화합니다. 일반적으로 우리가 있기 때문에 우리는 표기법을 좋아하지 않는 제 (주로 무관) 상수에 대해 알고 싶어요.


1

(이 답변은 더 이상 답변이므로 굵은 글씨를 읽고 요약 )

예를 들어 단계별로 살펴보고 우리가하는 일의 목적을 이해합시다. 우리는 귀하의 기능과 Big Oh 표기법을 찾는 목표로 시작합니다.

f(n) = 6n+4

먼저, 우리가 찾으려고 하는 Big Oh 표기법을 보자O(g(n))f(n) . Big Oh의 정의에서, 우리는 상수가 존재하는 곳 과 모든 것보다 큰 곳을 단순화 해야합니다 .g(n)cn0c*g(n) >= f(n)nn0

먼저 g(n) = 6n + 4( O(6n+4)Big Oh로 산출) 를 선택합시다 . 이 경우 우리는 볼 c = 1과의 값은 n0이후, 빅 오의 우리의 정의에서 수학 요구 사항을 충족 g(n)항상 같습니다 f(n):

c*g(n)      >=  f(n)    
1*(6n + 4)  >=  6n + 4    //True for all n's, so we don't need to pick an n0

이 시점에서 우리는 수학적 요구 사항을 충족했습니다. 에서 멈추었다면O(6n+4) 이것이 글쓰기보다 더 도움이되지 않는다는 것이 분명 f(n)하므로 Big Oh 표기법의 진정한 목적을 놓칠 것입니다 : 알고리즘의 일반적인 시간 복잡성을 이해하는 것! 따라서 다음 단계 인 단순화로 넘어 갑시다.

먼저, Big Oh가 그렇게 간단 해 6n지도록 할 수 O(4)있습니까? 아니! (이유를 이해하지 못하면 독자를위한 운동)

둘째, Big Oh가되도록 단순화 할 수 있습니까? 예! 4O(6n) 이 경우 다음과 g(n) = 6n같습니다.

c*g(n)    >=  f(n)
c*6n      >=  6n + 4     

이 시점 c = 2에서 왼쪽을 증가시킬 때마다 왼쪽이 오른쪽 (6)보다 빠르게 (12 씩) 증가하므로 선택합시다 n.

2*6n      >=  6n + 4

이제 n0위의 방정식이 모두 n해당 값보다 큰 경우 양수를 찾아야 합니다. 우리는 왼쪽이 오른쪽보다 빠르게 증가한다는 것을 이미 알고 있기 때문에 우리가해야 할 일은 하나의 긍정적 인 해결책을 찾는 것입니다. 따라서 n0 = 2위의 내용을 적용한 이후 로 g(n)=6n, 또는 O(6n)잠재적 Big Oh 표기법 임을 알 수 f(n)있습니다.

이제 Big Oh가되도록 단순화 할 수 있습니까? 예! 6O(n) 이 경우 다음과 g(n) = n같습니다.

c*g(n)      >=  f(n)    
c*n         >=  6n + 4    

c = 7왼쪽이 오른쪽보다 빠르게 증가하므로 선택합시다 .

7*n         >=  6n + 4

위의 모든 n것이 크거나 같다는 사실을 알 수 n0 = 4있습니다. 따라서에 O(n)대한 잠재적 Big Oh 표기법입니다 f(n). g(n)더 이상 단순화 할 수 있습니까 ? 아니!

마지막으로 가장 간단한 Big Oh 표기법은 f(n)입니다 O(n). 우리는 왜이 모든 것을 겪었습니까? Big Oh 표기법은 선형 복잡성 이므로 이제 f(n)선형 임을 알 수 있습니다 O(n). 좋은 점은 이제 f(n)다른 알고리즘 과 시간 복잡성을 비교할 수 있다는 것입니다 ! 예를 들어, 우리는 이제 f(n)함수 h(n) = 123n + 72,, i(n) = n등과 시간이 복잡 하다는 것을 알고 있습니다 j(n) = .0002n + 1234. 위에서 간략히 설명한 동일한 단순화 프로세스를 사용하기 때문에 모두 선형 시간 복잡성을 갖습니다 O(n).

단!!!


안녕하세요, 좋은 설명입니다. 나는 여전히 의심의 여지가 거의 없다. 1. 변수 값 'n'이 있으므로 6n + 4를 O (4)로 만들 수 없습니다. 이것이 답입니까? 2. 단순화하면서 c = 7을 선택하고 그에 따라 n0을 4로 계산했습니다. c = 7을 결정하고 7 이상을 결정한 것은 무엇입니까? c의 값에 따라 n0이 변경되기 때문입니다.
Pradeep

@Pradeep : 1의 경우 맞습니다. 더 자세히 설명하면 : 우리가 노력하면 O(4)불평등 방정식 c*4 >= 6n+4이되고 c, 우리가 선택한 n것은 불평등을 거짓으로 만드는 위의 모든 값을 항상 찾을 수 있습니다.
Briguy37

@Pradeep : 2의 경우, 실제의 값 c과는 n0중요하지 않습니다. 중요한 것은 즉 n0존재 c우리가 선택하십시오. 이것이 참이 되려면 부등식의 왼쪽이 큰 값의 오른쪽보다 빠르게 증가해야합니다 n. c=6이것에는 좋지 6n >= 6n+4않습니다 (사실이 아닙니다) c=7. 난 그냥 쉽게 정돈 할 수있을 c=10, c=734또는 c=6.0000001아직도 일부 있다는 것을 볼 수 있었을 것이다 n0에 대한 불평등이 참 만들기 위해 존재하는 n >= n0우리가 테스트중인 큰 아이 유효 의미한다.
Briguy37

명확한 설명 감사합니다. 이것이 내가 정확히 찾던 것입니다. 다시 한번 감사합니다.
Pradeep

@Pradeep : 도움이 될 수있어서 다행입니다 :)
Briguy37

1

의 성능 함수가있는 경우 6n + 4관련 질문은 "6 무엇?"입니다. 한 의견은 물었습니다 : 상수는 무엇을 나타 냅니까? 물리학 용어로, 상수 요소의 단위는 무엇입니까?

O () 표기법이 알고리즘 성능을 설명하는 데 널리 사용되는 이유는 해당 질문에 대답 할 수있는 이식 가능한 방법이 없기 때문입니다. 서로 다른 프로세서는 동일한 기본 계산을 수행하기 위해 다른 클럭주기와 다른 시간이 걸리거나 관련 기본 계산을 다르게 집중시킬 수 있습니다. 다른 컴퓨터 언어 또는 의사 코드와 같은 다른 공식 및 비공식 설명은 직접 비교하기 어려운 방식으로 알고리즘을 나타냅니다. 같은 언어로 구현하더라도 동일한 알고리즘을 다른 방식으로 나타낼 수 있습니다. 줄 수와 같은 간단한 서식 세부 정보는 일반적으로 주어진 알고리즘을 구현하기 위해 다양한 임의의 구조적 선택을합니다.

우리는 "알고리즘"을 사용하여 특정 구현을 설명하는 것이 아니라 동일한 일반 절차의 잠재적 인 구현의 전체 클래스를 설명합니다. 이 추상화는 일반적인 가치가있는 것을 문서화하기 위해 구현의 세부 사항을 무시하며, 지속적인 성능 요소는 이러한 세부 사항 중 하나입니다.

즉, 알고리즘 설명에는 실제 하드웨어에서 실제 구현의 성능을 설명하는 민속, 메모 또는 실제 벤치 마크가 종종 포함됩니다. 이것은 어떤 종류의 상수 요소를 기대할 수 있는지에 대한 대략적인 아이디어를 제공하지만 실제 성능은 주어진 구현을 최적화하는 데 얼마나 많은 작업이 필요한지에 따라 달라지기 때문에 소금 한 덩어리로 가져와야합니다. 또한 장기적으로 최신 알고리즘과 가장 큰 프로세서의 아키텍처가 변경됨에 따라 비교 가능한 알고리즘의 상대적 성능이 표류하는 경향이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.