Идеи, связанные с суммой подмножества с 2,3 и более целыми числами

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

Я искал его в Интернете, и на самом деле есть много источников, но я действительно готов повторно реализовать алгоритм или найти свой собственный, чтобы полностью понять.

Главное, с чем я борюсь, — это эффективность, учитывая, что размер набора будет большим. (У меня нет предела, просто концептуально большой). Две фазы, которые я пытаюсь реализовать, это поиск двух чисел, равных заданному целому числу T, поиск трех чисел и, наконец, < b>К чисел. Некоторые идеи у меня есть;

Для двух целочисленных частей я в основном сортирую массив O(nlogn) и для каждого элемента в массиве ищу его отрицательное значение. (т. е. если элемент массива 3 ищет -3). Может быть, включение хэш-таблицы могло бы быть лучше, обеспечивая O(1) индексацию элемента?

Для трех или более целых чисел я нашел замечательный пост в блоге: http://www.skorks.com/2011/02/algorithms-a-dropbox-challenge-and-dynamic-programming/ . Однако даже сам автор утверждает, что для больших чисел это неприменимо.

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


person Ali    schedule 09.06.2012    source источник


Ответы (1)


Эта запись в блоге, на которую вы ссылаетесь выглядел довольно здорово, на самом деле. В конце концов, это NP-полная задача...

Но я уверен, вы могли бы ускорить его еще больше. Я не делал никаких тестов, но я предполагаю, что использование им матрицы является его единственной самой большой тратой времени. Во-первых, для некоторых действительно тривиальных входных данных потребуется огромный объем памяти (например, для [-1000, 1000] потребуется 2001 столбец! Боже мой!), а затем вы тратите массу циклов на сканирование каждой строки. ищем "T", которых часто бывает довольно мало.

Итак, вместо этого: используйте «установленную» структуру данных. Это сведет к минимуму пространство и время итерации*, но также сохранит значения: если это в наборе, это "T"; в противном случае это "F".

Надеюсь, это поможет!

*: Конечно, «минимум» не обязательно = «маленький».

person Xavier Holt    schedule 09.06.2012
comment
Дополнительный вопрос: будет ли способ публикации в блоге считаться успешным на собеседовании по скайпу? : D Причина, по которой я подробно описал этот вопрос, заключается в том, что я боюсь, что меня спросят, что это решение слишком индивидуальное, вы должны предоставить более общее. - person Ali; 10.06.2012
comment
@rolandbishop - я бы сказал, что единственное, что мешает решению блога быть достаточно общим, - это использование им матрицы. В его выборочном наборе [1, -3, 2, 4] используется 11 столбцов (минимум). Но тот же точный набор, умноженный на десять ([10, -30, 20, 40]), использует 101 (-30...70)! Умножьте еще раз на десять, и... ну, вы видите, к чему это идет. Использование установленной структуры данных позволяет избежать ненужного хранения (и, следовательно, также ненужного зацикливания) - единственное, что я вижу, что не позволяет оригиналу быть достаточно общим решением. Ваше здоровье! - person Xavier Holt; 10.06.2012
comment
Спасибо за помощь! Вы меня просветили. - person Ali; 10.06.2012