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

  • Автор темы Azrael
  • Дата начала
A

Azrael

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

Azrael

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

Код:
 ...
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 ....