Алгоритмический подход к генерации всех комбинаций на основе большой таблицы истинности - PullRequest
2 голосов
/ 20 августа 2009

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

Моя ситуация такова - у меня есть переменное количество элементов данных, каждый из которых был проверен на соответствие друг другу элемента данных для определения совместимости. Совместимость хранится в эквиваленте двумерного массива (таблица истинности?). Моя цель состоит в том, чтобы создать все возможные комбинации этих элементов данных, где каждый элемент в комбинации совместим друг с другом.

Например, если элемент 1 (из 4) был совместим с элементами 2 и 4, а элемент 2 был совместим с 1, 3 и 4, элемент 3 был совместим с 2, а элемент 4 был совместим с 1 и 2, мой Таблица истинности будет выглядеть примерно так:

1) {1,1,0,1}
2) {1,1,1,1}
3) {0,1,1,0}
4) {1,1,0,1}

Комбинации, которые я хочу получить от этого, будут:
1,2,4
1,2
1,4
1
2,3 * * 1 018 2,4
2
3 * * тысяча двадцать-один 4

Мой подход хорошо работает во многих ситуациях, но иногда сильно увязает, когда количество элементов превышает 5000, в зависимости от наборов данных. Моя вторая задача - определить шаблон, который увеличивает время выполнения с 5 секунд до 3 часов ...

Просто глядя на логический массив, я просто чувствую, что должно быть более простое решение - алгоритм, названный в честь кого-то, может быть. Как вы могли бы заключить из вышесказанного, я не обязательно знаю, как задать вопрос. ;)

Спасибо за ваше время!

Ответы [ 2 ]

4 голосов
/ 20 августа 2009

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

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

Обратите внимание, что ваш график симметричен, то есть, если '1 совместим с 2', то обязательно '2 совместим с 1'. Теперь это вдвое сократило ваши требования к хранилищу данных (сделав их более сложными, хранение верхней или нижней половины матрицы зачастую более утомительно, чем пространство, которое она экономит). Я также думаю, что вы, вероятно, должны иметь 1 по главной диагонали, чтобы выразить идею, что «1 совместимо с 1». В конце концов, я подозреваю, что у вас будут некоторые элементы, которые совместимы только с самим собой.

Поиск кликов в графе, к сожалению, является NP, но для матриц, состоящих только из 5000x5000 элементов, простой алгоритм не должен занимать слишком много времени в скомпилированном языке.

Привет

Mark

1 голос
/ 20 августа 2009

Вы в основном пытаетесь привести выражение к дизъюнктивной нормальной форме. В общем случае эта задача является NP-полной. Сожалею. ^ _ ^

...