Avatar billede martinbk Nybegynder
04. maj 2004 - 05:22 Der er 12 kommentarer og
1 løsning

Binær søgning

hejsa jeg er løbet ind i et problem med binær streng søgning, problemet ligger i jeg løber ind i et uendelig loop så snart den første forekomst af strengen er fundet, dette kunne løses ved at ændre min løkke betingelse og tilføje en boolean , dette ville blot udelukke muligheden for at finde samtlige objecter i vectoren som indeholder netop den streng jeg leder efter håber nogen kan give lidt input

og lidt kode:

public static Vector findProdukt(Vector produkter, String søgenavn) {
        Vector p = new Vector();
        int left = 0;
        int right = produkter.size() -1;
        int mid;
        while(left <= right) {
            mid = (left + right) / 2;
            String s = ((Produkt) produkter.get(mid)).getNavn();
            if(søgenavn.compareTo(s) > 0) {
                left = mid +1;
            }
            else if(søgenavn.compareTo(s) < 0) {
                right = mid -1;
            }
            else if(søgenavn.equals(s)) {
                p.add(produkter.get(mid));
            }
        }
        return p;
    }
Avatar billede martinbk Nybegynder
04. maj 2004 - 05:23 #1
burde måske lige tilføje at jeg udemærket er klar over jeg skal ændre på mit søge interval når jeg finder strengen, jeg kan bare ikke lige gennemskue hvad jeg skal ændre den til
Avatar billede arne_v Ekspert
04. maj 2004 - 07:26 #2
Jeg ville nok lade den første while løkke kun finde et mid der matcher og
så lave to nye while løkker:
  - en der går baglæns og finder den første som matcher
  - en anden som går forlæns og tilføjer til Vector så længde de matcher
Avatar billede martinbk Nybegynder
04. maj 2004 - 15:49 #3
jeg har nørklet lidt med det, og kom frem til følgende, problemet er blot den berømte "Off By One", jeg ved med sikkerhed strengen findes 3 gange i min vector, men allligevel indeholder min nye vector kun 2 objecter, nogen hints ? :-)

og lidt kode:

    public static Vector findProdukt(Vector produkter, String søgenavn) {
        Vector p = new Vector();
        boolean found = false;
        String s = null;
        int left = 0;
        int right = produkter.size() - 1;
        int mid = 0;
        while (!found && (left <= right)) {
            mid = (left + right) / 2;
            s = ((Produkt) produkter.get(mid)).getNavn();
            if (søgenavn.compareTo(s) > 0) {
                left = mid + 1;
            } else if (søgenavn.compareTo(s) < 0) {
                right = mid - 1;
            } else if (søgenavn.equals(s)) {
                System.out.println("fundet");
                p.add(produkter.get(mid));
                found = true;
            }
        }
        left = mid - 1;
        right = mid + 1;
        while (søgenavn.equals(((Produkt) produkter.get(left)).getNavn())
                && (left >= 0)) {
            p.add(produkter.get(left));
            left--;
        }
        while (søgenavn.equals(((Produkt) produkter.get(right)).getNavn())
                && (right < produkter.size() - 1)) {
            p.add(produkter.get(right));
            right++;
        }
        return p;
    }
Avatar billede arne_v Ekspert
04. maj 2004 - 16:14 #4
(right <= produkter.size() - 1)

eller

(right < produkter.size())

måske
Avatar billede martinbk Nybegynder
04. maj 2004 - 16:22 #5
er afprøvet, og giver mig en indexoutofbounds på min vector
Avatar billede arne_v Ekspert
04. maj 2004 - 16:31 #6
Ovenstående kombineret med at du tester for left og rigth inden di tester for værdi ?
Avatar billede arne_v Ekspert
04. maj 2004 - 16:32 #7
while ((left >= 0) && søgenavn.equals(((Produkt) produkter.get(left)).getNavn())) {
            p.add(produkter.get(left));
            left--;
        }
        while ((right < produkter.size()) && søgenavn.equals(((Produkt) produkter.get(right)).getNavn()))) {
            p.add(produkter.get(right));
            right++;
        }
Avatar billede martinbk Nybegynder
04. maj 2004 - 16:44 #8
right < (produkter.size() <-- giver indexoutofbounds
right < (produkter.size() -1 <-- mangler et element
Avatar billede arne_v Ekspert
04. maj 2004 - 16:49 #9
Har du også prøve at ændre rækkefølgen som vist ovenfor ?
Avatar billede martinbk Nybegynder
04. maj 2004 - 16:53 #10
ahh nej, og det hjalp en hel del, jeg takker ærbødigt, kan entlig godt se logikken i at tjekke om indexet er løbet udover den tilladte størrelse før man forsøger at kalde et element, smider du lige et svar ? :)
Avatar billede arne_v Ekspert
04. maj 2004 - 16:56 #11
svar
Avatar billede arne_v Ekspert
04. maj 2004 - 16:57 #12
Nogle sprog heriblandt Java shortcutter AND d.v.s. at først evalueres
første udtryk og kun hvis det er sandt evalueres andet udtryk.

Andre sprog evaluerer altid alle udtryk.
Avatar billede martinbk Nybegynder
04. maj 2004 - 17:23 #13
ikke lige det man lærer når man har om logiske kvantore på uni. owell så lærte jeg også noget i dag :-)
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