[Off] Desafio: strfind rбpido
#1

Mais uma vez, dessa vez o desafio й fazer um strfind mais rбpido que o strfind da SAMP

Alguйm aн, tenta?


Sugestгo de algorнtimos:

http://www-igm.univ-mlv.fr/~lecroq/string/
Reply
#2

Jб que ninguйm quis, aqui minha funзгo.

й duas vezes mais rбpido no ignorecase:

fstrfind

pawn Код:
new
    i_loop@find,
    j_loop@find,
    p_loop@find;

fstrfind( text[] , pattern[] , {bool,_}: ignorecase = false, pos = -1)
{
    if(!ignorecase)
        return strfind( text , pattern, ignorecase, pos);


    j_loop@find = strlen(pattern)-1;

    for(i_loop@find = strlen(text)-1 ; i_loop@find > pos ; --i_loop@find) {

        calcular:

        p_loop@find = (text[i_loop@find] ^ pattern[j_loop@find]);

        if(!((32 ^ p_loop@find) & p_loop@find)) {

            if(!j_loop@find) return i_loop@find;

            i_loop@find--;
            j_loop@find--;

            if( ( ( ~i_loop@find ) ) ) {
                goto calcular;
            }

        }
        else {
            j_loop@find = strlen(pattern) - 1 ;
        }
    }
    return -1;
}

Depende do modo de uso:

pawn Код:
#define CONT GetTickCount()

new C = CONT;
for(new i; i != 10000; i++) {
    fstrfind("testa teste testu testi testo", "testu", true);
    fstrfind("testa teste testu testi strFind", "strFind", true);
    fstrfind("testa teste testu testi strFind", "testa", true);

    fstrfind("testa teste testu testi testo", "testu", false);
    fstrfind("testa teste testu testi strFind", "strFind", false);
    fstrfind("testa teste testu testi strFind", "testa", false);
}
C = CONT - C;

new T = CONT;
for(new i; i != 10000; i++)  {

    strfind("testa teste testu testi testo", "testu", true);
    strfind("testa teste testu testi strFind", "strFind", true);
    strfind("testa teste testu testi strFind", "testa", true);

    strfind("testa teste testu testi testo", "testu", false);
    strfind("testa teste testu testi strFind", "strFind", false);
    strfind("testa teste testu testi strFind", "testa", false);


}
T = CONT - T;

printf("%d x %d", C , T );
Reply
#3

cara vc ja viu que tem a capacidade de melhorar e muito as funcoes nativas da sa-mp?

poste estas coisas na board inglesa quem sabe vc vira beta tester ( nunca se sabe :O )
Reply
#4

Quote:
Originally Posted by PT
Посмотреть сообщение
cara vc ja viu que tem a capacidade de melhorar e muito as funcoes nativas da sa-mp?

poste estas coisas na board inglesa quem sabe vc vira beta tester ( nunca se sabe :O )
Concordo, acho que o bruno deveria postar algumas coisas na english board . Quem sabe ele nгo vira um beta tester
Reply
#5

Quote:
Originally Posted by PT
Посмотреть сообщение
cara vc ja viu que tem a capacidade de melhorar e muito as funcoes nativas da sa-mp?

poste estas coisas na board inglesa quem sabe vc vira beta tester ( nunca se sabe :O )
Que louco, um Beta Tester da board Portuguesa haha
Reply
#6

o ipsBruno vai vira beta tester?? oi tudo bem, eu sou o meunick e quero ser seu amigo '0'

zoaq
Reply
#7

Quote:
Originally Posted by RuanRider
Посмотреть сообщение
o ipsBruno vai vira beta tester?? oi tudo bem, eu sou o meunick e quero ser seu amigo '0'

zoaq
eu cara fala em um hipуtese, outros ja falam que vai ser...

assim se geram confusoes, + atencao no que le e principalmente ao que fala
Reply
#8

Quote:
Originally Posted by PT
Посмотреть сообщение
eu cara fala em um hipуtese, outros ja falam que vai ser...

assim se geram confusoes, + atencao no que le e principalmente ao que fala
sim, acontece isso, eu simulei em uma brincadeira xD
Reply
#9

Dificilmente. O mбximo que consegui foi ser moderador dessa бrea
Reply
#10

Quote:
Originally Posted by ipsBruno
Посмотреть сообщение
Jб que ninguйm quis, aqui minha funзгo.

й duas vezes mais rбpido no ignorecase:

fstrfind

pawn Код:
new
    i_loop@find,
    j_loop@find,
    p_loop@find;

fstrfind( text[] , pattern[] , {bool,_}: ignorecase = false, pos = -1)
{
    if(!ignorecase)
        return strfind( text , pattern, ignorecase, pos);


    j_loop@find = strlen(pattern)-1;

    for(i_loop@find = strlen(text)-1 ; i_loop@find > pos ; --i_loop@find) {

        calcular:

        p_loop@find = (text[i_loop@find] ^ pattern[j_loop@find]);

        if(!((32 ^ p_loop@find) & p_loop@find)) {

            if(!j_loop@find) return i_loop@find;

            i_loop@find--;
            j_loop@find--;

            if( ( ( ~i_loop@find ) ) ) {
                goto calcular;
            }

        }
        else {
            j_loop@find = strlen(pattern) - 1 ;
        }
    }
    return -1;
}

Depende do modo de uso:

pawn Код:
#define CONT GetTickCount()

new C = CONT;
for(new i; i != 10000; i++) {
    fstrfind("testa teste testu testi testo", "testu", true);
    fstrfind("testa teste testu testi strFind", "strFind", true);
    fstrfind("testa teste testu testi strFind", "testa", true);

    fstrfind("testa teste testu testi testo", "testu", false);
    fstrfind("testa teste testu testi strFind", "strFind", false);
    fstrfind("testa teste testu testi strFind", "testa", false);
}
C = CONT - C;

new T = CONT;
for(new i; i != 10000; i++)  {

    strfind("testa teste testu testi testo", "testu", true);
    strfind("testa teste testu testi strFind", "strFind", true);
    strfind("testa teste testu testi strFind", "testa", true);

    strfind("testa teste testu testi testo", "testu", false);
    strfind("testa teste testu testi strFind", "strFind", false);
    strfind("testa teste testu testi strFind", "testa", false);


}
T = CONT - T;

printf("%d x %d", C , T );
Vou tentar aqui tambйm.

Quero ver se chego ao menos perto de melhoras.
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)