infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Sorin Rita din Iulie 16, 2008, 12:26:48



Titlul: citire parsata
Scris de: Sorin Rita din Iulie 16, 2008, 12:26:48
As vrea sa suit și eu ce înseamna citirea parsata, am cautat dar nu am găsit nimic pe forum


Titlul: Răspuns: citire parsata
Scris de: Pripoae Teodor Anton din Iulie 16, 2008, 12:52:38
Citirea parsata este citirea ca sir de caractere a unor numere si apoi transformarea lor in numere, fiind mai rapida decat citirea normala. Cu cat sunt mai multe numere pe un rand, cu atat este mai rapida.

Uite un exemplu

Cod:
n=200;
for (i=1;i<=n;++i)
    scanf("%d",&v[i]);

poate fi inlocuit cu

Cod:

char s[1000];
n=200;aux=0;poz=0;
gets(s);
for (i=0;s[i];++i){
    if (s[i]==' '){
       v[++poz]=aux;
       aux=0;
    }
    else
        aux=aux*10+s[i]-'0';
}
v[++poz]=aux;



sper ca nu am gresit implementarea  :oops:... spor  :thumbup:


Titlul: Răspuns: citire parsata
Scris de: MciprianM din Iulie 16, 2008, 16:23:57
Eu am inteles ca e mai rapid asa, dar nu inteleg de ce. Poate sa-mi explic cineva? Multumesc mult.


Titlul: Răspuns: citire parsata
Scris de: Stefan Istrate din Iulie 16, 2008, 17:10:31
Functiile standard de citire ("scanf" & co) iau in considerare mult mai multe tipuri de formatare ale datelor de intrare. Din acest motiv, cand cunosti concret structura inputului, poti sa castigi un plus de viteza parsand.
De exemplu, daca stii ca trebuie sa citesti un numar pozitiv, nu trebuie sa faci discutie in functie de semnul numarului. "scanf" nu stie acest lucru, iar daca citesti ca "int", tot trebuie sa testeze primul caracter ca nu cumva sa fie semn.
P.S. Nu am studiat codul intern ca sa vad cum sunt implementate functiile astea, dar in principiu, asa functioneaza.


Titlul: Răspuns: citire parsata
Scris de: MciprianM din Iulie 17, 2008, 14:30:26
Mersi. Deci vrei sa zici ca daca citesc un sir de caractere, nu verifica nimic. Pe cand la alte tipuri verifica si spatiile, semnele etc.
Dar care merge mai repede, citirea caracter cu caracter sau cate un rand intreg?(cin.get()/cin.getline()) si de ce?


Titlul: Răspuns: citire parsata
Scris de: Valentin Stanciu din Iulie 22, 2008, 08:42:10
Teoretic merge mai repede daca citesti cate o linie sau cat mai mult de-o data. Asa harddiskul va citi un bloc intreg, adesea continuu. Daca citesti caracter cu caracter, harddiskul va face cate o operatie de citire pentru fiecare caracter.
Asta in teorie, in practica, amandoua variantele merg cam la fel de repede deoarece sistemul de operare face "read-ahead". Adica daca citesti primul caracter, apoi al doilea caracter, se prinde ca o sa vrei sa citesti si al treilea sau al patrulea asa ca le citeste din timp si le tine in memorie.
Cel mai rapid mod de a citi (teoretic) este sa retii cate 2^x octeti dintr-o bucata, indiferent ca trece sau nu pe linia urmatoare. Si odata ajunse in memorie datele te poti juca cu ele cum vrei. Cu cat e x mai mare, cu atat e mai rapid. (din nou: fara a se lua in calcul optimizarile facute de OS!)

Valentin