![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
#13
|
||||
|
||||
|
Cita:
Lo que no te perdono es que por culpa de tu mensaje me has obligado a mirar el código fuente cuando yo realmente no tenía ganas. Esta me la apunto ![]() ![]() ![]() Ahora en serio, esta es la declaración de la clase Código:
THashedStringList = class(TStringList)
private
FValueHash: TStringHash;
FNameHash: TStringHash;
FValueHashValid: Boolean;
FNameHashValid: Boolean;
procedure UpdateValueHash;
procedure UpdateNameHash;
protected
procedure Changed; override;
public
destructor Destroy; override;
function IndexOf(const S: string): Integer; override;
function IndexOfName(const Name: string): Integer; override;
end;
Código:
function THashedStringList.IndexOf(const S: string): Integer;
begin
UpdateValueHash;
if not CaseSensitive then
Result := FValueHash.ValueOf(AnsiUpperCase(S))
else
Result := FValueHash.ValueOf(S);
end;
Ahora la cuestión es qué hace realmente la clase TStringHash. Realmente lo único que hace es la típica estructura de Hash, es decir una tabla estática de N posiciones. La ubicación de cada elemento se decide aplicandole una función de Hash. Las colisiones se gestionan del siguiente modo. Cada item de la tabla es un apuntador a una variable de tipo PPHashItem: Código:
PPHashItem = ^PHashItem;
PHashItem = ^THashItem;
THashItem = record
Next: PHashItem;
Key: string;
Value: Integer;
end;
) las búsquedas serán O(1) (dado que la inserción será O(1) y la búsqueda O(1). Como vemos es una solución un poco híbrida y chapuzilla pero que yo considero totalmente válida en lo que respecta a la eficiencia. Saludos! |
|
|
|