점근 적 성장에 의한 분류 기능


35

예를 들어 함수 목록이 있다고 가정합니다.

nlog⁡log⁡(n),2n,n!,n3,nln⁡n,…

이를 무정형으로 정렬하려면 어떻게해야합니까?

f≤Og⟺f∈O(g) ,

그것들이 실제로 쌍으로 비교된다고 가정 합니까 ( 여기도 참조 하십시오 )? 의 정의를 사용하는 것은 어색한 것으로 보이며, 적절한 상수 와 의 존재를 증명하기가 어려운 경우가 많습니다 .Ocn0

이것은 복잡성 측정에 관한 것이므로, 우리는 로 점근 적 행동에 관심이 있으며 , 모든 함수는 음이 아닌 값 ( ) 만 취한다고 가정합니다 .n→+∞∀n,f(n)≥0


4
OP가 다시 돌아 오지 않았으므로 현지화 된 내용을 제거하고 이것으로 참조 질문을합니다.
— Raphael

답변:


48

엄격한 증거를 원한다면 다음과 같은 정리가 종종 유용합니다. 정의보다 더 편리합니다.

경우 이어서, 존재c=limn→∞f(n)g(n)

  • c=0 ⟺f∈o(g) ,
  • c∈(0,∞)⟺f∈Θ(g) 및
  • c=∞   ⟺f∈ω(g) .

이를 통해 알고리즘 분석에 나오는 대부분의 기능을 주문할 수 있습니다 ¹. 운동으로 그것을 증명하십시오!

물론 그에 따라 한계를 계산할 수 있어야합니다. 복잡한 기능을 기본 기능으로 나누는 유용한 트릭은 다음과 같습니다.

  • 두 함수를 하고 지수를 비교하십시오. 비율이 또는 인 경우 원래 몫도 그렇습니다. 0 ∞e…0∞
  • 더 일반적으로 : 볼록하고 지속적으로 차별화되며 엄격하게 증가하는 함수 를 사용하면 몫을 다음과 같이 다시 쓸 수 있습니다.h

    f(n)g(n)=h(f∗(n))h(g∗(n)) ,

    와 및g∗∈Ω(1)

    limn→∞f∗(n)g∗(n)=∞ ,

    그때

    limn→∞f(n)g(n)=∞ .

    이 규칙에 대한 엄격한 증거 (독일어)는 여기 를 참조 하십시오 .

  • 현실에 대한 함수의 연속성을 고려하십시오. 이제 L' Hôpital의 규칙을 사용할 수 있습니다 . 그 조건을 염두에 두십시오 ²!

  • 별개의 해당 항목 인 Stolz–Cesàro를 살펴보십시오 .
  • 계승이 팝업되면 스털링 공식을 사용하십시오 .

    n!∼2πn(ne)n

한 번 증명 한 기본 관계 풀을 유지하고 다음과 같이 자주 사용하는 것도 유용합니다.

  • 로그는 다항식보다 느리게 증가합니다. 즉

    α , β > 0(log⁡n)α∈o(nβ)모든 대해 .α,β>0

  • 다항식의 순서 :

    α<βnα∈o(nβ) 모두 .α<β

  • 다항식은 지수보다 느리게 성장합니다.

    nα∈o(cn)모든 및 대해 .αc>1


한계가 존재하지 않기 때문에 (예를 들어 기능이 진동 할 때) 위의 정리는 적용되지 않을 수 있습니다. 이 경우 라임을 사용하는 다음과 같은 Landau 클래스의 특성을 고려하십시오 .

함께 우리가cs:=lim supn→∞f(n)g(n)

  • 0≤cs<∞⟺f∈O(g) 및
  • cs=0⟺f∈o(g) 입니다.

함께 우리가ci:=lim infn→∞f(n)g(n)

  • 0<ci≤∞⟺f∈Ω(g) 및
  • ci=∞⟺f∈ω(g) 입니다.

더욱이,

  • 0<ci,cs<∞⟺f∈Θ(g)⟺g∈Θ(f) 및
  • ci=cs=1⟺f∼g 입니다.

내 표기법이 혼란 스러우면 여기 와 여기를 확인 하십시오 .


¹ Nota bene : 저의 동료는 많은 기능에 대해이 작업을 성공적으로 수행하는 Mathematica 기능을 작성했기 때문에 부수적으로 작업을 기계 계산으로 줄였습니다.

² 여기도 참조 하십시오 .


@Juho 공개적으로는 아니지만 afaik은 자신을 쓰는 것이 초등입니다. Limit[f[n]/g[n], n -> Infinity]대소 문자 구분을 계산 하고 수행합니다.
— Raphael

20

또 다른 팁 : 때때로 로그 또는 exp와 같은 모노톤 함수를 함수에 적용하면 상황이 더 명확 해집니다.


5
이것은 이지만 신중하게 수행해야합니다 . 2n∈O(n)22n∉O(2n)
— Shaull

2
두 번째. "단일 톤 기능 적용"은 일반적으로 작동하지 않는 일종의 민속적인 것 같습니다. 우리는 충분한 기준에 따라 노력하고 있으며, 최신 답변에 게시 한 내용을 생각해 냈습니다 .
— Raphael

17

Skiena는 그의 저서 Algorithm Design Manual에서 가장 많이 사용되는 기능들 사이의 지배 관계 목록을 제공합니다.

n!≫cn≫n3≫n2≫n1+ϵ≫nlg⁡n≫n≫n1/2
≫lg2⁡n≫lg⁡n≫lg⁡nlg⁡lg⁡n≫lg⁡lg⁡n≫α(n)≫1

여기서 은 역 Ackermann 함수를 나타냅니다 .α(n)


이상하게 구체적인 목록입니다. 많은 관계 ( 정확히 무엇을 의미 하든 )는보다 일반적인 소수 정리로 요약 될 수 있습니다. ≫
— Raphael

지배 관계에 대한 그의 표기법입니다.
— Robert S. Barnes

11

팁 : Wolfram Alpha 와 같은 것을 사용하여 이러한 함수의 그래프를 그려서 어떻게 성장하는지 느끼십시오. 이것은 매우 정확하지는 않지만 충분히 많은 수를 시도하면 비교의 성장 패턴을 볼 수 있습니다. 물론 이것은 증거를 대신 할 수 없습니다.

예를 들면, 시도 : 1에서 플롯 로그 (로그 (N))를 10000 개별 그래프 나 볼 10000 1에서 플롯 로그 (로그 (N)) 및 플롯 로그 (N)을 비교를보고.


9
우리는 정말 부두를 추천해야합니까 ?
— Raphael

함수의 그래프를 그릴 것을 제안하면 +1입니다. 링크 된 그래프는 의미가 무엇인지 알지 못하는 경우 다소 혼란 스럽습니다.
— 이토 쓰요시

1
증명하고 싶은 것을 힌트로 그래프로 나타내십시오. 그 힌트는 물론 틀릴 ​​수 있습니다.
— gnasher729

8

다양한 표기법의 정의에 따라 진행할 것을 제안합니다. 임의의 표현식 쌍으로 시작하여 아래에 설명 된대로 순서를 결정하십시오. 그런 다음 각 추가 요소에 대해 이진 검색을 사용하여 정렬 된 목록에서 위치를 찾고 아래와 같이 비교하십시오. 예를 들어, 의 처음 두 함수 인 n 과 정렬 하여 목록을 시작 합시다 .nlog⁡log⁡n2n

속성을 사용하여 첫 번째 표현식을 로 다시 씁니다. . 우리는 그 표시하도록 정의를 사용하도록 진행할 수있다 , 임의 상수에 대한 사람 , 있다 예는 대 , .n=2log⁡nnlog⁡log⁡n=(2log⁡n)log⁡log⁡n=2log⁡nlog⁡log⁡nnlog⁡log⁡n=2log⁡nlog⁡log⁡n∈o(2n)c>0n0n≥n0c(nlog⁡log⁡n)=c(2log⁡nlog⁡log⁡n)<2n

다음으로 을 시도 합니다. 우리는 지금까지 배치 한 가장 큰 요소 인 과 비교합니다 . 이후 으니 마찬가지로 보여 .3n2n3n=(2log⁡3)n=2nlog⁡32n∈o(3n)=o(2nlog⁡3)

기타.


2

다음은 Wikipedia 의 목록 입니다. 테이블이 낮을수록 더 복잡한 클래스입니다.

NameRunning TimeConstant timeO(1)Inverse Ackermann timeO(a(n))Iterated logarithmic timeO(log∗⁡n)Log-logarithmicO(nlog⁡n)Logarithmic timeO(log⁡n)Polylogarithmic timepoly(log⁡n)Fractional powerO(nc),where 0<c<1Linear timeO(n)"n log star n" timeO(nlog∗⁡n)Quasilinear timeO(nlog⁡n)Quadratic timeO(n2)Cubic timeO(n3)Polynomial timepoly(n)=2O(log⁡n)Quasi-polynomial time2O(poly(log⁡n))Sub-exponential time (first definition)O(2nϵ),ϵ>0Sub-exponential time (second definition)2o(n)Exponential time(with linear exponent)2O(n)Exponential time2poly(n)Factorial timeO(n!)

참고 :poly(x)=xO(1)


1
또한 테이블이 제안하는 방식에 흥미가 있습니다. 당신이 테이블 동안 연결 에 다소 정확, 하나는 연결 이 (어느 복사 한)는 복잡성 클래스에 관한 것입니다 하지 여기에 혼합 할 수있는 유용한 것. Landau 표기법은 "시간"에 관한 것이 아닙니다. 2nlog⁡n∈o(n!)
— Raphael

1
여기에 복잡성 클래스의 이름을 직접 말할 수 있도록 이것을 넣었습니다. 예, Landau는 암호화의 특정 유형의 알고리즘에 관한 것입니다.
— kelalaka

1
나는 @Raphael의 견해에 반대한다. 나는 수년간 수학자이자 강사였습니다. 나는 이런 것들을 증명하는 것 외에도 이와 같은 큰 테이블은 사람들의 직관을 쉽고 크게 증가 시킨다고 믿는다. 그리고 점근 적 클래스의 이름은 사람들이 많은 것을 기억하고 의사 소통하는 데 도움이됩니다.
— Apass.Jack

1
@ Apass.Jack 나의 교수 경험에서, 많은 학생들이 테이블을받을 때 그것을 마음으로 배우고 테이블에없는 어떤 기능도 주문하지 못했습니다. 이 효과가이 사이트에 나타나는 점근 적 성장에 관한 많은 질문을 어떻게 설명하는지 주목하십시오. 물론 증거를 쉽게 만들 수 있도록 테이블에 암시 된 lemmata를 사용하지만 , 테이블을 증명하는 방법을 익힌 후에 나온다 . (이 점을 강조하기 위해 여기 온 사람들 은 테이블에서 물건을 읽는 데 도움이 필요하지 않습니다. 관계 를 증명하는 데 도움이 필요합니다 .)
— Raphael

1
@kelalaka "예, Landau는 암호화의 특정 유형의 알고리즘에 관한 것입니다." 심지어 말이되지 않습니다. Landau 표기법은 수학 함수의 속성을 설명하는 속기입니다. 암호화 자체는 물론 알고리즘과는 아무런 관련이 없습니다.
— Raphael
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.