BinarySearch langsamer als LinearSearch? kann nicht sein

borgetas

Mitglied
Hallo,

ich muss die Methoden binarySearch und linearSearch für Arrays implementieren. Das habe ich so gemacht:

Java:
public static int linearSearch(Produkt key) { //Produkt ist eine selbst erstellte Klasse
		Produkt[] a = null;
		if (sarray == null) {
			a = benchmark(); //benchmark erstellt ein Array, falls kein von binarySearch erstellt wurde
			sarray = a;
		} else {
			a = sarray;
		}
		for (int i = 0; i < a.length; i++) {
			if (key.equal(a[i])) //equal vergleicht Elemente der Klasse Produkt
				return i;

		}
		return -1;//falls nicht vorhanden
	}

	public static int binarySearch(Sortable key) {
		Sortable[] a = null;
		if (sarray == null) {
			a = benchmark(); //benchmark erstellt ein Array, falls kein von linear Search erstellt wurde
			sarray = a;
		} else {
			a = sarray;
	
		}	
		quickSort(a); //array sortieren
		int first = 0;
		int upto = a.length;
		while (first < upto) {
			int mid = (first + upto) / 2;
			if (key.less(a[mid])) {
				upto = mid;
			} else if (key.greater(a[mid])) { //greater vergleicht Elemente der Klasse Produkt
				first = mid + 1;
			} else {
				return mid;
			}
		}
		return -1;
	}

Jetzt wenn ich für den gleichen Elementen mit beiden Suchoptionen suche, und die Zeit vergleiche ist linearSearch deutlich schneller. Wie kann das sein? BinarySearch sollte doch viel effizienter sein.

Danke im vorraus
 

XHelp

Top Contributor
Wie sieht denn deine Zeitmessung dazu aus? Auf welcher größe probierst du es? Und in den Methoden passiert vieles, was da überhaupt nicht reingehört: erstellen eines Arrays, sortieren eines Arrays etc, das verfälscht natürlich die Zeitmessung.
 

borgetas

Mitglied
Mit System.currentTimeMillis(); messe ich die Zeit bevor ich die Methode aufrufe, dann danach, und die Rechenzeit ist dann die Differenz der beiden.
Natürlich probiere ich für ganz viele Suchvorgange, ich suche für 2000 Elemente, nur danach gebe ich die Zeit aus.
 

Marco13

Top Contributor
Ja, diese "vielen Durchläufe" sind wichtig, und besonders beim Suchen auch, dass nach vielen verschiedenen Elementen gesucht wird (besonders deutlich wird's eben, wenn man z.B. immer nach dem ersten oder letzten Element sucht). System.nanoTime() könnte noch etwas genauer sein, aber darauf sollte es nicht ankommen....
 

Ähnliche Java Themen


Oben