2015-04-07 2 views
1

У меня есть набор целых чисел, и я хочу найти самое большое подмножество, в котором элементы не коррелируют друг с другом определенным образом. Например, подмножество, в котором, если какой-либо из элементов умножается на 13, результат не находится в подмножестве.Поиск самого большого подмножества элементов, который не коррелирует

Моя первая мысль - перебрать все возможные подмножества, отфильтровать их, которые не соответствуют этому условию, а затем найти самый большой, но это слишком медленно, и я не знаю, как сгенерировать все возможные подмножества ,

+0

Ответ будет в значительной степени зависеть от того, что вы имеете в виду «коррелят». Очевидным примером является отношение 'sum {subset} = sum {set}/2', которое является проблемой раздела, и для него нет известного эффективного (полиномиального времени). (В случае целых чисел есть псевдополиномиальный) – amit

+0

Однако, если вопрос только «Как создать все возможные подмножества» - это будет обман, здесь есть много вопросов. (простое объяснение, использование рекурсии, и для каждого элемента «угадать», если он в подмножестве или нет, и рекурсия, возвращаясь из рекурсии, «угадать» другой вариант. – amit

+0

Вопрос заключается в том, как найти количество элементов в самое большое подмножество –

ответ

0

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

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

Если ваш номер m

Вы можете создать все сети x, x*m, x*m*m, ...., так что все количество в цепи в наборе, x/m не является

Remove каждый второй элемент, т.е. x*m^2, x*m^4 из оригинального комплекта. Элементы слева - ваш целевой набор.

0

Лучше всего построить граф и найти вершины с большинством ребер и удалить их, пока вы не избавитесь от всех ребер. Сложность - O (N^2).

Вот подробный алгоритм:

for each possible pair (x, y) from the source set 
begin 
    if x = y * 13 or y = x * 13 then make edge between x and y 
end 
while graph has edges 
begin 
    let V = find: a vertex with maximum count of edges (it can be 1 or 2) 
    remove V from the graph 
end 
result: the remaining vertexes in the graph 
Смежные вопросы