기능적 언어에 대한 알고리즘 복잡도는 어떻게 모델링됩니까?


38

알고리즘 복잡도는 하위 수준 세부 사항과 독립적으로 설계되었지만 명령형 모델 (예 : 배열 액세스 및 트리의 노드 수정에 O (1) 시간이 걸림)을 기반으로합니다. 순수한 기능적 언어에서는 그렇지 않습니다. Haskell 목록은 액세스하는 데 선형 시간이 걸립니다. 트리에서 노드를 수정하려면 트리의 새 사본을 작성해야합니다.

그렇다면 기능적 언어에 대한 알고리즘 복잡성의 대체 모델링이 있어야합니까?


3
이것은 당신이 찾고있는 것일 수 있습니다.
Aristu

1
귀하의 질문에 대한 답변이 여기에 있습니다 : cs.stackexchange.com/q/18262/755 . 특히, 순전히 함수 언어의 시간 복잡도 는 두 언어의 기능에 대한 일부 적절한 가정에 대해 명령 언어의 시간 복잡도와 최대 의 비율만큼 다릅니다 . O(logn)
DW

3
GHC Haskell은 가변 배열과 트리 등을 지원하므로 "상태 스레드"( ST모나드)를 사용하여 O (1) 시간 내에 배열 액세스를 수행하고 트리 노드를 수정할 수 있습니다.
Tanner Swett

1
@BobJarvis에 따라 다릅니다. 리스트는 추상적 데이터 타입입니까, 아니면 특별히 링크 된리스트를 고려하고 있습니까?
Raphael

1
알고리즘 복잡성을 모델링하기 위해 어떤 목적을 찾고 있습니까? 수학적으로 순수한 무언가 또는 실용적인 것을 찾고 있습니까? 실용적인 가치를 위해서는 암기 가능한지 여부에주의를 기울여야하지만, 수학적 순수 주의적 관점에서 구현의 기능은 중요하지 않습니다.
Cort Ammon

답변:


34

당신이 가정하는 경우 -calculus는 함수형 프로그래밍 언어의 좋은 모델입니다, 다음 사람은 생각 다음 -calculus 시간 복잡도의 단순 해 보이는 개념이 있습니다 단지의 수를 계산 - 환원 단계를 .λλβ(λx.M)NM[N/x]

그러나 이것이 좋은 복잡성 측정입니까?

이 질문에 대답하기 위해, 우선 복잡성 측정의 의미를 명확히해야합니다. Slot과 van Emde Boas 논문 은 하나의 좋은 해답을 제시 합니다. 좋은 복잡성 측정은 Turing 기계를 사용하여 정의 된 시간 복잡성의 표준 개념과 다항식 관계를 가져야합니다. 다시 말해, -calculus 항에서 Turing 기계에 이르기까지 을 인코딩하는 '합리적인'이 있어야합니다 예를 들어 일부 다항식 의 경우 , 크기 의 각 항 에 대해: 의 값으로 감소 - 환원 단계를 정확히 값에에 감소tr(.)λpM|M|Mp(|M|) βtr(M)p(|tr(M)|)튜링 머신의 단계.

오랫동안 이것이 λ- 미적분에서 달성 될 수 있는지는 불분명했습니다. 주요 문제는 다음과 같습니다.

  • 지수 크기의 정규형 (다항식 단계로)을 생성하는 항이 있습니다. 정상적인 형태를 쓰더라도 지수 시간이 걸립니다.
  • 선택한 축소 전략이 중요한 역할을합니다. 예를 들어, 다항식 수의 병렬 β- 단계 ( 최적의 λ- 감소 의 의미에서 )를 감소 시키지만 복잡성이 비 기본적 (지수보다 나빠짐) 인 용어 군이 존재합니다 .

B. Accattoli와 U. Dal Lago 의 논문 " Beta Reduction is Invariant, Indeed "는 가장 왼쪽에있는 이름 별 호출 감소를 가정하여 다항식 시간 함수 의 복잡성 클래스 P 를 보존하는 '합리적인'인코딩을 보여줌으로써 문제를 명확하게합니다. . 중요한 통찰력은 지수 분출이 '분별없는'이유에서만 발생할 수 있다는 것입니다. 다시 말해, 클래스 P 는 Turing machine steps 계산 또는 (가장 왼쪽) -reductions 를 정의하든 관계없이 동일합니다 .β

다른 평가 전략의 상황이 무엇인지 잘 모르겠습니다. 공간 복잡성에 대해 비슷한 프로그램이 수행되었음을 알지 못합니다.


23

알고리즘 복잡도는 하위 수준 세부 정보와 독립적으로 설계되었습니다.

아니 정말. 일부 기계 모델에서는 항상 기본 작업을 계산합니다.

  • 튜링 기계를위한 단계.
  • RAM에 대한 기본 조작.

아마도 전체 / / -business를 생각하고 있었을 것입니다 . Landau asymptotics를 사용하여 일부 구현 세부 사항을 추상화 할 수 는 있지만 기계 모델의 영향을 제거 하지는 않습니다 . 알고리즘은 실행 시간이 매우 다릅니다. TM과 RAM은 클래스 만 고려하더라도 마찬가지입니다!ΩΘOΘ

따라서 귀하의 질문에는 간단한 대답이 있습니다. 기계 모델을 수정하고 계산할 "작업"을 수정하십시오. 이것은 당신 에게 측정 을 줄 것 입니다. 비 기능 알고리즘과 결과를 비교하려면 프로그램을 RAM (알고리즘 분석) 또는 TM (복잡성 이론)으로 컴파일하고 결과를 분석하는 것이 가장 좋습니다. 이 과정을 쉽게하기 위해 전이 정리가 존재할 수 있습니다.


동의했다. 사이드 노트 : 사람들이 작업 "상수"이 무엇인지에 대해 많은 실수를하게 자주. 예를 들어 a + b라고 가정하면 O(1)실제로는O(log ab)
Paul Draper

3
@PaulDraper 그것은 다른 가정이며, 반드시 실수는 아닙니다. 우리는 우리가 원하는 것을 모델링 할 수 있습니다-질문은 흥미로운 질문에 대답하는 것입니다. 여기도 참조 하십시오 .
Raphael

"기계 모델을 제거하십시오"와 같은 끔찍한 소리
Paul Draper

@PaulDraper "machine"이라는 단어에 어떤 종류의 감정을 첨부 하느냐에 달려 있습니다. 이 토론을 참조하십시오 . 단가 RAM 모델 인 FWIW-아마도 알고리즘 분석의 표준 모델입니다! - 입니다 그렇지 않으면 지금 수십 년 동안 사용되지 않았을 유용합니다. 정렬, 검색 트레스 등에 대한 모든 친숙한 범위는 해당 모델을 기반으로합니다. 숫자가 레지스터에 맞는 한 실제 컴퓨터를 모델링하기 때문에 의미가 있습니다.
Raphael

1

일부 기본 추상 기계의 관점에서 복잡성 척도를 공식화하는 대신 비용 정의를 언어 정의 자체로 구울 수 있습니다 . 이를 비용 역학 이라고합니다 . 구성 적 방식으로 언어의 모든 평가 규칙에 비용을 첨부합니다. 즉, 운영 비용은 하위 표현 비용의 함수입니다. 이 방법은 기능적 언어에 가장 자연 스럽지만 잘 정의 된 프로그래밍 언어에 사용될 수 있습니다 (물론 불행히도 대부분의 프로그래밍 언어는 잘 정의되지 않았습니다).


<삭제 된 머신 모델에 대한 토론 > 채팅에서이 토론을 계속 합시다 .
Raphael
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.