Re: Auf einen standartisierten Wert aufrunden
2. Mär 2006, 19:35
Ja, erkläre ich gern.
Zuvor aber noch ein Hinweis:
Die Funktion FindValue ist eigentlich konzipiert zum Auffinden von Daten in
größeren Datenbeständen. Stelle Dir vor, Du hättest eine Datei mit sagen wir
2 Milliarden Einträgen und suchst einen bestimmten Eintrag.
Mit einer sequentiellen Suche müßtest Du dann im worst case 2 Milliarden Einträge
prüfen, was eine gewisse Zeit in Anspruch nimmt. FindValue würde maximal
31 Zugriffe brauchen um einen Datensatz zu finden, oder festzustellen, daß der gesuchte
Datensatz nicht existiert.
Voraussetzung für den Einsatz dieser Methode ist, daß die Daten aufsteigend sortiert
sind.
Für kleinere Datenmengen ist eine sequentielle Suche schneller, andererseits spielt dann
das Zeitverhalten keine Rolle.
Wie funktioniert das? :
Am Anfang der Routine wird first auf den ersten und last auf den letzten Eintrag
des Arrays gestellt. Irgendwo im Bereich first..last liegt der gesuchte Eintrag
(es sei denn er existiert nicht).
Dann beginnt in der repeat until Schleife die Suche:
actual wird in die Mitte zwischen first und last gestellt und result erhält den
an dieser Stelle liegenden Wert.
Wenn dieser Wert kleiner ist, als der gesuchte Wert, dann liegt der gesuchte Wert
offensichlich "hinter" actual, also wird first auf actual+1 gestellt.
Ist dieser größer als der gesuchte Wert, dann liegt der gesuchte Wert "vor" last,
also wird last auf actual-1 gestellt.
Die dritte Möglichkeit ist, daß result=gesuchter Wert ist, dann wird die Funktion
verlassen.
Dieses Spiel wird so lange wiederholt, bis first größer ist, als last. Da der
gesuchte Wert immer "bei" oder "hinter" first, und "bei" oder "vor" last liegt,
bedeutet first>last, daß der gesuchte Eintrag nicht existiert.
Wann tritt diese Abbruchbdingung ein?:
Genau dann, wenn first=last war (dann war first=actual=last) und entweder
first auf actual+1 oder last auf actual-1 gestellt wurde.
Was gilt für den Eintrag auf den jetzt first zeigt?:
Wir wissen :
Entweder wurde first auf actual+1 gestellt, weil data[actual]<gesuchter Wert war,
dann steht first jetzt auf dem nächsthöheren Wert.
Oder last wurde auf actual-1 gestellt, weil data[actual]>gesuchter Wert war, dann
steht first jetzt ebenfalls auf dem nächsthöheren Wert.
Dieser Wert (wenn first noch in den Bereich des Arrays zeigt) wird dann in result
gestellt.
Falls Du den nicht den nächsthöheren, sondern den nächstkleineren Wert haben
möchtest, muß die letzte Zeile der Funktion heißen
if last>=Low(data) then result:=data[last];
Als letztes noch :
Wenn der gesuchte Wert kleiner ist, als der erste Eintrag im Array, dann wird der
erste Eintag im Array zurückgegeben, andererseits, wenn der gesuchte Wert größer ist,
als der letzte Eintrag im Array, dann wird der letzte Eintrag im Array zurückgegeben.
Sinnvoll wäre also, den ersten Eintrag im Array auf 0 und den letzten Eintrag
(wie von Grishnak vorgeschlagen) auf maxint (=High(integer)) zu setzen.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
|