ERLEDIGT
NEIN
NEIN
ANTWORTEN
8
8
ZUGRIFFE
1569
1569
EMPFEHLEN
-
30.12.04 22:56 #1
- Registriert seit
- Sep 2003
- Ort
- Saarbrücken
- Beiträge
- 47
Hallo,
und ich habe ein weiteres Problem. Ich soll eine binäre Suche in mein Programm einbauen. Ich habe also eine sortierte Menge. Die Mitte wird ermittelt. Entweder befindet sich die gesuchte Zahl in der unteren oder der oberen Hälfte. Die Hälfte, in der es sich befinden soll, wird noch einmal geteilt, usw.
Mein Quelltext sieht folgendermaßen aus:
Das Programm funktioniert ganz gut. Leider endet es in einer Endlosschleife, wenn die gesuchte Zahl sich nicht in dem Array feld befindet.Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
public int binSuche(int a){ int mitte = 0; int unten = 0; int oben = feld.length; insertionSort(); while (unten < oben) { mitte = (unten + oben) / 2; if (feld[mitte] == a) { return feld[mitte]; } else { if (a < feld[mitte]) { oben = mitte; } else if (a > feld[mitte]) { unten = mitte; } } } return -1; }
Sieht von euch jemand den Fehler?
Gruß
Cuchulainn
-
30.12.04 23:34 #2
- Registriert seit
- Aug 2004
- Beiträge
- 96
Wenn die vars "oben" und "unten" beide 1 sind, kommt bei "mitte" immer als Ergebnis 1 heraus. Das läuft dann als Endlos-Schleife.
Als Bsp. zum Nachvollziehen nehme an, oben sei 2, unten 0, also mitte = 1.
wenn a > feld[mitte]
unten = mitte = 1; oben = 2
-> mitte = (1 + 2) / 2 = 1
jetzt ist egal was passiert, unten oder oben wird 1 sein und somit mitte immer 1 bleiben.
-
03.01.05 17:05 #3
- Registriert seit
- Oct 2004
- Ort
- Hessen
- Beiträge
- 310
Hmm, aber dann ist doch die bedingung
(while unten<oben) nicht gegeben und die schleife wird beendet werden, wenn () er im unteren teil weitersuchen würde.
nehmen wir an oben=unten=mitte.
Dann würde die schleife mit 1<1 nicht erfüllt sein und es würde -1 zurückgegeben werden, daran liegt es glaube ich net.
Es liegt wirklich nur daran, wenn er immer im oberen teil weitersucht.
Du musst den oberen teil mit oben=mitte +1 setzen, bzw. den unteren teil mit unten=mitte -1, da du das mittlere objekt ja nicht mehr in die suche einbeziehen willst, da du ja eh weisst, das es dieses objekt nicht ist. dann klappt es auch.
Weil du dann nicht in die beschriebene zwickmühle gerätst, das sich nichts ändert.Geändert von torsch2711 (03.01.05 um 17:10 Uhr)
"There's nothing we have to fear, except Fear itself....."
-
03.01.05 17:13 #4
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo!
Musst du die binäre Suche selbst implementieren oder darfs auch was standardmäßiges sein? -> java.util.Arrays.binarySearch(someType[] t, someType key);
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
03.01.05 17:14 #5
- Registriert seit
- Oct 2004
- Ort
- Hessen
- Beiträge
- 310
Oder so, hey Tom, machs doch net immer so einfach
"There's nothing we have to fear, except Fear itself....."
-
03.01.05 17:15 #6
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo!
der "OP" hat ja schließlich lang genug gezappelt
( 30.12.04, 23:34)
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
04.01.05 21:34 #7
- Registriert seit
- Sep 2003
- Ort
- Saarbrücken
- Beiträge
- 47
Hallo und danke für eure Antworten,
Das hat leider nichts geändert. Er hängt immer noch in der Schleife fest, wenn das Element nicht vorhanden ist.
Zitat von torsch2711

Ich muss sie leider selbst implementieren
Zitat von Thomas Darimont

Gruß
Cuchulainn
-
04.01.05 22:04 #8
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo!
Schau mal hier:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
/* * Created on 04.01.2005@21:48:31 * * TODO Licence info */ package de.tutorials; /** * @author Administrator * * TODO Explain what I do... */ public class BinarySort { public static void main(String[] args) { int[] array = { 12, 123, 534, 7651, 84131, 99999 }; int pos = binarySearch(array, 99); System.out.println(pos); } public static int binarySearch(int[] feld, int a) { int mitte = 0; int unten = 0; int oben = feld.length; // insertionSort(); while (unten < oben) { mitte = (unten + oben) / 2; if (feld[mitte] == a) { return feld[mitte]; } else { if (a < feld[mitte]) { oben = mitte - 1; // das Element an Stelle 'mitte' wurde // bereits geprüft -> -1 } else if (a > feld[mitte]) { unten = mitte + 1; // das Element an Stelle 'mitte' wurde // bereits geprüft -> +1 } } } return -1; } }
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
Ich hab hier noch eine kleinen Fehler entdeckt:
Wenn man nach dem ersten Arrayelement sucht liefert diese Suche -1 (also Fehler).
Dies umgeht man so:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
public static int BS(int a[], int value) { int mitte = 0; int unten = 0; int oben = a.length; while (unten <[COLOR="Red"]=[/COLOR] oben) { mitte = (unten + oben) / 2; if (a[mitte] == value) { return mitte; } else { if (value < a[mitte]) { oben = mitte - 1; } else if (value > a[mitte]) { unten = mitte + 1; } } } return -1; }
Das <= ermöglicht zugriff auf Element 0 im Array.
Ich weiß dieser Thread ist schon paar Jahre alt, aber ich fand dies wichtig - hoffe dies ist in Ordnung.
Gruß
_Dome_Geändert von _Dome_ (14.07.08 um 23:10 Uhr)
Ähnliche Themen
-
Binäre Suche mit Zahlenblöcke
Von oliolioli im Forum C/C++Antworten: 3Letzter Beitrag: 10.02.10, 09:35 -
Binäre Suche Java
Von Saban im Forum JavaAntworten: 13Letzter Beitrag: 25.02.09, 15:59 -
Berechnung der Mitte der Liste für binäre Suche schlägt fehl
Von xbugsx im Forum C/C++Antworten: 0Letzter Beitrag: 20.11.07, 03:29 -
binäre Suche
Von djroque im Forum JavaAntworten: 4Letzter Beitrag: 15.01.05, 16:06 -
Binäre suche
Von kle-ben im Forum Visual Basic 6.0Antworten: 9Letzter Beitrag: 22.12.04, 08:08





Zitieren

Login





