Оптимизация алгоритма

Тема в разделе "Свободное общение", создана пользователем Azrael, 12 июл 2008.

  1. Azrael

    Azrael Гость

    Собственно вопрос по сабжу, как быстрее построить корни дерева. Смысл такой, есть датасет с данными, целиком строить дерево очень долго получается, поэтому узлы строятся "по требованию", соответственно отфильтровать датасет по parent_node_id и построить ветку проблем нет. а вот с корнями так красиво не получается, т.к. единого корня нет, в датасете данные могут фильтроваться и parent_node_id тоже не будет одинаковым.
    Сейчас делаю следующим образом: создаю временный датасет, имеющий индекс по id и перегоняю все данные в него из исходного датасета, в цикле прохожу по всем его записям, и лукаплю parent_node_id = current_node_id, если ничего не найдено, тогда в итоговый датасет (содержащий узлы дерева), добавляю запись. Может есть способ оптимальнее? Как-то удалять из временного датасета строки, которые точно не надо добавлять, чтобы далее по ним не проходить...
     
  2. Azrael

    Azrael Гость

    данные берутся из бд, структура вида <id, parent_id, ...> в разных местах или пользователю предоставляется возможность фильтровать данные, либо данные фильтруются программно, например, ограничения прав доступа, объединение запросов и т.д. в связи с чем совсем не обязательно, что корни будут иметь одинаковый parent_id или null.

    Код (Text):
     ...
    LookupMemTable := TMemTableEh.Create(self);
    LookupMemTable.IndexDefs.Add('PK', stKeyField, [ixPrimary]);

    if isRoot then
    begin
    Result := true;
    i := LookupMemTable.LoadFromDataSet(Source, -1, lmCopy, true);
    if i > 0 then
    begin
    try
    LookupMemTable.First;
    while not(LookupMemTable.Eof) do
    begin
    searchResult := LookupMemTable.Lookup(stKeyField,
    LookupMemTable.FieldByName(stParentField).AsVariant, stKeyField);
    if ((VarType(searchResult) in [varNull]) or (VarType(searchResult) in [varEmpty]))then
    begin
    Dest.LoadFromDataSet(LookupMemTable, 1, loadMode, false);
    Result := true;
    end;
    if (loadMode = lmCopy) then loadMode := lmAppend;
    LookupMemTable.Next;
    end;
    except
    raise;
    end;
    end;
    end
    else ....
     
Загрузка...

Поделиться этой страницей