Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - bestimmte Werte in Array finden


daywalker0086 - Fr 24.02.12 08:45
Titel: bestimmte Werte in Array finden
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 - 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;  // 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:


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


Xion - 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.

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.


Gammatester - Fr 24.02.12 12:25

:?: Sinnvollerweise sollte doch die Funktion BinSearch die gefundene Position und nicht den Such-Key zurückliefern!


Xion - Fr 24.02.12 14:45

:shock: das stimmt allerdings. Das ist der Copy&Paste Schutz :P