알고리즘의 Landau 표기법 (Big O 또는 Theta 표기법)을 찾는 프로그래밍 방식?


11

나는 알고리즘을 Landau (Big O, Theta ...) 표기법을 직접 검색하여 가능한 한 최적화되었는지 확인했지만 함수가 실제로 커지고 복잡해지면 길을 가고 있습니다. 손으로 할 시간이 너무 많아 또한 인적 오류가 발생하기 쉽습니다.

Codility (코딩 / 알고 연습)에 시간을 보냈으며 제출 된 솔루션에 대한 Landau 표기법 (시간 및 메모리 사용)을 제공한다는 것을 알았습니다.

그들이 어떻게하는지 궁금해서 ... 어떻게 하시겠습니까?

Lexical Analysis 또는 코드 구문 분석 외에 다른 방법이 있습니까?

이 질문은 주로 PHP 및 JavaScript와 관련이 있지만 모든 언어와 이론에 개방되어 있습니다.


4
이 답변 을 SO에서 확인하십시오 . 당신이 찾고있는 것 같습니다.
데코

2
모든 알고리즘에 대해이 문제를 해결하는 프로그램을 만들 수 있다면 "튜링을 반박 한 사람"으로 유명해질 것입니다.
user281377

1
달리기 시간을 결정하는 것이 일반적으로 불가능하다는 증거는 여기여기를 참조 하십시오 . 실제로 대답보다 훨씬 더 많은 답이 있습니다.
Alex ten Brink

답변:


13

그들이 어떻게하는지 궁금해서 ... 어떻게 하시겠습니까?

다른 문제 크기에 대해 프로그램을 실행하고 시간 및 공간 사용량을 측정하고 결과에 곡선을 맞추는 것으로 실제로 Big O 측정 값을 추정 한다고 생각합니다 .

이 접근법의 문제점 은 비용 함수가 N이 커짐에 따라 모양이 바뀌면 잘못수 있다는 것입니다 . 예 1000 N + N^1.5.

Lexical Analysis 또는 코드 구문 분석 외에 다른 방법이 있습니까?

어휘 분석 및 구문 분석만으로는 충분하지 않습니다. 또한 알고리즘의 동작에 대한 추론이 필요합니다. 그리고 이전에 알려지지 않은 알고리즘에 대해 자동으로 수행하는 것은 어렵습니다.


6
"이전에 알려지지 않은 알고리즘에 대해 자동으로 수행하는 것은 어렵습니다."– 더 정확하게 말하면 정지 문제를 해결하는 것과 같습니다.
Jörg W Mittag

음 ... 정확하지는 않습니다. 정지 문제를 해결하는 것은 이전에 알려지지 않은 모든 알고리즘에 대해 해결할 수있는 것과 같습니다 .
Stephen C

2
맞아 미안해. 하나의 알고리즘에 대해 수행하는 것은 종료를 증명하는 것과 같습니다.
Jörg W Mittag

1
이것의 실용성은 1) 일부 알고리즘에 대한 종료를 입증하거나 반증하는 것이 불가능하지만 2) 대부분의 알고리즘에는이 이론적 장애가 없지만 3) 이론 증명 의 최신 기술 은 충분히 발전하지 못했다는 것입니다. 비교적 간단한 경우를 제외하고는 어쨌든이 작업을 수행 할 수 있습니다. 따라서 나는 그들이 다른 방식으로 이것을하고 있다고 상상합니다. 그러나 분명히 코드를 보지 않고 어떻게 실제로하고 있는지 확신 할 수 없습니다.
Stephen C

3

코드를 분석하지 않고서는 할 수 없습니다.

인공적인 "인플레이션 / 디플레이션"이 복잡해 보이는 아래의 예는 단순히 프로그램 런타임을 측정하는 것만으로는 Big-O를 안정적으로 추정하기에 충분하지 않다는 것을 증명합니다

void lets_trick_runtime(int n) {
   if (n == 10 || n == 25 || n == 118) {
      // unfair speed-up
      do_precalculated_solution_in_constant_time(n);
      return;
   }
   if (n == 11 || n == 26 || n == 119) {
      // unfair slow-down
      do_some_fake_processing_in_n_cube_time(n);
      return;
   }
   // fair solution
   do_general_solution_in_quadratic_time(n);
}

위의 런타임 추정 은 "공정한"2 차 시간 대신에 n미리 계산 된 솔루션이있는 값에 대한 일정한 시간 과 킥인되는 값에 대한 입방 시간 인 가짜 추정치를 제공 할 수 있습니다 unfair slow-down.


그러나 "불공정 한"사례를 확인하는 경우 최악의 경우 실제로 Big-O 복잡성을 추정한다고 가정 할 수 있습니다.
얌 마르코비치

1

나는 이것이 불가능하다고 생각합니다.

고정 된 수의 다른 입력 크기로 일부 테스트를 실행하면 다항식을 쉽게 계산할 수 있으므로 측정 한 런타임과 매우 유사합니다. 따라서 가능한 모든 프로그램에 대해 다항식으로 끝납니다. 이는 P = NP(yeah!;)을 의미 합니다.

기호 조작으로 수행하려고하면에서 종료됩니다 halting problem. 프로그램 중단 여부를 결정할 수 없으므로 런타임 복잡도를 결정할 수 없습니다.

그러나 나중 방법이 가능한 매우 특별한 경우가있을 수 있습니다. 그러나 이러한 사례는 그 규모가 적을 수 있으며, 노력에 대한 대가를 치르는 것은 의문의 여지가 있습니다.


1
+1이지만 정지 문제는 드문 것으로 간주 될 수 있습니다.
얌 마르코비치

0

어떻게합니까? 내가 앉고 해결 하고 싶지 않은 거의 모든 문제를 해결하는 방법 . 시뮬레이션합니다.

많은 문제의 경우 다양한 크기를 사용하여 알고리즘을 여러 번 실행 한 다음 회귀 곡선을 해당 결과에 맞추는 것으로 충분할 수 있습니다. 이를 통해 알고리즘의 특정 "고정"오버 헤드 비용 (곡선 절편)과 문제 크기가 증가함에 따라 어떻게 확장되는지 신속하게 파악할 수 있습니다.

특히 복잡한 솔루션을 포착하려면 약간의 땜질이 필요하지만, 특히 구장 추정치를 찾는 경우에는 그러한 방식으로 구할 수 있어야하며 추정치가 실제 결과와 어떻게 다른지 확인하고 그것이 맞는지 결정해야합니다. 수용 가능한 근사치

이 방법으로 내 마음에 가장 큰 약점은 알고리즘이 실제로 제대로 조정 되지 않으면 초기 "전체를 여러 번 실행"하는 단계가보기 흉한 것입니다. 그러나 솔직히 말해서, 당신은 사물을 물러서서 재고하고 싶을지도 모른다는 지표가되어야합니다.


0

내 직감은이 문제에 대한 일반적인 해결책은 불가능하다는 것입니다. 알고리즘을 실행하지 않고 알고리즘의 실행 시간에 대한 사전 사실을 주장 합니다 (어휘 분석을 암시합니다). 즉, (아마도 우리가 항상 수행하기 때문에) (아마도 큰) 클래스의 알고리즘에 대한 휴리스틱 알고리즘이 가능할 수 있지만,이를 수행하는 일반적인 알고리즘 은 잘 알려져 있지 않은 Entscheidungs 문제를 해결하는 것과 같습니다 . 가능하다 (참조 : Church, Turing 등). 나는 이것에 대해 ~ 99.9 % 확신합니다.

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