Упорядочить элементы в наборе на основе набора правил - PullRequest
3 голосов
/ 06 августа 2011

Существует ли какой-либо специальный шаблон или алгоритм разработки для этой проблемы?

Есть несколько элементов (A1, A2, A3 ..An), и я хочу расположить их, некоторые из них связаны сдругие могут быть только до или после них.

Например, А2 можно поместить только после А4, а «An» можно поставить в конце сета.Но дело в том, что последовательность некоторых элементов может быть взаимозаменяемой, и в зависимости от последовательности некоторые элементы не должны быть в наборе.

Например, рассмотрим этот сценарий

Есть 6 элементов

А1, А3, А3, А4, А5, А6

И правила:

А1 должен быть на первом месте (всегда),

А2 может бытьпосле A4

A5 может быть в наборе, только если A3 был там до того, как он

A6 находится в конце комплекта, и это обязательный элемент, но он может быть там, только есливсе остальные действительные предметы были в наборе до этого!

Допустимые комплекты такие:

А1, А4, А3, А2, А5, А6

А1, А4,A2, A6

Неверные наборы

A4, A3, A2, A5, A6 (пропущен A1)

A1, A4, A3, A2, A5 (пропущен A6)

A1, A3, A2, A6 (A2 идет только после A4)

Примечание: я должен подтвердить ввод!и вход может иметь любой порядок!Я имею в виду, я не хочу сортировать элементы, которые я хочу проверить набор ввода от пользователя

В качестве примера, на основе моего примера выше, все приведенные ниже наборы действительны

{A1, A4, A3, A2, A5, A6}

{A1, A4, A2, A3, A5, A6}

{A1, A3, A4, A2, A5, A6}

{A1, A3, A5, A4, A2, A6}

Таким образом, пользователь может ввести любой из них в качестве ввода, и все они действительны на основе определенных условий!

Есть идеи какого-либо специального шаблона проектирования или алгоритма, который можно применить к этой проблеме?Количество предметов или правила могут измениться в будущем!

«BalusC» был удален из моего тега «Design pattern»!Но до сих пор я думаю, что лучшим способом решения этой проблемы может быть командный шаблон.Я имею в виду, что я рассматривал каждый элемент как команду от пользователя и определил процесс проверки для команды («canExecute»). Я собираюсь кодировать его в C #, и, поскольку интерфейс ICommand в .Net имеет метод «canExecute», я думаю, что я будуиспользуйте его для проверки команды на основе условия.(Метод Execute только что добавил элемент в набор результатов!) Я еще не кодировал его, поэтому не уверен, насколько сложным может быть процесс проверки.Я подумал, что, может быть, кто-то имеет представление о том, как я могу комбинировать шаблон команд и алгоритм проверки для достижения целей.

Я могу ошибаться, поэтому любая идея или предложение могут быть полезны.Благодаря.

1 Ответ

2 голосов
/ 06 августа 2011

Это должно быть решаемо с вариацией топологической сортировки .

По сути, вы строите ориентированный ациклический граф, где есть ребро от A i доA j , если A i должно предшествовать A j в результате.Затем топологическая сортировка выдаст вам действительный порядок для A.

Это не будет относиться к правилу, что некоторые элементы могут отсутствовать, но это должно быть просто наложить поверх этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...