Delphi中的THashedStringList对象

    有许多程序员都喜欢使用TStringList类作为键值存储,这是不错的用法。但是TStringList本身只是对数据线性的存储,当数据量大时,对其检索效率极为低下。Delphi在在IniFiles 单元中定义了另一个TStringList类,采用了哈希技术存储数据,它就是THashedStringList类。下面这段代码就是摘自IniFiles单元中对THashedStringList的定义。

  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;

    基本的TStringList类是使用数组以线性方式保存所有子项的,所以无论使用其IndexOf方法还是IndexOfName方法都是使用线性查找法,这种查寻方法的时间复杂度在最好情况为T(1),即第一个子项即为查询项,最坏情况为T(N),N为子项个数,即查找项为最后一项。所以,当数据量比较大时其查询是毫无效率可言的。

    THashedStringList类中添加了两个TStringHash私有成员,分别用来存放对其子项键名哈希表和键值哈希表。当调用其IndexOf方法或是IndexOfName方法时,此类会首先检查是否已经为键值或是键名创建哈希表,如果没有,则创建之,否则直接使用哈希算法时行查找。

function THashedStringList.IndexOf( const  S:  string ): Integer;
begin
  UpdateValueHash;  //创建键值哈希表
  
if  not CaseSensitive then
    Result :
=   FValueHash.ValueOf(AnsiUpperCase(S))
  
else
    Result :
=   FValueHash.ValueOf(S);
end;

function THashedStringList.IndexOfName(
const  Name:  string ): Integer;
begin
  UpdateNameHash; //创建健名哈希表
  
if  not CaseSensitive then
    Result :
=  FNameHash.ValueOf(AnsiUpperCase(Name))
  
else
    Result :
=  FNameHash.ValueOf(Name);
end;

    学过数据结构的朋友都知道,当数据量不是很大时,如几百、几千时哈希算法的优势并不是很明显,和普通的线性查找性能差不了多少,但是随着数据量在增大,其性能的提升是相当可观的。所以建议各位程序员朋友,如果需要使用TStringList存储大数据量时,请使用THashedStringList代替。

你可能感兴趣的:(数据结构,算法,String,Integer,存储,Delphi)