Ver Mensaje Individual
  #2  
Antiguo 10-09-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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;

{ Llenar el arreglo }
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;

{ Mostrar en Memo }
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;

{ Busqueda binaria }
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); // Valor a buscar
  ShowMessage(Format('Index: %d Valor: %d',[Inx,Vec[Inx].TimeOffset]));
end;
...

Saludos.

Última edición por ecfisa fecha: 10-09-2010 a las 01:19:17.
Responder Con Cita