Cita:
|
Empezado por cHackAll
Esa idea esta super, lastimosamente debes llamar a un procedimiento de ordenamiento, un QuickSort pues la VCL no ordena por Objects , pero con eso ya estaríamos... la busqueda se vuelve más eficiente.
|
Creo que no me expliqué bien. Se trata de usar el
ID para ordenar en la segunda lista (ID como String) y usar así búsqueda dicotómica/binaria sobre la segunda lista (auxiliar) y cada ID de la segunda lista apunta a la posición correspondiente de la primera "
Buscar_ datos_ con_ listas_ ordenadas.zip"
He usado 25000 líneas para maximizar los resultados y he realizado las búsquedas utilizando las dos formas; La inicial (secuencial) y usando dos listas para obtener búsqueda dicotómica.
Sorpredentemente al buscar un único elemento, casi no se aprecia, lo que significa que la secuencial se hace más rápido de lo que yo pensaba; Ahora, si el proceso se maximiza (por ejemplo haciendo 1000 búsquedas seguidas) la diferencia es apreciable (más que apreciable).
Revisad el código si queréis, veréis que la diferencia para usar la lista auxiliar son unas pocas líneas.
La diferencia está en usar:
Código Delphi
[-]
if (j > 0) then begin
ListBox1.Items.Add(ADOTable1.FieldByName('Nombre').AsString + ' - ' +
ADOTable1.FieldByName('Direccion').AsString + ' - ' +
IntToStr(j));
ListBox1.Items.Objects[i] := pointer(j);
end;
o esto:
Código Delphi
[-]
if (j > 0) then begin
Index := ListBox1.Items.Add(ADOTable1.FieldByName('Nombre').AsString + ' - ' +
ADOTable1.FieldByName('Direccion').AsString + ' - ' +
IntToStr(j));
ListBox1.Items.Objects[i] := pointer(j);
Index2 := _ListID.Add(IntToStr(j ));
_ListID.Objects[Index2] := Pointer(Index);
end;
Link al ejemplo.