lazutils: added TAvgLvlTree.AddAscendingSequence, optimized version of Add

git-svn-id: trunk@53909 -
This commit is contained in:
mattias 2017-01-10 12:37:33 +00:00
parent c993ba74ff
commit c0a096e832
2 changed files with 62 additions and 0 deletions

View File

@ -102,6 +102,8 @@ type
// add, delete, remove, move
procedure Add(ANode: TAvgLvlTreeNode);
function Add(Data: Pointer): TAvgLvlTreeNode;
function AddAscendingSequence(Data: Pointer; LastAdded: TAvgLvlTreeNode;
var Successor: TAvgLvlTreeNode): TAvgLvlTreeNode;
procedure Delete(ANode: TAvgLvlTreeNode);
function Remove(Data: Pointer): boolean;
function RemovePointer(Data: Pointer): boolean;
@ -852,6 +854,55 @@ begin
Add(Result);
end;
function TAvgLvlTree.AddAscendingSequence(Data: Pointer;
LastAdded: TAvgLvlTreeNode; var Successor: TAvgLvlTreeNode): TAvgLvlTreeNode;
{ This is an optimized version of "Add" for adding an ascending sequence of
nodes.
It uses the LastAdded and Successor to skip searching for an insert position.
For nodes with same value the order of the sequence is kept.
Usage:
LastNode:=nil; // TAvgLvlTreeNode
Successor:=nil; // TAvgLvlTreeNode
for i:=1 to 1000 do
LastNode:=Tree.AddAscendingSequence(TItem.Create(i),LastNode,Successor);
}
var InsertPos: TAvgLvlTreeNode;
InsertComp: integer;
begin
Result:=NodeClass.Create;
Result.Data:=Data;
inc(FCount);
if (LastAdded<>nil) and (Compare(LastAdded.Data,Data)<=0)
and ((Successor=nil) or (Compare(Data,Successor.Data)<=0)) then begin
// Data is between LastAdded and Successor -> insert here
Result.Parent:=LastAdded;
LastAdded.Right:=Result;
NodeAdded(Result);
BalanceAfterInsert(Result);
end else if fRoot<>nil then begin
// find an insert position
InsertPos:=FindInsertPos(Data);
InsertComp:=Compare(Data,InsertPos.Data);
Result.Parent:=InsertPos;
if InsertComp<0 then begin
// insert to the left
InsertPos.Left:=Result;
end else begin
// insert to the right
InsertPos.Right:=Result;
end;
NodeAdded(Result);
BalanceAfterInsert(Result);
Successor:=Result.Successor;
end else begin
// first node
fRoot:=Result;
Successor:=nil;
NodeAdded(Result);
end;
end;
procedure TAvgLvlTree.Add(ANode: TAvgLvlTreeNode);
// add a node. If there are already nodes with the same value it will be
// inserted rightmost

View File

@ -990,6 +990,17 @@
</element>
<element name="TAvgLvlTree.GetEnumerator"><short>The default enumerator over the nodes from left to right, low to high</short>
</element>
<element name="TAvgLvlTree.AddAscendingSequence"><short>Fast Add for adding a sequence of items.</short><descr> This is an optimized version of "Add" for adding an ascending sequence of nodes.
It uses the LastAdded and Successor to skip searching for an insert position.
For nodes with same value the order of the sequence is kept.
Usage:
LastNode:=nil; // TAvgLvlTreeNode
Successor:=nil; // TAvgLvlTreeNode
for i:=1 to 1000 do
LastNode:=Tree.AddAscendingSequence(TItem.Create(i),LastNode,Successor);
</descr>
</element>
</module>
<!-- AvgLvlTree -->
</package>