Я знаю, что существуют некоторые вопросы там при генерации комбинаций элементов, но я думаю, что у этого есть определенное скручивание для ценности нового вопроса:
Для домашнего животного proejct мой я должен предварительно вычислить много состояния для улучшения поведения во время выполнения приложения позже. Один из шагов, с которыми я борюсь, является этим:
Данные кортежи N двух целых чисел (позволяет, называют их точками отсюда на, хотя они не находятся в моем варианте использования. Они примерно - связанный X/Y, хотя) я должен вычислить все допустимые комбинации для данного правила.
Правило могло бы быть чем-то как
Я надеюсь и ожидаю, что этот факт приводит к улучшению процесса выбора, но мои математические навыки просто возрождаются, поскольку я ввожу, и я не могу придумать изящный алгоритм.
Спасибо.
Обновление в ответ на ответ Vlad:
Возможно, моя идея обобщить вопрос была плохой. Мои правила выше были изобретены на лету и просто заполнители. Одно реалистическое правило было бы похоже на это:
По тому правилу и путем выбора (2,1) я исключил бы
Таким образом, правила исправлены, не общий. Они, к сожалению, более сложны, чем образцы X/Y, которые я первоначально дал.
Как насчет «координаты x каждой включенной точки - это точная сумма некоторого подмножества y-координат других включенных точек». Если вы сможете придумать быстрый алгоритм для решения этой простой задачи с ограничениями, вы действительно станете очень знаменитыми.
Я хочу сказать, что сформулированная проблема настолько расплывчата, что допускает NP-полные или NP-сложные проблемы. Задачи оптимизации ограничений невероятно сложны ; если вы не можете поставить чрезвычайно жесткие границы проблемы, то она очень быстро становится не анализируемой машинами за полиномиальное время.
Насколько я понимаю, проблема заключается в следующем: для метода bool property (Point x) const
найти все точки, для которых свойство () имеет значение true
. Это разумно?
Подход грубой силы состоит в том, чтобы прогнать все точки через свойство ()
и сохранить те, которые возвращают истину. Временная сложность этого будет O (N)
, где (a) N - общее количество точек, и (b) метод свойства ()
равен O ( 1)
. Я думаю, вы ищете улучшения в O (N)
. Это верно?
Для некоторых свойств можно улучшить O (N)
при условии, что для хранения точек используется подходящая структура данных и выполнено подходящее предварительное вычисление (например, сортировка) . Однако это может быть неверно для любого произвольного свойства.
Для некоторых особых типов правил ваша задача кажется простой. Например, для вашего примера правила №1 вам нужно выбрать подмножество всех возможных значений X, а затем для каждого значения из подмножества назначить произвольное Y.
Для общих правил я сомневаюсь, что можно построить эффективный алгоритм без ИИ.