Hola Jorge.
Cita:
|
El dato a buscar pej. es 5300, tengo que encontrar la clave 4447, (x > elemento 2 y x < elemento 3) se entiende?
|
En base a lo que escribiste, el valor que debe obtenerse, es el próximo menor, a la clave a buscar.
Suponiendo que la clave a buscar 'TimeOffset' esté ordenada, para buscar utilizaría una busqueda por dicotomía binaria que es la más rápida, siendo su número de comparaciones de Log2(N). (aprox. 20 comparaciones para 1000000 de elementos). Por último, para simplificar el uso y almacenamiento de los valores; un arreglo dinámico.
Te hice un ejemplo simple, muestra también los valores generados en un memo para que puedas verificarlo.
Código Delphi
[-]
...
type
Registro = record
TimeOffset: LongWord;
PrevTimeOffset: LongWord;
PositionTimeOffset: LongWord;
end;
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
Vec: array of Registro;
procedure MostrarArreglo;
function BuscarDB(Valor: LongWord): LongWord;
public
end;
var
Form1: TForm1;
implementation {$R *.dfm}
const
MAX = 100;
procedure TForm1.FormCreate(Sender: TObject);
var
i,c: integer;
begin
SetLength(Vec, MAX);
c:= 0;
for i:= Low(Vec) to High(Vec) do
begin
Vec[i].TimeOffset:= c;
Vec[i].PrevTimeOffset:= c+50;
Vec[i].PositionTimeOffset:= i;
Inc(c,100);
end;
end;
procedure TForm1.MostrarArreglo;
var
i: Integer;
begin
Memo1.Clear;
for i:= Low(Vec) to High(Vec) do
Memo1.Lines.Add(Format('%4d %4d %4d',
[Vec[i].PositionTimeOffset, Vec[i].TimeOffset, Vec[i].PrevTimeOffset]));
end;
function TForm1.BuscarDB(Valor: LongWord): LongWord;
var
Pri, Ult, Med : LongWord;
Esta : boolean;
begin
Pri := Low(Vec);
Ult := High(Vec);
Esta := False;
while (Pri <= Ult) and not Esta do
begin
Med := (Pri + Ult) Div 2;
if Vec[Med].TimeOffset = Valor then Esta := true;
if Vec[Med].TimeOffset < Valor then Pri:= Med + 1;
if Vec[Med].TimeOffset > Valor then Ult:= Med - 1;
end;
if Esta then
Result:= Med
else
Result:= Ult;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Inx: LongWord;
begin
MostrarArreglo;
Inx:= BuscarDB(1397); ShowMessage(Format('Index: %d Valor: %d',[Inx,Vec[Inx].TimeOffset]));
end;
...
Saludos.
