Все допустимые комбинации точек, в большинстве (скорость) эффективный путь

Я знаю, что существуют некоторые вопросы там при генерации комбинаций элементов, но я думаю, что у этого есть определенное скручивание для ценности нового вопроса:

Для домашнего животного proejct мой я должен предварительно вычислить много состояния для улучшения поведения во время выполнения приложения позже. Один из шагов, с которыми я борюсь, является этим:

Данные кортежи N двух целых чисел (позволяет, называют их точками отсюда на, хотя они не находятся в моем варианте использования. Они примерно - связанный X/Y, хотя) я должен вычислить все допустимые комбинации для данного правила.

Правило могло бы быть чем-то как

  • "Каждая включенная точка исключает любую точку с теми же X координатами"
  • "Каждая включенная точка исключает любую точку с нечетным X координат"

Я надеюсь и ожидаю, что этот факт приводит к улучшению процесса выбора, но мои математические навыки просто возрождаются, поскольку я ввожу, и я не могу придумать изящный алгоритм.

  • Набор точек (N) начинает с малого, но перерастает 64 скоро (для "использования долго в качестве битовой маски" решения)
  • Я делаю это в C#, но решения на любом языке должны быть прекрасными, если он объясняет базовую идею

Спасибо.


Обновление в ответ на ответ Vlad:

Возможно, моя идея обобщить вопрос была плохой. Мои правила выше были изобретены на лету и просто заполнители. Одно реалистическое правило было бы похоже на это:

  • "Каждая включенная точка исключает любую точку в triagle выше выбранной точки"

По тому правилу и путем выбора (2,1) я исключил бы

  • (2,2) - непосредственно выше
  • (1,3) (2,3) (3,3) - следующая строка
  • и так далее

Таким образом, правила исправлены, не общий. Они, к сожалению, более сложны, чем образцы X/Y, которые я первоначально дал.

6
задан Benjamin Podszun 2 March 2010 в 22:15
поделиться

3 ответа

Как насчет «координаты x каждой включенной точки - это точная сумма некоторого подмножества y-координат других включенных точек». Если вы сможете придумать быстрый алгоритм для решения этой простой задачи с ограничениями, вы действительно станете очень знаменитыми.

Я хочу сказать, что сформулированная проблема настолько расплывчата, что допускает NP-полные или NP-сложные проблемы. Задачи оптимизации ограничений невероятно сложны ; если вы не можете поставить чрезвычайно жесткие границы проблемы, то она очень быстро становится не анализируемой машинами за полиномиальное время.

3
ответ дан 17 December 2019 в 18:14
поделиться

Насколько я понимаю, проблема заключается в следующем: для метода bool property (Point x) const найти все точки, для которых свойство () имеет значение true . Это разумно?

Подход грубой силы состоит в том, чтобы прогнать все точки через свойство () и сохранить те, которые возвращают истину. Временная сложность этого будет O (N) , где (a) N - общее количество точек, и (b) метод свойства () равен O ( 1) . Я думаю, вы ищете улучшения в O (N) . Это верно?

Для некоторых свойств можно улучшить O (N) при условии, что для хранения точек используется подходящая структура данных и выполнено подходящее предварительное вычисление (например, сортировка) . Однако это может быть неверно для любого произвольного свойства.

0
ответ дан 17 December 2019 в 18:14
поделиться

Для некоторых особых типов правил ваша задача кажется простой. Например, для вашего примера правила №1 вам нужно выбрать подмножество всех возможных значений X, а затем для каждого значения из подмножества назначить произвольное Y.

Для общих правил я сомневаюсь, что можно построить эффективный алгоритм без ИИ.

0
ответ дан 17 December 2019 в 18:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: