문제

약간의 컨텍스트

쓰고 있었는데 파서에 대한 문법,그리고 테스트를 위한 목적으로 나는 아이디어를 생성하는 일부를 임의의 입력이 있습니다.문법을 다루고 있었으로 훨씬 더 복잡한,이 질문에는"최소한의 동작하는 예제에 대해"단순합니다.그리고 물론,난을 피할 수 있는 문제에 직면했을 사용하여 무리의 사소한 추론,하지만 질문이 정말 궁금합니다.

문제

가정 우리는 전형적인 문맥 자유 문법에 대한 산술의 표현 $+,*$, 브래킷과 정수 리터럴:

$$\전자 longrightarrow F("+"F)^*$$ $$F\longrightarrow T("*"T)^*$$ $$T\longrightarrow int|""E"()"$$

그것은 쉽게 구현할 수 있는 staighforward 알고리즘을 생성하기 위한 임의의 단어에 의해 이 문법:우리를 구현하는 별도의 절차에 대한 각각의 비 단말 이름입니다.는 경우 비터미널은 여러 생산 규칙(로 $T$ 는 않습니다),우리가 선택한 생산 규칙에 의해 동전 던지기.는 경우 규칙을 포함 kleene 성급(예: $("+"F)^*$)우리는 또한 동전 던지기를 생성하 제로 또 하나의 반복(지 확인할 수 있는 우리 하나를 선택하는 임의의 정수 $k\geq0$ 과 생성 $k$ 반복지만,단순화를 위해 우리에 초점을 맞출 것이 가장 간단한 버전의 이 절차).여기에는 우리가 무엇을 얻을:

generate_E():
    if coin_toss():
        return generate_F() + "+" + generate_F()
    else:
        return generate_F()

generate_F():
    if coin_toss():
        return generate_T() + "*" + generate_T()
    else:
        return generate_F()

def generate_T():
    if coin_toss():
        return "(" + generate_E() + ")"
    else:
        return random_integer()

의 호출 generate_E()수익률은 임의의 표현입니다.

무엇이 잘못 갈 수 있을까?는 것이 밝혀졌 실행의는 이 절차를 실제 기계에 종료와 함께 stack overflow 주됩니다.물론,기술적으로 여기서 우리는 가능성의 끝없는 재귀,그러나 나의 직관이었다고 말하는 것에 도달할 확률 깊이 $k$ 부패 기하 급수적으로 증가와 함께 $k$, 따라서 점점 깊은 레벨(말하자,1000)는 것은 거의 불가능하다.분명히,몇 연속 실행하는 절차를 쉽게 도달할 수 있는 깊이의 수천(여 깊이 내 말은 최대의 절차를 호출 스택을 포함이 동시에).

나는 골동품을 공식화하는 방법이 경험적 사실입니다.어려운 부분에 대한 수식 $P(깊이=k)$, 거나,asymptotic 의 근사,또는 불일 경계 바로 꼬리의 CDF 아래에(같은 뭔가 $P(깊이>1000)>0.05$)

내도

나를 위한 수식 $P(깊이=k)$:

자를 나타내 $P(깊이=k)$$P_E(k)$.또한,우리는 우리 정의와 유사한 값 generate_F()generate_T() - $P_F(k)$$P_T(k)$ respectivetely.

명(다른 사람generate_T), $$P_T(1)=\frac{1}{2}$$$k>1$ (다음 점)$$P_T(k)=\frac{1}{2}P_E(k-1)$$

$P_F(k)$, 저희 실행 다른 사람 점,그리고 제공하기 $$\frac{1}{2}P_T(k-1)$$, 나 다음 지,무엇을 조금 더 복잡한 $$\frac{1}{2}\sum_{(x,y)|max(x,y)=k-1}{P_T(x)P_T(y)}$$$$P_F(k)=\frac{1}{2}(P_F(k-1)+\sum_{(x,y)|max(x,y)=k-1}{P_T(x)P_T(y)})$$

마지막으로,식 $P_E(k)$ 은 거의 동일한 $P_F(f)$, 고,우리만을 바꿔야 $P_T(x)$$P_F(x)$.

지금,우리가 계산할 수 있습니다 몇 가지의 값 $P_e(k)$

\을 시작{array}{|r|r|}\hline k&P_E(k)&P_E(k) ext{수}&P_E(k) ext{Monte-Carlo}\\\hline3&\frac{33}{128}&\approx0.257812&\approx0.2527\\\hline6&\frac{4448787585}{34359738368}&\approx0.129477&\approx0.1282\\\hline9&\frac{14080391757747154038821618051813151497122305}{178405961588244985132285746181186892047843328}&\approx0.078923&\approx0.0761\\\hline12& ext{수는 너무 오래}&\approx0.053213&\approx0.0530\\\hline\끝{array}

우리가 볼 수 있듯이,성 수식의 것,사실 그러나 그들은 나에 대한 통찰력 asymptotical 의 행동 $P_E(k)$, 으며,첫 번째 값은 단서를 제공 공식에서 닫힌 형태입니다.

어떤 도움을 감사하겠습니다.

도움이 되었습니까?

해결책

귀하의 프로세스가 교과서의 예 분 프로세스.을 시작으로 한 $E$, 우리가 예상되는 $3/2$$$Fs $9/4$$T$s 고,그렇게 $9/8$ 많은 나머지 $E$s 에서 기대합니다.이 $9/8 > 1$,그것은 놀라운 당신의 과정은 종종하지 못했 종료됩니다.

더 많은 정보를 얻을,우리는 알아야 할 정확한의 배급의 수 $E$-자식에게 주어진 다음에 의해 생성 기능(보 위키 문서에서 연결을 위):$$ h(z)=\frac{33}{128}+\frac{7}{16}z+\frac{15}{64}z^2+\frac{1}{16}z^3+\frac{1}{128}z^4.$$ 이 의미는 멸종 확률 $d\약 0.717778143742483$ (에 의해 해결 $h(z)=z$).이것은 상에서 확률이 당신의 절차가 종료됩니다.

우리는 복구할 수 있습니다 쉽게 당신의 번호를 고려하여 반복의 $h$.가능성에 프로세스가 종료됩니다 $3k$ 단가 $h^{(k)}(0)$.그래서 컴퓨팅 $h(0),h(h(0))-h(0),h(h(h(0)))-h(h(0))$ 그래서,우리는 복구 숫자의 테이블.

$k$ 이 크 $h^{(k)}(0)\약 d$.우리가 계산할 수 있습니다 $h'(d)\약 0.882115879977412$.리 $$ \frac{d-h^{(k)}(0)}{d-h^{(k-1)}(0)}= \frac{h(d)-h(h^{(k-1)}(0))}{d-h^{(k-1)}(0)}\약 h'(d).$$ 그것이 다음과 같이 $$ d-h^{(k)}(0)\propto h'(d)^k.$$ 따라서 확률이는 프로세스가 종료에 정확히 $3k$ 단가 $$ h^{(k)}(0)-h^{(k-1)}(0)= [d-h^{(k-1)}(0)] - [d-h^{(k)}(0)]\propto h'(d)^{k-1}-h(d)^k\propto h'(d)^k.$$ 경험적으로 확인할 수 있는 일정한 비례 거 $0.0248011196615094$.

다른 팁

로 Hyun 가 주목 이 방법의 재귀적 데이터 구조로 알려져(일반적으로)최종 무한한 예 크기입니다.

하지만,문제에 대한 해결책을 수 있는 하나 무게를 재귀에서 선택 그런 방법으로 예상되기에 특정 유한 간격: Boltzmann 샘플러.기반이 되는 조합을 생성하는 기능의 구조와에서 온 종 조합이론.를 위한 실용적인 구현에 필요하지 않습 이론적인 부분을,하지만.좋은 프로그램 소개너를 찾을 수 있습니다 브렌트에서 Yorgey 의 블로그.을 읽을 수 있는 경우(또는 해독)켈,포팅의 접근을 자신의 데이터 구조 너무 어렵지 않다.

예로는 방법에 대한 유도는 당신처럼 보이는 프레임워크 내의 읽 계산 및 생성 측면에서는 바이너리 lambda 미적분학 여 Grygiel&Lescanne(스포일러:그것은 놀라운 금액의 복잡한 분석).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top