Если бы элементы не могли иметь связанные приоритеты, это было бы тривиально. Просто сортировка по приоритету. Но у вас могут быть равные приоритеты.
Сначала я бы отсортировал алфавит по приоритету. Тогда я бы извлек самую длинную восходящую подпоследовательность. Это начало вашего ответа. Извлеките самую длинную восходящую последовательность из того, что осталось. Добавьте это к вашему ответу. Повторяйте процесс извлечения, пока не будет извлечен весь алфавит.
Я считаю, что это дает оптимальный результат, но я не пытался это доказать. Если он не совсем оптимален, он все равно будет довольно хорошим.
Теперь, когда мне кажется, что я понимаю проблему, я могу сказать, что не существует хорошего алгоритма для ее решения.
Чтобы увидеть это, давайте сначала построим ориентированный граф, вершинами которого являются ваши элементы, а ребра которого указывают, сколько раз один элемент непосредственно предшествовал другому. Вы можете создать функцию приоритета, отбрасывая достаточное количество ребер, чтобы получить ориентированный ациклический граф, используя ребра, чтобы создать частично упорядоченный набор, а затем добавляйте отношения порядка, пока не получите полный линейный порядок, из которого вы можете легко получить функцию приоритета. Все это просто, если вы определили, какие края нужно отбрасывать. И наоборот, с учетом этого ориентированного графа и вашей функции конечного приоритета легко определить, какой набор ребер вы решили отбросить.
Следовательно, ваша задача полностью эквивалентна вычислению минимального набора ребер, которые вам нужно отбросить с a этого ориентированного графа, чтобы получить a этого направленного ациклического графа. Однако, как говорит http://en.wikipedia.org/wiki/Feedback_arc_set, это известная сложная проблема NP, называемая минимальным набором дуг обратной связи. начать обновление Поэтому очень маловероятно, что существует хороший алгоритм для графиков, который вы можете придумать. конец обновления
Если вам нужно решить это на практике, я бы предложил использовать какой-нибудь жадный алгоритм. Это не всегда будет правильно, но в целом даст разумные результаты в разумные сроки.
Обновление: Морон правильно, я не доказал NP-хард. Однако есть веские эвристические причины полагать, что проблема, на самом деле, NP-сложная. Смотрите комментарии для более.