Avatar billede ahj123 Nybegynder
29. januar 2003 - 15:35 Der er 7 kommentarer og
1 løsning

Søgning i fil-index

Problemstillingen er følgende:

Jeg har et antal nummererede tekststrenge (typisk 5,000-50,000 stk). Jeg ønsker at søge i disse tekststrenge, dvs. givet et søgeord, ønsker jeg alle de nummeret på alle de tekststrenge som søgeordet optræder i.

Jeg ønsker endvidere at kunne tilføje nye tekststrenge og fjerne tekststrenge hurtigt. Desuden må datastrukturen ikke fylde for meget i hukommelsen.

Så vidt jeg har kunnet finde frem til er det mest optimalt at basere algoritmen på et "compressed suffix tree".

Jeg ønsker en færdig implementation af denne algoritme, men jeg har ikke kunnet finde noget på Google.

Nogen bud?
Avatar billede disky Nybegynder
29. januar 2003 - 16:19 #1
Brug en Database til det.

Hvis du skal have færdige løsninger er eksperten ikke stedet, vi løser ikke folks komplexe opgaver for point.
Der skal penge på bordet istedet, og det må man ikke på Experten.
Avatar billede arne_v Ekspert
29. januar 2003 - 16:22 #2
Efter sidste regel-ændring er det faktisk tilladt at tilbyde
penge på Eksperten - læs punkt 7 og 8 i reglerne.
Avatar billede arne_v Ekspert
29. januar 2003 - 16:25 #3
En database er næppe løsningen på problemet (man spørger ikke efter et
compressed suffix tree medmindre man har "specielle" behov).
Avatar billede arne_v Ekspert
29. januar 2003 - 16:27 #4
Men opgaven er stor. Der er C kode tilgængelig på nettet. Og den
kan selvfølgelig konverteres til Java. Men for at kunne konvertere
korrekt skal man nok kende ideen bag algoritmen rimeligt. Og det tager
tid at sætte sig ind i (og der er næppe mange som har den viden på
forhånd).
Avatar billede ahj123 Nybegynder
29. januar 2003 - 16:37 #5
Jeg ønsker skam heller ikke at der er nogen her der laver en løsning til mig. Jeg ville bare gerne vide om der er nogen der kender til en publiceret implementation af denne algoritme i java. Beklager misforståelsen.

Men det ender nok med at jeg må til at konvertere C kode, desværre - eller bygge det op fra bunden. Eller måske bruge en simplere (og langsommere) løsning.
Avatar billede cprovstgaard Nybegynder
06. februar 2003 - 13:14 #6
Jeg har ikke set en sådan implementation, men - hvor svært kan det være ?!

Et forslag:

Lav dit eget containerobject med en hashmap som indlejret struktur for dine strenge. Med HashMap opfylder du dit krav "Jeg ønsker endvidere at kunne tilføje nye tekststrenge og fjerne tekststrenge hurtigt. Desuden må datastrukturen ikke fylde for meget i hukommelsen.".

Lav en metode på containerobjectet der finder og returnerer de relevante matches jf dine beskrivelse.
Til at finde disse matches vil det være smart at bruge den nye(fra jdk 1.4) java.util.regex pakke.
Du er vist teoretisk nødt til at løbe alle dine 5-50.000 strenge igennem (ligesom en database ville gøre det).

OBS på trådsikkerhed./mvh
Avatar billede ahj123 Nybegynder
08. februar 2003 - 13:40 #7
cprovstgaard: Jeg kan slet ikke se fordelen i at benytte en HashMap. Det vil jo ikke give hurtigere søgning.

Det jeg netop gerne ville undgå var at løbe alle strengene igennem. Det KAN lade sig gøre med visse komplicerede algoritmer.

Hvis alle strengene skal løbes igennem, som du foreslår, er det da meget mere effektivt at benytte en LinkedList.

Jeg tror i øvrigt det er hurtigere at lave min egen søgefunktion end at bruge regex pakken, hvis jeg kun skal lave en simpel substring søgning.
Avatar billede ahj123 Nybegynder
10. februar 2003 - 00:31 #8
Spørgsmålet lukkes
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
Kurser inden for grundlæggende programmering

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