VirtualTreeview: когда сортировать детей?

Я полагаюсь на VirtualTreeView, чтобы отображать тысячи элементов, которые должны периодически меняться, и когда это происходит, дерево очищается и заполняется снова.

Сортировка производится автоматически (toAutoSort установлен флаг), но это имеет нежелательный эффект рекурсивной инициализации всех узлов, и это очень дорогая операция, как вы можете себе представить.

Итак, когда я должен позвонить .Sort метод, когда toAutoSort выключен? (DoInitChildren выглядело правдоподобно, но я иногда получал странные результаты, например, обратные результаты, поэтому я полагаю, что сортировка детей не годится.)

2 ответа

Общее правило в этом сценарии - сортировка после добавления всех новых элементов. Таким образом, вы сортируете (и инициализируете) только один раз.

Если все дерево не будет полностью отличаться каждый раз, вы можете получить лучшую производительность, не очищая дерево, а создавая отдельно новый список элементов (просто идентифицируя элементы), сортируя этот список, а затем обходя оба дерева по порядку. Общий алгоритм выглядит примерно так (левый список - это "новый список", а правый список - "существующий список"):

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. В дереве, когда вы подходите, вы запускаете аналогичную процедуру для детей. Эта концепция основана на том факте, что элементы в существующем списке не будут сильно меняться или могут стоить полной загрузки.

Другие вопросы по тегам