알고리즘의 재귀와 생성 함수


18

조합론은 컴퓨터 과학에서 중요한 역할을합니다. 알고리즘 설계뿐만 아니라 분석에서도 조합 방법을 자주 사용합니다. 예를 들어 , 그래프에서 -vertex 커버 세트 를 찾는 한 가지 방법은 모든 \ binom {n} {k} 가능한 서브 세트를 검사 할 수 있습니다 . 이항 함수가 기하 급수적으로 증가하는 동안 k 가 고정 상수 인 경우 점근 분석으로 다항식 시간 알고리즘으로 끝납니다.( n케이 k(케이)케이

종종 실제 문제는 재발의 관점에서 정의 할 수있는 더 복잡한 조합 메커니즘을 필요로합니다. 유명한 예 중 하나는 피보나치 수열 (순진)으로 다음과 같이 정의됩니다.

에프()={1만약 =10만약 =0에프(1)+에프(2)그렇지 않으면

이제 번째 항의 값을 계산하면 이 반복을 사용하여 기하 급수적으로 증가하지만 동적 프로그래밍 덕분에 선형 시간으로 계산할 수 있습니다. 이제 모든 재발이 DP (자손 함수, 계승 함수)에 적합하지는 않지만, 일부 함수를 생성 함수가 아닌 재발로 정의 할 때 잠재적으로 악용 될 수 있습니다.

함수 생성은 주어진 구조에 대한 일부 수를 공식화하는 우아한 방법입니다. 아마도 가장 유명한 것은 다음과 같이 정의 된 이항 생성 함수입니다.

(엑스+와이)α=케이=0(α케이)엑스α케이와이케이

운 좋게도 이것은 폐쇄 형 솔루션을 가지고 있습니다. 모든 생성 기능이 이러한 간단한 설명을 허용하지는 않습니다.

이제 내 질문은 이것입니다 : 알고리즘 설계 에 사용되는 함수를 얼마나 자주 생성 합니까? 분석을 통해 알고리즘에 필요한 성장률을 이해하기 위해 어떻게 활용 될 수 있는지 쉽게 알 수 있지만 문제를 해결하는 방법을 만들 때 문제에 대해 무엇을 알려줄 수 있습니까?

여러 번 같은 카운트가 재발로 재구성 될 수 있다면, 그것은 동적 프로그래밍에 적합 할 수 있지만, 아마도 같은 생성 함수는 닫힌 형태를 가질 것입니다. 따라서 너무 균등하게 잘리지 않습니다.


생성 함수가 반복 (아마도 더 효율적으로)을 사용하는 대신 숫자를 계산하는 데 사용할 수있는 수식 (예 : 피보나치 수에 대한 Binet의 수식)을 제공하는 경우이를 답으로 생각하십니까?
Aryabhata

답변:


11

함수 생성은 계산 알고리즘을 설계 할 때 유용합니다. 즉, 특정 속성을 가진 객체의 수를 찾을 때뿐만 아니라 이러한 객체를 열거하는 방법을 찾고있을 때 (그리고 아마도 객체를 계산하는 알고리즘을 생성하는 경우)입니다. Ronald Graham, Donald Knuth 및 Oren Patashnik의 7 장에서 콘크리트 수학 의 훌륭한 프레젠테이션이 있습니다. 아래의 예는이 책에서 발췌 한 것입니다 (실수와 명확성이 부족함).

주어진 동전 세트로 변경하는 방법을 찾고 있다고 가정하십시오. 예를 들어, 일반적인 미국 명칭 ¹을 사용하면 가능한 동전은 입니다. ¢ 42를 변화시키기 위해, 하나의 가능성은 ; 다른 가능성은 입니다. 우리는 연락합니다 . 보다 일반적으로, 우리는 변화를주는 모든 방법에 대한 생성 함수를 작성할 수 있습니다 : 좀 더 기술적 인 용어로, 는 5 개의 변수에 대한 거듭 제곱 공간의 용어입니다.[ 25 ] [ 10 ] [ 5 ] [ 1 ] [ 1 ] [ 10 ] [ 10 ] [ 10 ] [ 10 ] [ 1 ] [ 1 ] 42 [ 25 ] [ 10 ][1],[5],[10],[25],[100][25][10][5][1][1][10][10][10][10][1][1]H = Σ H 0 Σ Q 0 Σ D 0 Σ N 0 Σ (P) 0 [ 100 ] H [ 25 ] Q [ 10 ] d [ 5 ] n [ 1 ] p42[25][10][5][1]2=[10]4[1]2

H=h00000[100]h[25][10][5][1]
[ 100 ] , [ 25 ] , [ 10 ] , [ 5 ] , [ 1 ] [ 100 ] H [ 25 ] Q [ 10 ] (D) [ 5 ] , N [ 1 ] P= 100 H + 25 Q + 10 d + 5 n + p v v H PH[100],[25],[10],[5],[1]. 하여이 공간에 단항식의 평가를 정의 그런 방법은 수득 변화 센트 그 평가이다 monomials 수있는 . 우리는 를 동전으로 만 바꾸는 방법, 으로 동전과 니켈을 바꾸는 방법 등을 적어서 를 점진적으로 표현할 수 있습니다 . ( 동전을 의미합니다.)
[100]h[25][10][5][1]=100h+25+10+5+
VVHI P = I + [ 1 ] + [ 1 ] 2 + [ 1 ] 3 + = I나는
=나는+[1]+[1]2+[1]+=나는나는[1]=(나는+[5]+[5]2+[5]+)=나는[5]=(나는+[10]+[10]2+[10]+)=나는[10]=(나는+[25]+[25]2+[25]+)=나는[25]H=(나는+[100]+[100]2+[100]+)=나는[100]
변경 방법을 열거하지 않고 세고 싶다면, 우리가 얻은 공식 시리즈를 사용하는 간단한 방법이 있습니다. 동질성 적용합니다 에서 의 계수는 센트를 변화 시키는 방법의 수입니다 .
에스:[1]엑스,[5]엑스5,[10]엑스10,[25]엑스25,[100]엑스100
엑스V에스()V

더 어려운 예 : 2x1 도미노로 사각형을 바둑판 식으로 배열하는 모든 방법을 연구한다고 가정합니다. 예를 들어 2 개의 가로 도미노 또는 2 개의 세로 도미노를 사용하여 2x2 사각형을 타일링하는 두 가지 방법이 있습니다. 사각형 을 타일링하는 방법의 수를 세는 것은 상당히 쉽지만 경우는 금방 알 수 없습니다. 도미노를 함께 붙여서 반복적 인 패턴을 빠르게 만들어서 높이가 3 인 수평 밴드의 가능한 모든 타일링을 열거 할 수 있습니다. 2××

{=영형+V+ΓΛ+V=나는+=VΛ=나는+=Λ
여기서 재미있는 모양은 기본 도미노 배열을 나타냅니다. 는 도미노가 아니며 은 수평 도미노의 왼쪽 부분에있는 세로 도미노입니다. 는 높이 3의 밴드의 바닥에 정렬 된 세로 도미노이고, 은 밴드의 상단에 정렬 된 가로 도미노와 그 아래에 두 개의 가로 도미노, 오른쪽에 한 단계, 여기에서 곱셈은 수평 연결을 나타내며 정식은 아니지만이 검정력 계열에서 변수를 형성하는 기본 패턴 사이에는 방정식이 있습니다. 이전과 마찬가지로 모든 도미노에 를 대입 하고 타일링 수에 대한 생성 시리즈를 얻을 수 있습니다.영형나는=엑스×(2/) 직사각형 (즉, 의 계수는 도미노 를 포함 하고 너비가 영역의 사각형을 타일링하는 방법의 수입니다 ). 이 시리즈는보다 다양한 방식으로 사용될 수도 있습니다. 예를 들어, 수직 및 수평 도미노를 구별하여 주어진 수의 수직 및 수평 도미노로 타일링을 계산할 수 있습니다.엑스케이6케이케이2케이

다시 한 번 덜 콘크리트 프리젠 테이션을 보려면 콘크리트 수학 을 읽으십시오 .

¹ 내 목록이 불완전하다는 것을 알고 있습니다. 수학 예제에 적합한 단순화 된 미국을 가정합니다
.² ² 또한 등장한다면 구형 동전을 가정하십시오.
³ 그리고 더 나은 조판.


8

2001 년 학생 프로그래밍 콘테스트에서 해결해야 할 문제를 기억합니다. 문제는 다음과 같습니다.

1, 7, 13, ...의 질량이 주어지면 (어떤 질량은 기억하지 않지만 유한하고 결정적인 질량 세트가 있음) 주어진 무게를 저울로 계량 할 수 있는지 결정하는 함수를 설계하십시오 대중의 집합입니다.

중첩 루프로 시작했지만 벽에 빨리 닿았습니다. 그런 다음 무거운 질량으로 진행하기 전에 가벼운 질량으로 수행 할 수있는 작업을 열거해야한다는 것을 깨달았습니다. 중첩되지 않은 많은 루프로 문제를 해결할 수 있습니다.

당시 젊었을 때 거만하고 자급 자족하지 않았고 (함수 생성에 대해 알고 연습을 했음에도) 함수 생성과 관련된 문제를 다음과 같이 정의했을 수 있습니다.

질량 집합을 고려하여 가중치 을 계량 할 수있는 방법의 수에 대한 를 OGF로 정의 합니다.에프(엑스)

단일 질량 1로 오른쪽 팬의 무게를 측정 할 수 있습니까?

세 가지 가능성 :

  • 왼쪽 팬에 질량을 넣으면 무게가 1이 될 수 있습니다.
  • 오른쪽 팬에 질량을 넣으면 무게가 -1입니다.
  • 질량을 사용하지 않으면 무게가 0이 될 수 있습니다.

그래서 무게를하는 방법 중 하나가 , 무게하는 한 가지 방법 , 및 무게하는 한 가지 방법 . 이 질량의 생성 함수는 와 같 으며 다음에 해당합니다.101엑스1+1+엑스

1엑스엑스(1엑스)

단일 질량 의 생성 함수 는 입니다.미디엄엑스미디엄+1+엑스미디엄

1엑스미디엄엑스미디엄(1엑스미디엄)

다중 집합 의 질량이 주어지면 는 단일 질량 생성 함수의 곱으로 표현됩니다.미디엄에프

에프(엑스)=미디엄미디엄(1엑스미디엄)엑스미디엄미디엄미디엄미디엄미디엄(1엑스미디엄)

이제 다항식에 대한 작업을 수행 할 수있는 패키지가 제공되면 다음을 수행하면됩니다.

  • 두 제품을 모두 계산하십시오.
  • 가장 낮은 수준에서 시작하여 이러한 제품을 나눕니다. (종료)
  • 다항식을 옮깁니다 (유클리드 나누기 ) 몫을 유지하고 나머지를 덤핑합니다.엑스케이

그리고 당신은 끝났습니다. 이제 다항식에는 인덱스 에서 무게를 측정 할 수있는 방법이 많이 있습니다. 유일한 입력은 질량의 다중 집합 입니다.0미디엄

수학적으로 건전한 구성 요소를 사용하여 알고리즘을 설계했습니다. 알고리즘의 주요 부분은 우선 순위가 가장 낮은 다항식 나눗셈이며 선형이며 표준 패키지로 구현할 수 있습니다. 그것은 최적이 아닐 수도 있지만, 내가 컨테스트에서 한 것보다 더 잘 수행되고 오류가 적은 경향이 있습니다.

나누기 프로세스를 자세히 살펴보면 나머지는 프로세스의 모든 상태에서 "현재 숨겨진 상태"로 표시 될 수 있으며 그 결과로 몫이 표시됩니다. "현재 숨겨진 상태"가 어느 곳에서나 0에 도달하면 프로세스가 종료됩니다.

다항식을 배열로 구현할 수 있으며, 인덱스 계수 순서 목록으로 실제로 드문 경우 알고리즘을 변경하지 않습니다.


3

개발하는 동안 알고리즘 matroid 위에 모노톤 submodular 극대화를 들어, 우리가 재발을 해결했다 확인되면 해당 , 우리는 보편적 인 시퀀스 계산 문제를 줄였습니다 . 후자는 생성 함수를 사용하여 달성되었으며 거기 에서 다시 생성 함수를 사용하여 대한 명시 적 공식을 얻었습니다 . 궁금한 점이 있으면 논문에서 해결책을 찾을 수 있지만이 파생을 포함 시키지는 않았습니다.

γ+1(미디엄)=(2미디엄)γ(미디엄)+(미디엄+1)γ1(미디엄),γ0(미디엄)=1,γ미디엄+1(미디엄)=이자형.
γ(미디엄)=미디엄(γ(미디엄1)γ1(미디엄1))γ(0)γ(미디엄)

0

아마도 Quicksort에 대한 광범위한 연구와 그 변형이 가장 분명한 예일 것입니다. 대안의 고려를 지배하는 조합 적 고려가 있으며, 상당히 복잡한 방정식에 대한 솔루션을 분석하면 그 성능의 이점을 보여줍니다.

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