Autor |
Beitrag |
daywalker0086
      
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Fr 24.02.12 08:45
Hallo Leute,
ich programmiere mal wieder ein wenig und hab nun folgendes Problem wo ich gern eine Meinung hätte wie man sowas macht:
Ich habe ein Array mit X-Werte und zugehörigen Y-Werten.
Wichtig sind hier die X-Werte. Bsp: 10 20 30.
Nun habe ich aus einer anderen Routine einen X-Wert welcher zwischen 10 und 20 liegt.
Nun soll das Array nach den nächstkleineren Wert durchsucht werden und für diesen nächstkleineren x-Wert der zugehörige Y-Wert zurückgegeben werden.
Wie sucht man den jetzt am besten aus dem Array raus?
LG Chris Moderiert von Narses: Topic aus Dateizugriff verschoben am Fr 24.02.2012 um 09:45
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Fr 24.02.12 11:16
eine Möglichkeit:
Annahme:
Array
x y
----
2 2
7 3
4 6
3 8
1 3
....
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| function gibWert(xStart: integer) : integer var lTmpWert, lIndex, i : integer begin lTmpWert := 0; lIndex := -1; for i := 0 to length(array)-1 do begin if (array[i].wert < xStart) and (array[i].wert > ltmpWert) then begin lTmpWert := Array[i].wert; lIndex := i; end; end; if (lIndex > -1) then Result := Array[i, 0].Wert; end; |
Ist das Array immer aufsteigend sortiert, dann würde ja reichen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| for i := 0 to length(array) do begin Result := 0; if (array[i].wert = xStart) then begin if (i > 0) then Result := xArray[i-1].Wert; end; end; |
ungetestet einfach runtergeschrieben, keine Gewähr 
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Fr 24.02.12 12:07
zuma hat folgendes geschrieben : | Ist das Array immer aufsteigend sortiert, dann würde ja reichen |
In diesem Fall würde man wohl binäre Suche nehmen (da sehr schnell):
Array = [1,2,4,5,8,9,12]
Suche nach: 8
Array = [1,2,4, 5,8,9,12]
5<8 => rechte Seite angucken
Array = [ 1,2,4,5,8, 9,12]
9>8 => linke Seite angucken
Array = [ 1,2,4,5, 8, 9,12]
Gefunden
Falls 8 nicht drin ist, dann nimmst du jetzt einfach den gefundenen Wert oder den Nachbarn davon, das sind die am nähsten am gesuchten Wert.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| function BinSearch( A: array of integer; Left: integer; Right: integer; Key: integer): integer; var mid: integer; begin Mid:= Left + ((Right-Left) div 2); if (A[Mid]=Key)or(Left>=Right) then Result:=Key else if A[Mid]<Key then Result:=BinSearch(A,Mid+1,Right) else if A[Mid]>Key then Result:=BinSearch(A,Left,Mid-1); end;
function NextSmaller( A: array of integer; Key: integer): integer; var Pos: integer; begin Pos:=BinSearch(A,0,High(A),Key); while (Pos>0)and(A[Pos]>Key) do Pos:=Pos-1;
if A[Pos]>Key then Result:=-1 else Result:=Pos; end; |
ungetestet.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Gammatester
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: Fr 24.02.12 12:25
 Sinnvollerweise sollte doch die Funktion BinSearch die gefundene Position und nicht den Such-Key zurückliefern!
Für diesen Beitrag haben gedankt: Xion
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Fr 24.02.12 14:45
 das stimmt allerdings. Das ist der Copy&Paste Schutz 
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
|