Поиск в неупорядоченном списке потомков - PullRequest
2 голосов
/ 23 ноября 2010

В моем приложении базы данных Delphi 2007 у меня есть список поколений.Каждое поколение имеет список шаблонов ценообразования, каждый из которых представляет собой набор значений.В приложении пользователь может создать позицию и назначить шаблон ценообразования из любого поколения.Новое поколение создается путем клонирования существующего поколения.Таким образом, пользователю нужно только создать первое поколение, затем клонировать его и изменить только необходимые значения шаблонов цен в новом поколении.Эти поколения (и шаблоны ценообразования) связаны посредством originids.ie, originid Generation1 будет равен нулю, а generation2 будет иметь originid, указывающий на идентификатор generation1 'и т. Д. Кроме того, пользователь может создать новое поколение из любого из существующих .ie, generation3'sпроисхождение может быть поколение1.Теперь пользователь хочет обновить функциональность, где пользователь может обновить шаблоны ценообразования от поколения к любому другому поколению, если они «связаны».т. е. если они связаны по идентификаторам источника (необязательно прямым подключением .ie), если идентификатор источника исходного поколения указывает непосредственно на идентификатор цели или любого из прямых потомков цели или любого из потомков потомков цели..так далее).Пожалуйста, смотрите описание ниже.

Каков наилучший способ поиска (алгоритм / структура данных) цели из источника в этом случае?

Спасибо всем заранее,
Pradeep


GenerationName --Id - OriginID

Поколение 1 - 100-- 0
Поколение2 - 101 - 100 (клонировано из 1)
поколение 3 - 102 - 100 (клонировано из 1)
поколение 4 - 103 - 102 (клонировано из 3)
поколение 5 --104 - 101 (клонировано из 2)

Здесь пользователь может выполнить обновление с поколения 1 до поколения 3 (поколение 1  поколение 3 ) или поколения 4 (поколение 1 ene поколение 3  поколение 4) илиПоколение 5 ((Поколение 1 - Поколение 2 - Поколение 5), потому что они связаны. Но Поколение 3 - поколение 5 не допускается, потому что между ними нет связи.

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

На мой взгляд, использование tree data structure - лучший способ решения подобных проблем.

Приходя в Delphi IDE, вы можете использовать для этой цели компонент TTreeView.

Поместитеданные в древовидной структуре с использованием компонента TTreeView. Нажмите здесь для ознакомления с учебниками по TTreeView.

Для поиска в TTreeView вы переходите по этой ссылке .

0 голосов
/ 23 ноября 2010

Чтобы определить, можно ли обновить поколение до другого, я бы использовал функцию, подобную этой.Здесь gen - это структура, в которую вы загрузили свои поколения и можете искать их по Id.

function canUpgrade(fromId, toId: integer) : boolean;
var
  id : integer;
begin
  Result := false;
  id := toId;
  while id<>0 do
  begin
    if gen[id].originId=fromId then
    begin
      Result := true;
      Break;
    end
    else
    begin
      id := gen[id].originId;
    end;
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...