Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #2  
Antiguo 10-09-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Memoria en Delphi Mauro Daniel Varios 6 01-04-2008 15:04:57
problema de memoria? anubis Varios 4 21-02-2008 12:11:59
Consulta para encontrar el valor más cercano Faust SQL 1 01-08-2007 05:15:58
Memoria Gandazgul Varios 2 08-05-2004 01:02:37
Memoria susje Varios 18 23-07-2003 00:07:10


La franja horaria es GMT +2. Ahora son las 01:06:43.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi