Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Single occurrence in a string
Message
De
29/03/2015 07:49:32
Walter Meester
HoogkarspelPays-Bas
 
 
À
28/03/2015 19:20:37
Information générale
Forum:
Visual FoxPro
Catégorie:
Codage, syntaxe et commandes
Versions des environnements
Visual FoxPro:
VFP 9 SP2
OS:
Windows 7
Network:
Windows 2008 Server
Database:
Visual FoxPro
Application:
Desktop
Divers
Thread ID:
01617326
Message ID:
01617355
Vues:
80
>>>>Thanks to all (Dragan, Marcia and Tore). I wonder which solution is the fastest?
>>>>
>>>>Since you have all the code, why don't you test all the solutions and let us know?
>>>
>>>(Edit: This reply is for Yossi)
>>>
>>>I think Dranag's solution is the fastest and optimal, because analyze the string only once and using the minimal instruction set.
>>>
>>Imagine tcBig 650KB long with 10000 "A": the check will be done 10000 times,
>>If the "A" is at the end of the resulting string, will take longer ;-)))
>
>You are right, and I didn't saw Marcia's algorithm that is excelent!
>
>This is the testing results of the 3 algorithms in my PC with a 50000 chars string:
>
>- Dragan: 52.5 secs and maintain the original order
>- Tore: 30.9 secs and doesn't maintain original order (order is alphabetical because SQL)
>- Marcia: 1.4 secs and maintain the original order => WINNER!
>
>Congrats Marcia! :D

hmmm, Is it too late to enter the compiteition?
FUNCTION NonDupe(cString)
LOCAL cNewStr 
 
cNewStr =""
DO WHILE LEN(cString) > 0
	cNewStr = cNewStr + LEFT(cString,1)
	cString = STRTRAN(cString, LEFT(cString,1))
ENDDO
RETURN cNewStr
ENDFUNC
Which is shorter and faster than Marcia's alghorithm by 40% in my testing

But all are nothing compared when you've got some C++ code working for you.
The FoxTools.fll contains a function REDUCE() which is extremely fast on eliminating characters from a string.
It has been written to reduce spaces but has a different role for other characters. It will remove them and replace with spaces.

The following alghorith does not not work for detecting the space as a separate character, but if you're only concerned with non-space characters the following is about a 100 times faster than Marcia's routine.
FUNCTION NonDupe3(cString)
LOCAL cNewStr 
 
cNewStr =""

DO WHILE LEN(cString) > 0
	cNewStr = cNewStr + LEFT(cString,1)
	cString = LTRIM(REDUCE(cString, LEFT(cString,1)))
ENDDO
RETURN cNewStr
ENDFUNC
Walter,
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform