亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hashtrie.pas

?? 讓你知道什么是 HASH算法 ,我測試了一下,再大數據,通過HASH算法來查找,有時只要查找一次!
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
{$define debug}
unit HashTrie;

{
  Delphi implementation of HashTrie dynamic hashing method
  Full description available on www.softlab.od.ua

  Delphi 2,3,4,5
  Freware with source. 

  Copyright (c) 2000-2001, SoftLab MIL-TEC Ltd
  Web:   http://www.softcomplete.com
  Email: support@softcomplete.com

  THIS SOFTWARE AND THE ACCOMPANYING FILES ARE DISTRIBUTED 
  "AS IS" AND WITHOUT WARRANTIES AS TO PERFORMANCE OF MERCHANTABILITY OR 
  ANY OTHER WARRANTIES WHETHER EXPRESSED OR IMPLIED.
  NO WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE IS OFFERED.
  THE USER MUST ASSUME THE ENTIRE RISK OF USING THE ACCOMPANYING CODE.

  Permission is granted to anyone to use this software for any purpose,
  including commercial applications, and to alter it and redistribute it
  freely, subject to the following restrictions: 

  1. The origin of this software must not be misrepresented, you must 
     not claim that you wrote the original software. If you use this software 
     in a product, an acknowledgment in the product documentation 
     would be appreciated but is not required. 
  2. Altered source versions must be plainly marked as such, and must not be 
     misrepresented as being the original software.
  3. Original copyright may not be removed or altered from any source 
     distribution.
  4. All copyright of HashTrie dynamic hashing method belongs to Andre N Belokon, 
     SoftLab MIL-TEC Ltd.
}


interface

uses Windows, SysUtils;

const
  // DON'T CHANGE LeafSize VALUE !!! MUST BE EQ 256
  // because some code optimization used
  LeafSize = 256;
  // determines max length of the list
  // very big|small values decrease performance
  // optimum value in range 4..16
  BucketSize = 8;

type
  TLinkedItem = class
  private
    Value: DWORD;
    Data: DWORD;
    Next: TLinkedItem;
    constructor Create(FValue,FData: DWORD; FNext: TLinkedItem);
    destructor Destroy; override;
  end;

  THashTrie = class; // forward
  TTraverseProc = procedure (UserData,UserProc: Pointer;
    Value,Data: DWORD; var Done: Boolean) of object;

  TTreeItem = class
  private
    Owner: THashTrie;
    Level: integer;
    Filled: integer;
    Items: array[0..LeafSize-1] of TObject;
    constructor Create(AOwner: THashTrie);
    destructor Destroy; override;
    function ROR(Value: DWORD): DWORD;
    function RORN(Value: DWORD; Level: integer): DWORD;
    procedure AddDown(Value,Data,Hash: DWORD);
    procedure Delete(Value,Hash: DWORD);
    function Find(Value,Hash: DWORD; var Data: DWORD): Boolean;
    function Traverse(UserData,UserProc: Pointer; TraverseProc: TTraverseProc): Boolean;
  end;

  THashTrie = class
  private
    Root: TTreeItem;
  protected
    function HashValue(Value: DWORD): DWORD; virtual; abstract;
    procedure DestroyItem(var Value,Data: DWORD); virtual; abstract;
    function CompareValue(Value1,Value2: DWORD): Boolean; virtual; abstract;
    procedure AddDown(Value,Data,Hash: DWORD);
    procedure Delete(Value,Hash: DWORD);
    function Find(Value,Hash: DWORD; var Data: DWORD): Boolean;
    procedure Traverse(UserData,UserProc: Pointer; TraverseProc: TTraverseProc);
  public
    constructor Create; virtual;
    destructor Destroy; override;
  end;

  TStrHashTraverseProc = procedure (UserData: Pointer; const Value: string;
    Data: TObject; var Done: Boolean);
  TStrHashTraverseMeth = procedure (UserData: Pointer; const Value: string;
    Data: TObject; var Done: Boolean) of object;

  TStringHashTrie = class(THashTrie)
  private
    FCaseSensitive: Boolean;
    FAutoFreeObjects: Boolean;
  protected
    function HashValue(Value: DWORD): DWORD; override;
    procedure DestroyItem(var Value,Data: DWORD); override;
    function CompareValue(Value1,Value2: DWORD): Boolean; override;
    function HashStr(const S: string): DWORD;
    procedure TraverseProc(UserData,UserProc: Pointer;
      Value,Data: DWORD; var Done: Boolean);
    procedure TraverseMeth(UserData,UserProc: Pointer;
      Value,Data: DWORD; var Done: Boolean);
  public
    constructor Create; override;
    procedure Add(const S: string; Data: TObject);
    procedure Delete(const S: string);
    function Find(const S: string; var Data: TObject): Boolean;
    procedure Traverse(UserData: Pointer; UserProc: TStrHashTraverseProc); overload;
    procedure Traverse(UserData: Pointer; UserProc: TStrHashTraverseMeth); overload;
    property CaseSensitive: Boolean read FCaseSensitive write FCaseSensitive default False;
    property AutoFreeObjects: Boolean read FAutoFreeObjects write FAutoFreeObjects default False;
  end;

function CalcStrCRC32(const S: string): DWORD;
  
{$ifdef debug}
type
  TLenStat = array[1..BucketSize] of integer;

procedure Stat(ht: THashTrie; var MaxLevel, PeakCnt, FillCnt, EmptyCnt: integer;
  var LenStat: TLenStat);
{$endif}

implementation

{$ifdef debug}
procedure Stat(ht: THashTrie; var MaxLevel, PeakCnt, FillCnt, EmptyCnt: integer;
  var LenStat: TLenStat);

  procedure TreeStat(ht: TTreeItem);
  var j,i: integer;
      LinkedItem: TLinkedItem;
  begin
    Inc(PeakCnt);
    if ht.Level+1 > MaxLevel then
      MaxLevel:=ht.Level+1;
    for j:=0 to LeafSize-1 do
      if ht.Items[j] <> nil then begin
        Inc(FillCnt);
        if ht.Items[j] is TTreeItem then begin
          TreeStat(TTreeItem(ht.Items[j]));
        end else begin
          i:=0;
          LinkedItem:=TLinkedItem(ht.Items[j]);
          while LinkedItem <> nil do begin
            Inc(i);
            LinkedItem:=LinkedItem.Next;
          end;
          LenStat[i]:=LenStat[i]+1;
        end;
      end else
        Inc(EmptyCnt);
  end;
begin
  if ht.Root <> nil then
    TreeStat(ht.Root);
end;
{$endif}

{ TTreeItem }

procedure TTreeItem.AddDown(Value, Data, Hash: DWORD);
var i,j: integer;
    TreeItem: TTreeItem;
    LinkedItem: TLinkedItem;
begin
  i:=Hash and $FF;
  if Items[i] = nil then begin
    Items[i]:=TLinkedItem.Create(Value,Data,nil);
    Inc(Filled);
  end else if Items[i] is TTreeItem then begin
    TTreeItem(Items[i]).AddDown(Value,Data,ROR(Hash));
  end else begin
    j:=0;
    LinkedItem:=TLinkedItem(Items[i]);
    while LinkedItem <> nil do begin
      if Owner.CompareValue(LinkedItem.Value,Value) then begin
        // found
        LinkedItem.Data:=Data;
        Exit;
      end;
      LinkedItem:=LinkedItem.Next;
      Inc(j)
    end;
    if j >= BucketSize then begin
      // full
      TreeItem:=TTreeItem.Create(Owner);
      TreeItem.Level:=Level+1;
      LinkedItem:=TLinkedItem(Items[i]);
      while LinkedItem <> nil do begin
        TreeItem.AddDown(LinkedItem.Value, LinkedItem.Data,
                         RORN(Owner.HashValue(LinkedItem.Value), Level+1));
        LinkedItem:=LinkedItem.Next;
      end;
      TreeItem.AddDown(Value,Data,ROR(Hash));
      TLinkedItem(Items[i]).Free;
      Items[i]:=TreeItem;
    end else
      Items[i]:=TLinkedItem.Create(Value,Data,TLinkedItem(Items[i]));
  end;
end;

constructor TTreeItem.Create(AOwner: THashTrie);
var j: integer;
begin
  Owner:=AOwner;
  Level:=0;
  Filled:=0;
  for j:=0 to LeafSize-1 do Items[j]:=nil;
end;

procedure TTreeItem.Delete(Value, Hash: DWORD);
var i: integer;
    TreeItem: TTreeItem;
    PrevLinkedItem,LinkedItem: TLinkedItem;
begin
  i:=Hash and $FF;
  if Items[i] = nil then begin
    Exit;
  end else if Items[i] is TTreeItem then begin
    TTreeItem(Items[i]).Delete(Value,ROR(Hash));
    if TTreeItem(Items[i]).Filled = 0 then begin
      TTreeItem(Items[i]).Free;
      Items[i]:=nil;
    end;
  end else begin
    PrevLinkedItem:=nil;
    LinkedItem:=TLinkedItem(Items[i]);
    while LinkedItem <> nil do begin
      if Owner.CompareValue(LinkedItem.Value,Value) then begin
        // found
        if PrevLinkedItem = nil then begin
          Items[i]:=LinkedItem.Next;
          if Items[i] = nil then
            Dec(Filled);
        end else
          PrevLinkedItem.Next:=LinkedItem.Next;
        LinkedItem.Next:=nil;
        Owner.DestroyItem(LinkedItem.Value,LinkedItem.Data);
        LinkedItem.Free;
        Exit;
      end;
      PrevLinkedItem:=LinkedItem;
      LinkedItem:=LinkedItem.Next;
    end;
  end;
end;

destructor TTreeItem.Destroy;
var j: integer;
    LinkedItem: TLinkedItem;
begin
  for j:=0 to LeafSize-1 do
    if Items[j] <> nil then
      if Items[j] is TTreeItem then
        TTreeItem(Items[j]).Free
      else begin
        LinkedItem:=TLinkedItem(Items[j]);
        while LinkedItem <> nil do begin
          Owner.DestroyItem(LinkedItem.Value,LinkedItem.Data);
          LinkedItem:=LinkedItem.Next;
        end;
        TLinkedItem(Items[j]).Free;
      end;
  inherited;
end;

function TTreeItem.Find(Value, Hash: DWORD; var Data: DWORD): Boolean;
var i: integer;
    TreeItem: TTreeItem;
    LinkedItem: TLinkedItem;
begin
  Result:=False;
  i:=Hash and $FF;
  if Items[i] = nil then begin
    Exit;
  end else if Items[i] is TTreeItem then begin
    Result:=TTreeItem(Items[i]).Find(Value,ROR(Hash),Data);
  end else begin
    LinkedItem:=TLinkedItem(Items[i]);
    while LinkedItem <> nil do begin
      if Owner.CompareValue(LinkedItem.Value,Value) then begin
        // found
        Data:=LinkedItem.Data;
        Result:=True;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜桃一区二区三区在线| 色综合久久中文字幕| 风间由美性色一区二区三区| 色域天天综合网| 欧美精品一区男女天堂| 亚洲精品亚洲人成人网 | 午夜av一区二区| 国产成人午夜99999| 欧美日韩小视频| 国产精品久久久久久户外露出| 日韩二区在线观看| 91色九色蝌蚪| 国产精品乱码久久久久久| 人人超碰91尤物精品国产| 99这里都是精品| 亚洲你懂的在线视频| 免费人成黄页网站在线一区二区| 91麻豆国产精品久久| 久久九九99视频| 国精产品一区一区三区mba视频| 欧洲av一区二区嗯嗯嗯啊| 国产精品亲子伦对白| 久久99久久精品欧美| 欧美日韩精品一区二区三区| 1024精品合集| 97se亚洲国产综合自在线| 精品成人佐山爱一区二区| 日韩av电影免费观看高清完整版| 在线精品视频免费播放| 中文字幕亚洲综合久久菠萝蜜| 经典三级视频一区| 欧美变态tickle挠乳网站| 日本vs亚洲vs韩国一区三区| 欧美高清精品3d| 亚洲国产美国国产综合一区二区| 91免费版在线看| 亚洲欧洲国产日本综合| eeuss国产一区二区三区| 国产农村妇女精品| 成人教育av在线| 亚洲私人黄色宅男| 97se亚洲国产综合自在线不卡| 亚洲天天做日日做天天谢日日欢| 成人毛片在线观看| 中文字幕一区视频| 色噜噜狠狠成人中文综合| 亚洲人精品午夜| 欧美视频完全免费看| 亚洲国产视频在线| 欧美一区二区在线不卡| 99国产一区二区三精品乱码| 国产欧美一区二区三区在线老狼| 国产·精品毛片| 亚洲伦理在线精品| 欧美日韩一卡二卡三卡| 男人的j进女人的j一区| 久久综合一区二区| 99久久久无码国产精品| 天堂在线亚洲视频| 日韩精品专区在线影院重磅| 久草精品在线观看| 国产精品麻豆久久久| 在线视频国产一区| 麻豆一区二区三区| 国产精品久久久久久久久图文区| 欧美影院一区二区| 久久se精品一区精品二区| 国产欧美视频在线观看| 在线观看一区二区精品视频| 麻豆一区二区三| 国产精品毛片久久久久久久 | 青青草91视频| 国产精品天天看| 欧美午夜片在线观看| 国产一区不卡精品| 亚洲精品精品亚洲| 精品福利一二区| 欧美性生活大片视频| 激情文学综合网| 一片黄亚洲嫩模| 国产亚洲视频系列| 欧美日本在线观看| 99这里都是精品| 欧美性淫爽ww久久久久无| 激情小说欧美图片| 亚洲午夜免费电影| 国产精品黄色在线观看| 91精品免费在线观看| yourporn久久国产精品| 久久精品国产免费| 香港成人在线视频| 亚洲欧洲综合另类| 国产欧美va欧美不卡在线| 日韩限制级电影在线观看| 色悠悠久久综合| 粉嫩av一区二区三区在线播放| 免费人成黄页网站在线一区二区 | 99re这里只有精品首页| 蜜臀av在线播放一区二区三区| 色悠悠久久综合| 精品捆绑美女sm三区| 欧美亚洲国产一区在线观看网站| 国产乱码精品一区二区三区忘忧草| 亚洲综合一区二区| 国产精品美女一区二区三区| 久久久久久久久久久久久女国产乱 | 久久综合综合久久综合| 亚洲午夜日本在线观看| 亚洲欧美一区二区久久| 中文字幕av一区二区三区高 | 国产精品乱子久久久久| 精品国免费一区二区三区| 制服丝袜av成人在线看| 欧美亚男人的天堂| 欧美视频一区二| 欧美午夜一区二区三区 | 亚洲色图20p| 中文字幕五月欧美| 中文字幕亚洲精品在线观看| 中文字幕永久在线不卡| 国产精品麻豆欧美日韩ww| 国产精品入口麻豆九色| 欧美国产欧美综合| 中文字幕成人网| 亚洲日本电影在线| 亚洲一区免费观看| 午夜精品久久久久久久99樱桃 | 欧美日韩一区二区在线观看| 日韩精品在线网站| 日韩一级黄色片| 亚洲精品一区二区三区四区高清| www国产成人免费观看视频 深夜成人网| 欧美一区日韩一区| 精品国产区一区| 国产欧美精品国产国产专区| 亚洲色图在线播放| 久久网站热最新地址| 国产女人18毛片水真多成人如厕| 国产精品你懂的在线| 亚洲欧美电影院| 日一区二区三区| 国产一区二区在线观看视频| 粉嫩13p一区二区三区| 91香蕉视频mp4| 欧美老女人在线| 国产亚洲婷婷免费| 一区二区三区欧美日| 免费人成精品欧美精品| 国产99久久精品| 欧美综合天天夜夜久久| 日韩一级二级三级| 国产精品久久久久久久蜜臀 | 美女视频一区二区| 国产精品综合一区二区三区| 99久久er热在这里只有精品15| 欧美中文字幕亚洲一区二区va在线| 制服丝袜亚洲色图| 国产精品日产欧美久久久久| 一区二区三区免费观看| 老司机午夜精品99久久| 91色porny在线视频| 精品国产髙清在线看国产毛片| 亚洲色图色小说| 国产自产视频一区二区三区| k8久久久一区二区三区| 在线不卡的av| 中文字幕一区二区不卡| 麻豆国产欧美日韩综合精品二区| gogogo免费视频观看亚洲一| 日韩一区二区视频| 亚洲美女视频在线| 国产精品资源网站| 在线播放亚洲一区| 蜜桃av噜噜一区| 欧美性猛交xxxxxxxx| 欧美激情在线看| 久久精品999| 欧美日韩电影在线| 中文字幕一区二区三区不卡在线 | 麻豆一区二区三区| 精品视频免费在线| 国产精品久久网站| 国产一区二区三区免费看 | 三级欧美在线一区| 91久久香蕉国产日韩欧美9色| 国产性天天综合网| 激情五月婷婷综合| 欧美大胆一级视频| 奇米一区二区三区| 欧美亚洲国产bt| 自拍偷拍国产亚洲| 不卡区在线中文字幕| 国产欧美一区二区精品忘忧草| 免费在线观看不卡| 717成人午夜免费福利电影| 亚洲一区二区三区视频在线| 91免费国产视频网站| 亚洲国产电影在线观看| 国产成人在线免费观看| 国产亚洲欧美日韩俺去了|