이진 트리 계산


28

(나는 수학적 배경을 가진 학생이며 특정 종류의 이진 트리 수를 계산하는 방법을 알고 싶습니다.)

에 대한 위키 백과 페이지를 보면 이진 트리 , 나는 크기의 뿌리 이진 트리의 수는 있다는이 주장을 눈치 챘 n 이 될 것 카탈루냐어 번호 :

Cn=1n+1(2nn)

그러나 나는 어떻게 그런 결과를 내 스스로 얻을 수 있는지 이해할 수 없습니까? 이 결과를 찾는 방법이 있습니까?

이제 하위 트리의 순서 (왼쪽, 오른쪽)를 고려하지 않으면 어떻게됩니까? 예를 들어 필자의 견해로는이 두 나무가 동일하다고 생각합니다.

   /\   /\
  /\     /\

정확히 n 노드를 가진 개체 수를 세는 비슷한 방법을 적용 할 수 있습니까?


뿌리 2 차 나무에 대한 Polya의 계산 정리가 여기에 적용됩니까?
Nicholas Mancuso

답변:


35

이 경우 나무와 같은 많은 유형의 조합 객체를 계산하기 위해 조합 객체의 구성 방법을 설명에서 기계적으로 파생시킬 수있는 강력한 수학적 도구 (기호 방법)가 있습니다. 여기에는 함수 생성이 포함됩니다.

필립스 플라 졸레 (Philippe Flajolet)와 로버트 세지윅 (Robert Sedgewick )의 분석 조합 은 훌륭한 참고 자료입니다 . 위의 링크에서 사용할 수 있습니다.

허버트 윌프 (Herbert Wilf)의 책 생성 기능 은 또 다른 무료 소스입니다.

물론 GKP의 콘크리트 수학 은 보물입니다.


이진 트리의 경우 다음과 같이 진행됩니다. 먼저 명확한 트리 정의가 필요합니다.

이진 트리는 모든 비 리프 노드가 차수가 2 인 루트 트리입니다.

다음으로 우리는 나무 의 크기 라고 부르는 것에 동의해야합니다 .

여기에 이미지 설명을 입력하십시오

왼쪽에서 모든 노드는 동일합니다. 중간에 우리는 잎과 잎이 아닌 잎을 구별합니다. 오른쪽에는 잎이 제거 된 가지 치기 이진 트리가 있습니다. 왼쪽과 오른쪽의 두 가지 유형의 단항 분기가 있습니다!

이제 우리는 이러한 조합 객체가 어떻게 구성되는지에 대한 설명을 도출해야합니다. 이진 트리의 경우 재귀 적 분해 가 가능합니다.

첫 번째 유형의 모든 이진 트리 세트로 보자 . A여기에 이미지 설명을 입력하십시오

“이진 트리 클래스의 객체는 노드 또는 노드 다음에 2 개의 이진 트리가 있습니다.”이것은 집합 방정식으로 쓸 수 있습니다.

A={}({}×A×A)

이 클래스의 조합 객체를 열거 하는 생성 함수 를 도입함으로써 설정된 방정식을 생성 함수와 관련된 방정식으로 변환 할 수 있습니다.A(z)

A(z)=z+zA2(z)

모든 노드를 동일하게 취급하고 트리의 노드 수를 크기 개념으로 선택하는 것은 변수 노드를 "마킹"하여 표현됩니다 .z

이제 우리는 이차 방정식을 풀 수 에 대한 및 get, 상기 생성 함수의 명시적인 닫힌 형태로 두 용액을 평소처럼 :zA2(z)A(z)+z=0A(z)

A(z)=1±14z22z

이제 우리는 뉴턴 (일반화) 이항 정리가 필요합니다.

(1+x)a=k=0(ak)xk

와 및 멱급수로 발생 기능 뒤로의 닫힌 형태를 확장. 의 계수는 일반적으로 로 쓰여진 크기 의 조합 객체의 수에 불과 하기 때문에 이렇게 합니다. 그러나 여기서 나무의“크기”라는 개념은 에서 계수를 찾아야합니다 . 이항과 계승으로 약간의 저글링 후에 우리는 다음을 얻습니다.a=1/2x=4z2znn[zn]A(z)z2n+1

[z2n+1]A(z)=1n+1(2nn).

크기의 두 번째 개념으로 시작하면 재귀 적 분해는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

우리는 다른 클래스의 조합 객체 얻습니다 . "이진 트리 클래스의 개체는 리프 또는 인터 널 노드이며 이진 트리 두 개가 있습니다."B

동일한 접근법을 사용하고 을 입니다. 이번에는 변수 가 정의의 크기가 다르기 때문에 변수 는 나뭇잎이 아닌 내부 노드 만 표시합니다. 우리는 다른 생성 기능도 얻습니다.B={}({}×B×B)B=1+zB2(z)z

B(z)=114z2z

계수 수율 추출

[zn]B(z)=1n+1(2nn).

및 클래스 는 내부 노드가 있는 이진 트리에 리프가 있으므로 총 노드가 있으므로 카운트에 동의합니다 .ABnn+12n+1

마지막 경우에는 조금 더 열심히 노력해야합니다.

여기에 이미지 설명을 입력하십시오

비어 있지 않은 이진 시도에 대한 설명입니다. 이를

C={}({}×C)({}×C)({}×C×C)D={ϵ}({}×C×C)

함수를 생성하여 다시 작성하십시오.

C(z)=z+2zC(z)+zC2(z)D(z)=1+zC2(z)

이차 방정식을 풀다

C(z)=12z14z2zD(z)=114z2z

그리고 또 다시

[zn]C(z)=1n+1(2nn)n1[zn]D(z)=1n+1(2nn)n0

점을 유의 카탈루냐어 생성 함수 이고

E(z)=114z2

일반 트리 의 클래스를 열거합니다 . 그것은 노드 정도에 제한이없는 나무입니다.

E={}×SEQ(E)

"일반 트리 클래스의 객체는 가능한 빈 트리 시퀀스가 ​​뒤 따르는 노드입니다."

E(z)=z1E(z)

라그랑주 - Bürmann 반전 수식 우리 GET

[zn]E(z)=1n+1(2nn)

따라서 이진 트리만큼 일반 트리가 있음을 증명했습니다. 일반 트리와 이진 트리 사이에 이종이있는 것은 당연합니다. bijection은 로테이션 대응 (연결된 기사의 끝에 설명되어 있음 )으로 알려져 있으며 ,이를 통해 모든 일반 트리를 2 진 트리로 저장할 수 있습니다.

클래스에서 왼쪽과 오른쪽 형제를 구별하지 않으면 또 다른 클래스의 나무 .CT

여기에 이미지 설명을 입력하십시오

단항 이진 트리. 생성 기능도 그러나 계수가 다릅니다. Motzkin 번호

T={}×SEQ2(T)
T(z)=1z12z3z22z
[zn]T(z)=1nk(nk)(nkk1).

그리고 함수 생성을 좋아하지 않는다면 다른 많은 증거도 있습니다. 참조 여기 , 당신은 반다이 크 단어 이진 나무의 인코딩을 사용하고 자신의 재귀 적 정의에서 재발을 유도 할 수있는 일이있다. 그렇다면 그 재발을 해결하면 대답도 얻을 수 있습니다. 그러나 상징적 인 방법은 조합 객체의 청사진과 직접 작동하므로 처음부터 재발을 피할 수 있습니다.


Sedgewick과 Flajolet의 "알고리즘 분석 소개"( aofa.cs.princeton.edu )는 "Analytic Combinatorics"책과 동일한 자료를 다루지 만보다 접근하기 쉬운 형태로 다루고 있습니다.
vonbrand

7

함수 생성은 매우 강력하고 유용한 마술 지팡이입니다. 첫 번째 질문 ( 트리 가있는 이유)에 대한 다음 해결책 은 다소 마술 이 . 따라서 귀엽습니다.Cn

예. 노드로 구성된 트리를 생성하기 위해 이 회 발생 하고 이 회 발생 하는 순서로 시작 합니다 . 예를 들어 입니다. 가장 작은 (그리고 아마도 음수) 합계를 가진 접두사 중에서 가장 긴 것을 선택하십시오. 이 경우 입니다. 이 접두사를 처음부터 가져 와서 끝까지 넣으십시오. 이 경우 됩니다. 이제 변경 로 와 로 ; 이 경우에 우리는 얻는다 . 처음부터 를 제거하고 추가하십시오5+15+115+++++++++++++++++TETTETETTETEETE끝에; 이 경우에 우리는 얻는다 TETETTETEEE. 이것은 트리에 대한 설명입니다 T(E,T(E,T(T(E,T(E,E)),E))). 아래는 왜 이것이 거부인지에 대한 설명입니다. 일단 당신이 그것을 확신하면, 계산이 쉽습니다. 거기 시퀀스 , 우리가 나눈 우리는 가능한 순환 순열 중 하나를 선택하기 때문입니다.(5+65)±15+6

첫 번째 bijection. ML의 트리에 대한 일반적인 정의는 다음과 같습니다 type tree = T of tree * tree | E. 즉, 트리에는 두 개의 (순서대로) 서브 트리가 있거나 비어 있습니다. 다음은 트리 구성 방법 T(T(E,E),T(T(E,E),T(E,E)))입니다.. 보풀을 떨어 뜨리면 간단히 쓸 수 있습니다 TTEETTEETEE. 이러한 모든 설명은로 끝나 E므로 중복 TTEETTEETE됩니다. (빈 트리는 이제 빈 문자열에 해당합니다.)이 문자열에는 각 접두사가 최소한 Es만큼 많은 T를 가지며, Ts와 Es를가집니다. 여기서 은 노드 수입니다. 나무.nnn

두 번째 bijection. 이제 T를 +1로, E를 -1로 바꿉니다. 따라서 값 +1, 값 -1 및 모든 접두사 합계 시퀀스를 살펴보고 있습니다.nn0

세 번째 이탈. 이제 접두사에 대한 요구 사항을 약간 변경합니다. 비어 있지 않은 각 접두사의 합계는 이어야 합니다. 이를 위해 값 +1 및 값 -1을 허용합니다. 그렇지 않으면 전체 문자열의 합계가 0이되고 접두사 조건을 충족하지 못합니다. 이러한 시퀀스는 +1로 시작해야합니다. 따라서 처음에 +1이 붙어 있다는 점을 제외하면 실제로는 이전과 동일합니다.>0n+1n

레이니 속성. 이제 시퀀스를 잠시 잊어 버리고 합이 1 인 유한 정수 정수 , ,, 하십시오. 비어 있지 않은 접두사가 양수인 경우이 시퀀스의 순환 순열은 동일한 속성을 갖지 않습니다. 왜? 음,이 가정 등이 또한 긍정적 인 비어 있지 않은 모든 접두사를 가지고가. 그런 다음 ( 에서 시작하는 시퀀스 속성 ) 및 ( 에서 시작하는 시퀀스 속성 ); 따라서x1xmk1xk,,xm,x1,,xk1x1++xk11x1xk++xm1xkx1++xm2전체 시퀀스의 합이 1이라는 가정과 모순됩니다.

또한, 합계 1의 일부 시퀀스가 ​​주어지면 비어 있지 않은 접두사를 모두 양의 합계로 만드는 순환 순열이 항상 있습니다. (실수에서도 마찬가지입니다.)

결론. 이제 나무와 함께 사용되는 +1과 -1의 순서를 세어 봅시다. 중 번호를 우리가 선택해야합니다 + 1과 동일, 나머지는 -1이됩니다. 그렇게 하는 방법이 있습니다. 그러나 지금까지 계산 된 시퀀스 중 에만 양의 접두사가 있습니다. 따라서 순서가 정해져있는 이진 트리의 수는 다음과 같습니다.2n+1n+1(2n+1n+1)12n+1

12n+1(2n+1n+1)=12n+12n+1n+1(2nn)=1n+1(2nn)

아주 좋은 대답이지만 다음 문장은 약간의 설명이 필요합니다. "합계 1의 일부 시퀀스가 ​​주어지면 항상 비어 있지 않은 접두사에 양의 합계가 있도록 주기적 순환 순열이 있습니다. .... 적어도 증거에 대한 힌트는 다음과 같습니다. 좋은.
vog

1
@vog : 가장 작은 합계의 접두사를 가져 와서 끝으로 옮깁니다.
rgrig

1
@vog : 동일한 합계가 여러 개인 경우 가장 긴 접두사 여야합니다. 처음에 예제를 추가하기 위해 답변을 편집했습니다.
rgrig
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.