【发布时间】:2009-07-30 16:48:16
【问题描述】:
我正在编写一个算法来从数据库中生成项目组合。它们需要是唯一的排列(即 145、156 == 156、145)。我遇到的问题是如何跟踪以前的组合,这样我就不会得到 145、156 和 156、145。
目前我将它们添加到索引为 id1_id2... 的数组中(排序后 id 总是从最低到最高)并在生成组合时将值设置为 1,以便我可以检查 $combos[ $index] 存在与否。如果它不存在,则创建它。 (还有其他标准可以剔除每个排列,但它们无关紧要)一旦生成了这些组合,它们就会存储在 MySQL 的表中。
我遇到的问题是,对于我正在使用的测试项目(大约 85 个),我无法生成超过 3 个项目的组合(id1_id2_id3)而不会耗尽内存,因为组合的数量是 MASSIVE 并且$combos 数组占用的内存超过了我在 PHP 内存中分配的 64M。
有没有一种方法可以做到这一点 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。这是消除对 $combos 需求的可行解决方案吗?
【问题讨论】:
-
您能否提供有关数据来源的更多信息?您说它在数据库中,“之前”表的结构是什么。谢谢+1
-
不太确定这有什么关系?