알고리즘이 임의의 입력 프로그램의 시간 복잡성을 어느 정도까지 예측할 수 있습니까?


23

정지 문제는 그것을 위해 다른 프로그램이 멈추는 경우 확인할 수있는 프로그램 작성 불가능하다고 주장한다 가능한 모든 입력 프로그램 .

그러나 확실히 다음과 같은 프로그램의 실행 시간을 계산할 수있는 프로그램을 작성할 수 있습니다.

for(i=0; i<N; i++)
    { x = 1; }

실행하지 않고 의 시간 복잡성을 반환 합니다.N

다른 모든 입력 프로그램의 경우 시간 복잡성을 확인할 수 없음을 나타내는 플래그를 반환합니다.

내 질문은 이것입니다 :

주어진 프로그램의 시간 복잡성을 알고리즘 적으로 결정할 수 있도록 어떤 조건을 유지해야합니까?

* 이에 대한 정식 참조 또는 검토 기사가있는 경우 의견에 링크가 있으면 감사하겠습니다.


1
(1)“O- 표기법”은“시간 복잡성”을 의미하지 않습니다. (2)“O (무한대)”의 의미가 확실하지 않습니다. 가능하면 새로운 표기법을 발명하지 마십시오. (3) 주어진 프로그램이 중단되는지 여부를 결정하고 프로그램의 시간 복잡성에 대한 명확한 상한선을 제공하는 것은 다릅니다.
Ito Tsuyoshi

1
제한된 클래스에서 프로그램의 시간 복잡성을 유추하는 데 익숙하지 않지만 확인할 가치가있는 프로그램 클래스를 "바운드 루프 프로그램"이라고하며 시간 복잡성을 쉽게 묶을 수 있습니다. 바운드 루프 프로그램은 Uwe Schöning과 Randall J. Pruim 의 이론적 컴퓨터 과학 보석 3 장 에서 두 프로그램의 동등성을 결정하는 맥락에서 논의되었지만 기억에 관한 장이 귀하의 질문과 얼마나 관련성이 있는지 잘 모르겠습니다.
Ito Tsuyoshi

4
조금 혼란 스러워요. 이것은 어떤 방식으로 범위를 벗어 납니까? OP의 질문에 대한 합리적인 대답 중 하나는 실행 시간을 알고리즘 적으로 결정할 수있는 언어 조각 (또는 조각 클래스)입니다.
Suresh Venkat


7
이 댓글 스레드가 너무 늦었습니다. 우리는 게시물이 초보자 냄새를 맡는 순간을 찌르는 것처럼 보입니다. 나는 손가락을 가리키고 있지 않다. 나는이 본능을 느낀다. 어쩌면 우리는 더 부드럽게해야합니다. OP는 해당 영역이나 용어에 익숙하지 않은 것으로 인정했습니다. 원하는 것을 정확히 아는 사람들 만 용서하고 언어로 질문하는 경우 질문 답변 사이트의 요점은 무엇입니까?
Vijay D

답변:


23

TpT

input: n
run T for n steps
if T is in halting state, output: 0
otherwise, loop for n^2 steps and output: 0

pT

그러나, 프로그램 복잡성의 효과적인 계산에 대한 많은 연구가 수행되었다. 나는 특수 구조 나 형식 규칙을 사용하여 특정 잘 정의 된 복잡한 클래스에 서식하는 프로그램 만 작성할 수있는 언어를 만드는 것을 목표로하는 암시 적 복잡성 이론에 대한 애정을 가지고 있습니다. 내가 기적이라고 생각하는 것에 의해,이 언어들은 종종 그 수업에 완벽합니다!

이 논문 에서 특히 좋은 예가 J.-Y. Marion은 정보 흐름 및 보안 분석 기술에서 영감을 얻은 유형 원칙을 사용하여 P 의 알고리즘을 특성화 할 수있는 작은 명령형 언어를 설명합니다 .


참고로, 종료를 보장 할 수있는 언어 인 Epigram도 참조하십시오.
Realz Slaw

이것은 좋은 시작이지만 할 말이 더 있습니까? (예를 들어, 주어진 기본 재귀 함수 의 런타임은 계산하기가 간단해야하지만 그러한 함수는 지수 계층의 문제를 해결할 수 있습니다 ....)
usul

입력 프로그램이 제한된 언어로 작성된 것으로 판단 할 수있는 한, 언어가 부과하는 상한에 의해 시간 복잡성이 제한되는 것으로 가정 할 수 있습니다. 그러나 많은 원시 재귀 함수에는 일반적인 재귀 함수가 더 효율적입니다.
Chris Pressey

1
(실수로 해당 주석을 조기에 저장 한 후 5 분 제한을 초과했습니다. 두 번째 문장은 다음과 같이 표시되어야합니다.) 그러나 이러한 제한된 언어의 프로그램은 덜 효율적인 언어의 등가물을 사용하는 것이 더 효율적일 수 있습니다 (특히, 많은 기본 재귀 함수는 실제로는 재귀에 제한이없고 분석하기 어려운 언어의 사용을 장려하는보다 효율적인 일반 재귀 적 등가물).
Chris Pressey

매우 흥미 롭습니다 크리스! 당신은 참조가 있습니까? 사실 그것은 반 직관적 인 것처럼 보입니다. 나는 원시 재귀 함수가 주어진 단계 수에 대해 일반적인 재귀 함수를 시뮬레이션 할 수 있다고 생각했을 것입니다. 이는 속도를 일정한 요소로 제한합니다.
코디

11

당신이 제기하는 질문과 당신이 묘사하는 구체적인 계산 기법은 프로그램 분석에서 고전적인 것입니다. 복잡도 분석에는 이론적 인 문제가 있으며, 코드의 성능을 자동으로 추정한다는 측면에서 실질적인 표현입니다. 이러한 자동 분석에는 성능 버그 감지에서 클라우드의 일부 계산 비용 추정에 이르기까지 여러 응용 프로그램이 있습니다.

코디는이 문제는 일반적으로 결정 불가능하다고 지적했다. 복잡도를 확보하면 프로그램도 종료되므로이 문제는 종료를 증명하는 것보다 어렵습니다. 이러한 문제에는 두 가지 접근 방식이 있습니다. 하나는 프로그램 분석에서 나온 것입니다. 카운터를 추가하고 그 값을 추정한다는 아이디어는 70 년대부터 존재합니다. 이 인코딩은 불변량을 계산하는 것에 대한 실행 시간을 결정하는 문제를 줄입니다.

두 번째 방법은 특정 범위의 복잡한 프로그램 만 허용하는 프로그래밍 언어를 디자인하는 것입니다. 이것은 암시적인 계산 복잡성 의 영역입니다 .

두 영역에 대한 일부 참조가 이어집니다.

  1. SPEED 프로젝트 는 프로그램에 도입 된 카운터에서 경계를 찾는 방법에 중점을 둔 프로그램 분석 작업의 특정 라인입니다. 카운터는 시간 또는 공간 소비를 측정 할 수 있습니다.
  2. 다변량 상각 자원 분석 , Jan Hoffman, Klaus Aehlig, Martin Hoffman, ACM TOPLAS 2012
  3. Amir Ben Amram, 명령형 프로그램의 결정 가능한 성장률 속성 에 대한 암시 적 전산 complExity 2010의 개발
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.