Timpul mediu de ieșire al unui șir

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Definiție

În teoria probabilității, timpul mediu de ieșire al unui șir este calculul ieșirii așteptate a unui șir prefixat de caractere prin extragerea aleatorie a literelor dintr-un set finit de caractere, date de formulă , unde este:

  • este numărul total de caractere ale alfabetului de referință
  • este un set de indici care conține valorile
    • poziția primului personaj, egală cu
    • poziția ultimului caracter, egală cu lungimea a șirului
    • pozițiile fiecărui sub-șir repetat în cadrul șirului
  • este o variabilă aleatorie care definește timpul de ieșire al șirului

Pentru a calcula predicția, este necesar, de asemenea, să cunoaștem probabilitatea ca un personaj să iasă din setul total de caractere, dată de , unde este este o variabilă aleatorie care poate asuma valorile unui caracter al alfabetului, în timp ce evenimentul definește ieșirea personajului la -a extragere.

Exemplu

Prognoza timpului mediu de ieșire al cuvântului ABRACADABRA este calculată folosind alfabetul englezesc format din douăzeci și șase de litere.

Folosind definiția avem asta

Este notat ca conține pozițiile primului și ultimului personaj, precum și poziția ultimului caracter al șirului ABRA repetat.

Din aceasta rezultă că , adică timpul mediu de ieșire al cuvântului ABRACADABRA este după ce a efectuat aprox miliarde de apăsări aleatorii pe o tastatură de personaje.

Trecând la limită

Se poate vedea cu ușurință că prezicerea timpului mediu de ieșire al unui șir este o funcție divergentă pe măsură ce crește numărul de caractere de extras. Prin urmare, limita predicției pentru un număr de caractere care tind spre infinit este infinitul, adică .

Limita poate fi calculată intuitiv, având în vedere ipoteza că nu există sub-șiruri repetate. Dacă această limită tinde spre infinit , cu atât mai mult limita în cazul repetărilor tinde spre infinit. Este posibil să nu se țină cont de indicele inițial, care este întotdeauna egal cu unul, deoarece ar fi o constantă în calculul limitei . Pe baza acestor considerații se observă că iar dacă limita de pentru care tinde spre infinit este egal cu infinitul , apoi și limita va fi egal cu infinitul . Pentru fiecare funcția deci este divergent .

Afirmație

Este un set de personaje, cu . Puteți defini un șir prefixat de lungime personaje astfel încât .

Este un spațiu de probabilitate , astfel încât , e o - algebra de Și o măsură a probabilității pe spațiu . Pe acest spațiu se poate construi o succesiune de variabile aleatorii astfel încât .

Este cel mai mic timp în care timp succesiunea faceți șirul . Se definește pe sine timpul de ieșire al șirului.

Dovedește că , cu .

Demonstrație

Este o filtrare astfel încât Și , și anume -algebra generată de succesiunea variabilelor aleatorii în timp .

Observația 1

Și sunt momente de oprire în ceea ce privește

Pentru paradoxul Borel , aceasta este probabilitatea de a obține secvența tastarea aleatorie a literelor pe o tastatură este aproape sigură . Din aceasta rezultă că . De asemenea este un timp de oprire în ceea ce privește în asta, a fi o constantă ,

Observația 2

Pentru fiecare se definește o succesiune de variabile aleatoare independente fix, astfel încât . Succesiunea este independentă , deoarece este o funcție a succesiunii , de asemenea, independent .

Pentru fiecare se observă că prognoza de este egal cu unul. Intr-adevar

Se ridică

Succesiunea e o - martingale .

Observația 2.1

Observația 2.2

Se ridică , care pentru transformarea conform Burkholder este, de asemenea, una - martingale .

Găsiți valoarea lui cand .

Din moment ce analizăm cazul că , cel mai mic dintre Și este exact

Prin definiția lui , care este cel mai mic astfel încât șirul să fie realizat, avem deoarece există cel puțin un personaj între Și unde este . Consecința este că prin urmare

Observație 2.3

Găsiți valoarea lui cand .

Rezultă că

Pe baza observației 2.3 avem asta

Având în vedere că prin definiție avem că

Deoarece probabilitatea unei funcții indicator corespunde evenimentului în sine, avem asta

Concluzie

Pentru observația 2 avem asta

Privind fix și făcându-l să varieze obții asta

Suma pentru fiecare a probabilității ca timpul de oprire este egal cu este echivalent cu calcularea probabilității ca este finit, egal cu pentru observare 1 .

Prin urmare, teza este dovedită prin obținerea acelui

Verificări experimentale

Timpul mediu de ieșire al unui șir poate fi demonstrat experimental prin implementarea unui algoritm care simulează extracția aleatorie a caracterelor și eșantionarea numărului de extracții necesare pentru a compune un cuvânt dat. Algoritmul poate fi implementat printr-un simulator sau utilizând un limbaj de programare furnizat cu o bibliotecă care implementează un generator de numere pseudo-aleatorii . Următorul descrie un exemplu simplu de algoritm , scris în limbajul ANSI C , care vă permite să testați timpii de ieșire ai unui șir. Apoi descriem modul în care datele sunt eșantionate și se arată că datele tind spre predicție matematică .

Algoritm de eșantionare

Pentru a eșantiona timpul de ieșire al unui șir este necesar să implementați un algoritm care efectuează aceeași extracție de un anumit număr de ori, de obicei mai mare de treizeci. Alfabetul de referință este cel englezesc format din douăzeci și șase de litere.

 #include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#include <time.h>

#define MIN_CAR 97
#define MAX_CAR 122
#define DELTA_CAR 26

#define MARKER_STR "-s"
#define MARKER_LAPS "-n"
#define MARKER_SID "-r"
#define MARKER_SAVE "-f"
#define MARKER_VERBOSE "-v"
#define VERBOSE_OFF "off"

int verbose ;

nesemnat lung lung extract_string ( int l , char * s ) {
	
	nesemnat lung lung n ;
	int k , maxk ;
	char c ;
	
	n = 0 ;
	k = 0 ;
	maxk = 0 ;
	
	while ( k < l ) {
		
		if ( n == ULLONG_MAX ) {
			
			if ( verbose == 1 ) {
				printf ( "limita maximă de extracție atinsă:% llu \ n " , n );
				printf ( "numărul maxim de caractere extrase:% d din% d \ n " , maxk , l );
				fflush ( stdout );
			}
			
			retur 0 ;
		}
		
		c = ( char ) ( MIN_CAR + ( rand () % DELTA_CAR ));
		
		if ( c == s [ k ]) {
			k ++ ;
			
			if ( maxk < k ) {
				maxk = k ;
			}
			
		} altceva {
			k = 0 ;
		}
		
		n ++ ;
		
	}
	
	if ( verbose == 1 ) {
		printf ( "șir extras după% llu pas \ n " , n );
		fflush ( stdout );
	}
	
	retur n ;
	
}

int main ( int argc , char * argv []) {
	
	int i , l = -1 , n = -1 ;
	timp_t t ;
	unsigned int sid = 0 ;
	retras lung lung nesemnat ;
	char * s ;
	FIȘIER * f = NUL ;
	
	detaliat = 1 ;
	
	pentru ( i = 0 ; i < argc ; i ++ ) {
		
		if ( strcmp ( argv [ i ], MARKER_STR ) == 0 ) {
			s = argv [ i + 1 ];
			l = strlen ( s );
		} else if ( strcmp ( argv [ i ], MARKER_GIRI ) == 0 ) {
			n = atoi ( argv [ i + 1 ]);
		} else if ( strcmp ( argv [ i ], MARKER_SID ) == 0 ) {
			sid = atoi ( argv [ i + 1 ]);
		} else if ( strcmp ( argv [ i ], MARKER_VERBOSE ) == 0 ) {
			if ( strcmp ( argv [ i + 1 ], VERBOSE_OFF ) == 0 ) {
				detaliat = 0 ;
			}
		} else if ( strcmp ( argv [ i ], MARKER_SAVE ) == 0 ) {
			
			f = fopen ( argv [ i + 1 ], "a" );
			
			if ( f == NULL ) {
				
				printf ( "eroare la crearea fișierului \ n " );
				fflush ( stdout );
				
				retur -1 ;
				
			}
			
		}
		
	}
	
	if ( l == -1 ) {
		if ( verbose == 1 ) {
			printf ( "specificați șirul de extras: -s [șir] \ n " );
			fflush ( stdout );
		}
		retur -1 ;
	}
	
	if ( n == -1 ) {
		if ( verbose == 1 ) {
			printf ( "specificați numărul de iterații: -n [numărul de iterații] \ n " );
			fflush ( stdout );
		}
		retur -1 ;
	}
	
	if ( sid == 0 ) {
		if ( verbose == 1 ) {
			printf ( "nu este specificat niciun side (opțiunea -r [sid]), utilizați sid generat automat \ n " );
			fflush ( stdout );
		}
		sid = ( unsigned int ) time ( & t );
	}
	
	if ( verbose == 1 ) {
		printf ( "**** începe extracția **** \ n " );
		printf ( "sid =% du \ n " , sid );
		printf ( "șir =% s \ n " , s );
		printf ( "lungime =% d \ n " , l );
		printf ( "iterații =% d \ n \ n " , n );
		fflush ( stdout );
	}
	
	srand ( sid );
	
	pentru ( i = 0 ; i < n ; i ++ ) {
		
		ret = extract_string ( l , s );
		
		if ( ret == 0 ) {
			printf ( "eroare la extragerea șirului \ n " );
			fflush ( stdout );
			retur -1 ;
		}
		
		if ( f ! = NULL ) {
			fprintf ( f , "% llu \ n " , ret );
		}
		
	}
	
	if ( f ! = NULL ) {
		fclose ( f );
	}
	
	retur 0 ;
	
}

Pentru a compila codul, este necesar să îl salvați într-un fișier (de exemplu, gen.c) și să creați executabilul printr-un compilator C. Mai jos este comanda pentru a compila sursa cu compilatorul gcc pentru sistemul de operare Linux .

 gcc gen.c -o gen

Testarea ipotezei prin testul lui Student

Testul de ipoteză al studentului vă permite să determinați dacă media eșantionului se abate semnificativ de la media matematică . Ipoteze sunt formulate pentru a efectua testul Și . În cazul în care se testează ipoteza se stabilește că cele două prognoze sunt relevante cu o anumită probabilitate de eroare. În cazul în care se testează ipoteza se stabilește că cele două prognoze nu sunt relevante cu o anumită probabilitate de eroare. Pentru efectuarea testului de verificare este necesar să se obțină următoarele date:

  • este dimensiunea eșantionului, adică de câte ori a fost înregistrat timpul de ieșire al cuvântului „salut”
  • este eșantionul care trebuie verificat, unde reprezintă numărul de extracții care au avut loc înainte de a compune cuvântul „salut”
  • este media eșantionului
  • este varianța eșantionului
  • este media matematică
  • este statistica cu care are legea Studentului grade de libertate
  • este eroarea tolerabilă în confirmarea ipotezei
  • este cuantila legii lui Student cu grade de libertate asociate toleranței

Testul se efectuează prin compararea valorii statistice cu cuantila relativă. În cazul în care apare ipoteza cu o probabilitate egală cu . În cazul în care, pe de altă parte, ipoteza este respinsă iar ipoteza este confirmată cu o probabilitate de eroare egală cu .

Exemplu

Trecem la un exemplu concret de verificare a ipotezelor prin intermediul testului Student Și .

În primul rând, datele sunt eșantionate folosind algoritmul descris în secțiunea anterioară cu comanda

 ./gen -s hello -n 100 -f sampling -r 1492875030

unde este:

  • salut este șirul de extras
  • 100 este numărul de probe
  • eșantionarea este numele fișierului în care vor fi salvate rezultatele extragerilor
  • 1492875030 este sămânța pentru inițializarea generatorului pseudo-aleator

De îndată ce programul termină execuția, este posibil să continuați cu testul Student pentru a stabili dacă numărul de extracții necesare pentru a obține șirul „salut” este relevant pentru predicția matematică . Se calculează parametrii necesari pentru a efectua testul:

  • este dimensiunea eșantionului
  • este media eșantionului
  • este varianța eșantionului
  • este media matematică
  • este statistica cu legea Studentului
  • apare ca eroare tolerabilă în cazul verificării
  • cuantila asociată este

Fiind ipoteza este confirmată și, prin urmare, media eșantion confirmă media matematică. Analizând graficul de mai jos cu tendința prognozelor parțiale pe măsură ce numărul variază, este clar cum .

Eșantion mediu de ieșire string.png