Avatar billede lone_a_p Praktikant
25. juli 2009 - 19:57 Der er 6 kommentarer og
2 løsninger

Hurtigste søgefunktion i js

Søgefunktionen er langsom i mit javascript og jeg synes ikke, at dette kan passe.

I øjeblikket opbygger jeg et array med små 5000 værdier.

Dette skal søges igennem for et match med en string.

f.eks. ar[2345]="Ananas, rå"

Lige nu bruger jeg funktionerne substr() og indexOf() men det går godt nok langsomt.

Er der nogen der vil give et hint til, hvordan jeg gør det hurtigere?

Funktionen må meget gerne have en vis margin i søgningen - hvis der fx søges på "flyte" må den meget gerne kunne finde "flute".

Hvordan kan dette laves?

Mvh Lone
Avatar billede ebusiness Nybegynder
25. juli 2009 - 23:34 #1
Jeg skrev det også i dit forrige spørgsmål, dit array skal være et objekt hvor du bruger værdien som indeks, altså:

ob={}
ob["Ananas, rå"]=true
ob["Ananas, kogt"]=true
...

Hvis du også vil lave opslag efter ID kan du lave et objekt og et array:

ob={}
ar=[]
ob["Ananas, rå"]=1
ar[1]="Ananas, rå"
ob["Ananas, kogt"]=2
ar[2]="Ananas, kogt"
...

Når så du vil søge efter en streng slår du den bare op i objektet:

if(id=ob["Ananas, rå"]){
    //"Ananas, rå" findes
}
else{
    //"Ananas, rå" findes ikke
}
Avatar billede lone_a_p Praktikant
26. juli 2009 - 00:05 #2
Mener du dermed at det er hurtigere at søge på key end value?

ar[key] = value

Du må have svaret en anden med et lignende spørgsmål, for problemet er først lige opstået her :)

Tak for svaret, jeg vil dog lige vente og se, om der ikke kommer flere gode forslag :)
Avatar billede olebole Juniormester
26. juli 2009 - 01:32 #3
<ole>

Det behøver du ikke vente på. I alle de sprog, jeg kender til, er hashing langt det hurtigste. For JS' vedkommende kommer du i hvertfald til at vente rigtig mange år for en bedre løsning  ;o)

/mvh
</bole>
Avatar billede ebusiness Nybegynder
26. juli 2009 - 02:55 #4
"Mener du dermed at det er hurtigere at søge på key end value?"

Det bliver sådan set slet ikke til en søgning, men et opslag. En JavaScript liste eller objekt er lidt ligesom en telefonbog, du kan nemt finde navnet ud fra nummeret, men hvis du har nummeret og vil finde navnet er der ikke andet at gøre end at bladre hele bogen igennem.

Jeg går ud fra at det her en udløber af det du lavede i forbindelse med det her spørgsmål: http://www.eksperten.dk/spm/875474
Avatar billede lone_a_p Praktikant
26. juli 2009 - 15:54 #5
ebusiness> ah ok - god forklaring, nu forstår jeg det ;) tak, så tror jeg godt selv, at jeg kan finde ud af resten.

Og jo du har ret mht. sammenligningsfunktionen - den havde jeg glemt. Jeg har lavet det du sagde :)

ole> hashing ... jeg har hørt ordet før og jeg kan læse mig frem til at det er en form for kryptering og det enten bruges til hurtig datahåndtering eller at kryptere data i databaser. Har du evt. noget kode eller et link til en god side om dette, og hvilke funktioner eller noget jeg skal bruge?

Mvh Lone
Avatar billede olebole Juniormester
26. juli 2009 - 17:09 #6
Hmmmm ... ja og nej  =)

Kryptering og hashing er to forskellige ting. Hvis man krypterer en datamængde, kan man umiddelbart genskabe dataene, hvis man har adgang til dekrypterings algoritmen - og den evt. nøgle, der blev brugt ved krypteringen. Det kan man ikke fra en hash.

Hash er på engelsk en sammenkogt ret. Navnet på retten findes på adskillige sprog i forskellige afledninger. Da jeg var barn, var det meget almindeligt at få serveret hachis - og i Scotland har man en ret ved navn haggis.
Man kan sige, at indholdet af gryden repræsenterer en bunke forskellige råvarer - blandet sammen og kogt ind i længere tid.

Når man i programmatisk sammenhæng taler om en hash, mener man en streng, som repræsenterer et 'sammenkog' af en given datamængde.

Hashen kan skabes ved at kalde en funktion med en datamængde (f.eks. en streng eller en fil) som argument. Funktionen returnerer på baggrund af én af mange algoritmer en streng af en bestemt længde. Nogle eksempler herpå er:
    http://dk2.php.net/manual/en/function.md5.php

- og dem, du finder under afsnittet See Also.

En anden måde at skabe og anvende hashen på er den, ebusiness omtaler. Her finder programmøren selv på en streng, som repræsenterer en given datamængde.

Dataene sættes som en property på et objekt, og hashen bruges som property navn. Et sådan objekt kaldes også et hash table. Det er en effektiv måde at opbevare data på - og det tilbyder lynhurtig tilgang til den enkelte datamængde.
Avatar billede olebole Juniormester
26. juli 2009 - 17:17 #7
Du kan sammenligne det med DOM metoden getElementById.

I stedet for at bladre alle dokumentets elementer igennem, indtil du støder ind i et, der passer til nogle bestemte betingelser, har du direkte adgang til det ønskede element med:
    var oElm = document.getElementById("mitElm");

I DOM'en ligger alle elementerne i forskellige collections, som er sammenlignelige med hash tables - og som derfor giver let og lynhurtig adgang til hvert element - eller grupper af elementer - i dokumentet
Avatar billede olebole Juniormester
30. juli 2009 - 12:51 #8
Fik du løst problemet?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester