Autor Beitrag
daywalker0086
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: 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 user profile iconNarses: Topic aus Dateizugriff verschoben am Fr 24.02.2012 um 09:45
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Fr 24.02.12 11:16 
eine Möglichkeit:

Annahme:
Array
x y
----
2 2
7 3
4 6
3 8
1 3
....


ausblenden 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;  // init mit Wert kleiner dem kleinstem Wert im Array
 lIndex := -1;   // default = kein Treffer  
 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 > -1then
  Result := Array[i, 0].Wert;
end;


Ist das Array immer aufsteigend sortiert, dann würde ja reichen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
for i := 0 to length(arraydo
begin
 Result := 0;
 if (array[i].wert = xStart) then
 begin
  if (i > 0then
   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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: Fr 24.02.12 12:07 
user profile iconzuma hat folgendes geschrieben Zum zitierten Posting springen:
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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: Fr 24.02.12 14:45 
:shock: das stimmt allerdings. Das ist der Copy&Paste Schutz :P

_________________
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)