기능적 프로그래밍 언어 구현에 대한 알고리즘 복잡성 분석


10

나는 오늘 알고리즘 분석이 계산 모델에 따라 다르다는 것을 배웠습니다 . 내가 생각하지 못했거나 들어 본 적이없는 것입니다.

User @chi 가 더 자세히 설명 한 예 는 다음과 같습니다.

예를 들어 , 주어진 x i를 반환 합니다. RAM에서는 어레이 액세스가 일정한 시간이기 때문에 O ( 1 ) 로 해결할 수 있습니다 . TM을 사용하여 전체 입력을 스캔해야하므로 O ( n )(나는,엑스1,,엑스)엑스나는O(1)영형()

이것은 기능 언어에 대해 궁금해합니다. 내가 이해 한 바에 따르면, "기능 언어는 람다 미적분학과 밀접한 관련이 있습니다"( 여기서 Yuval Filmus의 의견 ). 따라서 함수형 언어가 람다 미적분학을 기반으로하지만 RAM 기반 컴퓨터에서 실행되는 경우 순전히 기능적인 데이터 구조 및 언어를 사용하여 구현 된 알고리즘에 대한 복잡성 분석을 수행하는 적절한 방법은 무엇입니까?

순전히 기능적인 데이터 구조 를 읽을 기회는 없었지만 주제에 대한 Wikipedia 페이지를 보았으며 일부 데이터 구조는 전통적인 배열을 다음과 같이 대체 한 것으로 보입니다.

"배열은 맵 또는 랜덤 액세스 목록으로 대체 될 수 있으며 순전히 기능적인 구현을 허용하지만 액세스 및 업데이트 시간은 로그입니다."

이 경우 계산 모델이 다를 수 있습니다. 맞습니까?


3
나는 분명히이 주제에 대한 전문가는 아니지만 1) 리스프 같은 기계 (자체 비용 모델)는 추가 요소 RAM 프로그램을 시뮬레이트 할 수 있다고 들었습니다. 2)이 요소가 실제로 필요한지 여부는 여전히 미해결 문제입니다. 또한, RAM 모델에서 어레이 액세스에 O (1) 비용을 할당하는 것이 너무 관대하다고 주장 할 수 있습니다. 하드웨어에서 메모리 액세스는 O ( log n ) 게이트 를 통과해야 합니다. 여기서 n 은 실제 메모리 크기입니다. 영형(로그)영형(로그)
chi

1
또한 사실상 모든 실제 FP 언어에는 액세스 시간 이 보장되는 형식 (예 : 명령 언어) 이 포함 된 배열이 있습니다 . 이것은 일반적으로 언어 프리미티브로 추가하여 해결됩니다. 영형(1)
chi

1
다른 계산 모델의 예는 람다 미적분학 용어에서 수행되는 베타 감소의 수입니다. FP에서 우리는 람다 미적분학으로 차려진 램 모델을 사용하는 것이 더
Kurt Mueller

1
@KurtMueller O ( n ) 베테 감소 만으로 크기 의 람다 항을 얻을 수 있습니다 . 이것은 베타 수를 계산하는 비용 모델을 비현실적으로 만듭니다. 논란의 여지없이 더 나은 방법은 각 단계의 크기에 따라 각 단계의 무게를 재는 것입니다. 그러나 이것이 유일한 가능한 모델은 아닙니다. 람다 항에 대한 최적의 평가는 순진한 방식으로 베타를 적용하지 않으므로 좀 더 정교한 그래프 축소 기계를 선호합니다. 이 경우 베타를 계산하는 것이 적절하지 않을 수 있습니다. 영형(2)영형()
chi

1
기능 언어가 간절하거나 게으른 / 엄격하거나 엄격하지 않은지도 알아야합니다. 나는 최근 Haskell에서 실제 알고리즘이 다항식 (비 엄격함)이지만 OCaml (엄격)으로의 순진한 변환이 기하 급수적 인 상황에 직면했습니다.
Eric Lippert

답변:


6

기능 언어의 의미에 따라 다릅니다. 명령문의 실제 의미를 모르기 때문에 프로그래밍 언어에 대한 알고리즘 분석을 개별적으로 수행 할 수 없습니다. 사용자 언어에 대한 사양은 충분히 자세한 의미를 제공해야합니다. 귀하의 언어가 람다 미적분학으로 모든 것을 명시한다면, 감축을위한 비용 측정이 필요합니다 (O (1)입니까, 아니면 감소하는 항의 크기에 의존합니까?).

대부분의 함수형 언어는 그렇게하지 않고 "함수 호출은 O (1)이며 목록의 머리에 추가하는 것은 O (1)"과 같은보다 유용한 문장을 제공한다고 생각합니다.


나는 당신의 대답을 이해한다고 생각합니다 (오해는 람다 미적분학에 대한 나의 이해 부족으로 인해 발생할 가능성이 높습니다) : 당신은 기본적으로 경우 (언어)가 아닌 사례별로 분석해야한다고 말하고 있습니다 특정 작업은 언어마다 다른 의미를 갖기 때문에 일반적인 방법입니다. 내 이해가 정확합니까?
Abdul

예. 언어 디자이너는 알고리즘 런타임을 분석하기 전에 언어로 작성할 수있는 내용이 실제로 무엇을 의미하는지 알려줘야합니다.
adrianN

"프로그래밍 언어에 대해서는 알고리즘 분석을 단독으로 수행 할 수 없습니다."-FP 언어 또는 일반적인 언어를 언급 했습니까? 앞에서 언급 했었다면, 우리는 어떻게 일반적인 방식으로 학교에서 분석을 분석합니까? 즉 Java, C / C ++, Python 문제에 대한 분석을 수행합니까? 그것들이 모두 매우 비슷하기 때문입니까? 아니면 기본 데이터 구조와 ADT가 모두 동일하고 동일한 방식으로 구현 되었기 때문입니까? 아니면 마지막으로,이 과정은 단순히 교육을위한 것이며 엄격하게 정확할 필요는 없기 때문입니까?
Abdul

1
모든 프로그래밍 언어에 적용됩니다. 엄격하게 수정하려면 먼저 시스템 모델을 수정해야합니다. RAM과 지원하는 작은 명령입니다. 해당 지침 만 사용하여 프로그램에 대해서만 분석을 수행 할 수 있습니다. 그런 다음 프로그래밍 언어를 해당 기계 모델에 매핑하는 것을 생각할 수 있습니다. 그런 다음 프로그래밍 언어로 프로그램을 분석 할 수 있습니다. 매우 엄격한 치료를 위해 Knuth가 The Art of Computer Programming에서 어떻게 수행하는지 확인하십시오. 큰 O 숨기기 상수로 인해이 중 많은 부분을 단순화 할 수 있습니다.
adrianN
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.