ツリー全体が毎回完全に異なる場合を除き、ツリーをクリアするのではなく、アイテムの新しいリストを個別に作成し (アイテムの識別のみ)、そのリストを並べ替えてから、両方のツリーを順番にたどることで、パフォーマンスを向上させることができます。 . 一般的なアルゴリズムは次のようになります (左側のリストは「新しいリスト」で、右側のリストは「既存のリスト」です)。
LeftCur := 0;
RightCur := 0;
while (LeftCur < TotalLeft) and (RightCur < TotalRight) then
begin
if LeftList[LeftCur] = RightList[RightCur] then
begin
// matches, so just advance
Inc(LeftCur);
Inc(RightCur);
end
else if LeftList[LeftCur] < RightList[RightCur] then
begin
// insert happens BEFORE RightCur
InsertLeftItemToRight;
Inc(RightCur);
Inc(TotalRight);
end
else if LeftList[LeftCur] > RightList[RightCur] then
begin
DeleteRightItem;
Dec(TotalRight);
end;
end;
While RightCur < TotalRight do
begin
DeleteRightItem;
Dec(TotalRight);
end;
While LeftCur < TotalLeft do
AppendLeftItemToRight;
このようにして、リストはソートされたままになり、InsertLeftItemToRight ステップでアイテムのロードを完了するだけで済みます。ツリーでは、一致するたびに、子に対して同様のルーチンを実行します。この概念は、既存のリスト内のアイテムがあまり変更されない、または完全にロードするのに費用がかかる可能性があるという事実に対して重み付けされています。