Я пишу алгоритм для создания комбинаций элементов из базы данных. Они должны быть уникальными перестановками (т. Е. 145, 156 == 156, 145). Проблема, с которой я сталкиваюсь, заключается в том, как отслеживать предыдущие комбинации, чтобы я не получал 145, 156 и 156, 145.Создание уникальных комбинаций без исчерпания памяти в php
В настоящее время я добавляю их в массив с индексом id1_id2 ... (отсортированные так, чтобы идентификаторы всегда были самыми низкими до наивысших) и установив значение, равное 1, когда комбо сгенерировано, чтобы я мог проверить, существует ли $ combos [$ index] или нет. Если он не существует, создайте его. (есть другие критерии для отсеивания КАЖДОЙ перестановки, но они не имеют значения). После создания этих комбинаций они сохраняются в таблице в MySQL.
Проблема, с которой я столкнулся, заключается в том, что с помощью тестовых элементов, которые я использую (около 85), я не могу сгенерировать комбинации с более чем тремя элементами (id1_id2_id3), не исчерпывая память, поскольку количество комбинаций MASSIVE и массив $ combos занимает больше, чем 64M, я выделен в памяти PHP.
Есть ли способ, которым я могу это сделать: a) не отслеживая предыдущие комбо или b) пропуская маршрут массива $ 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. Будет ли это жизнеспособным решением для устранения необходимости комбо-комбо?
Вы можете предоставить более подробную информацию о том, откуда поступают данные? Вы сказали, что это в базе данных, какова структура таблицы «до». Спасибо +1 –
Не совсем уверен, как это важно? – helloandre
Преломление - это ключ –