mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-09 08:47:59 +02:00
lazutils: added TAvgLvlTree.AddAscendingSequence, optimized version of Add
git-svn-id: trunk@53909 -
This commit is contained in:
parent
c993ba74ff
commit
c0a096e832
@ -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
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user