Я пишу алгоритм для генерации комбинаций предметов из базы данных. Они должны быть уникальными перестановками (т.е. 145, 156 == 156, 145). Проблема, с которой я сталкиваюсь, заключается в том, как отслеживать предыдущие комбинации, чтобы у меня не было 145, 156 и 156, 145.
В настоящее время я добавляю их в массив с индексом id1_id2 ... (отсортированный так, чтобы идентификаторы всегда были в порядке убывания), и устанавливаю значение равным 1, когда генерируется комбо, чтобы я мог проверить, если $ combos [ $ index] существует или нет. Если его не существует, создайте его. (Существуют другие критерии, чтобы отсеять КАЖДУЮ перестановку, но они не имеют значения) Как только эти комбинации сгенерированы, они сохраняются в таблице в MySQL.
Проблема, с которой я сталкиваюсь, состоит в том, что с помощью тестовых элементов, которые я использую (около 85), я не могу сгенерировать комбинации с более чем 3 элементами (id1_id2_id3) без исчерпания памяти, так как количество комбинаций MASSIVE и Массив $ combos занимает больше, чем 64M, которые я выделил в памяти PHP.
Есть ли способ, которым я могу сделать это а), не отслеживая предыдущие комбинации или б) пропуская маршрут массива $ combos и только добавляя уникальную строку в mysql и позволяя mysql обрабатывать проверку дубликатов.
Вот некоторый псевдокод для справки:
$items = array(/*85 items*/);
foreach ($items as $item1){
generate(array($item1));
foreach($items as $item2){
generate(array($item1, $item2));
}
}
}
function generate($items_arary){
$temp_array = array();
foreach ($items_array as $item){
$temp_array[] = $item['id'];
}
sort($temp_array);
$index = implode("_", $temp_array);
if (!$combos[$index]){
$combos[$index] = 1;
/* some code to generate query to store to db */
}
}
запрос выглядит примерно так: (база данных усекается в начале скрипта)
INSERT INTO `combos` (combo_id, more_info) VALUES ('id1_id2', 'Item Name');
В процессе написания этого вопроса я подумал о возможном решении: убедиться, что id3> id2> id1. Будет ли это жизнеспособным решением для устранения необходимости использования $ combos?