程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> Delphi中的THashedStringList對象

Delphi中的THashedStringList對象

編輯:.NET實例教程
有許多程序員都喜歡使用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代替。



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved