课程安排使用php / mysql

时间:2011-02-19 09:31:35

标签: php sql combinations

问题包括课程安排程序(适用于大学/学院)。如果我不使用SQL:我有一个数组数组和一个二维数组。第一个数组中的每个数组都包含不同课程的唯一ID(每个课程都有不同的时间和天数,由这些独特的ID表示)。第二个数组包含兼容的课程(即不会造成时间冲突)。如果我采取“n”个课程,我希望找到所有可能的课程组合而不会有时间冲突。

+++++++array 1+++++++++   ++++array 2+++++
course1 course2 course3   (compatible ids)
  122     235     654         122  235
  123     456     876         122  456
  124     190     943         122  654
  145     456     321         122  321
                              235  654...

在上面的示例中,以下ID可以制定时间表:122 235 654.
我想出的唯一解决方案是强制它(嵌套循环)。有没有更有效的方法来解决这个问题?也许通过使用MySQL?

2 个答案:

答案 0 :(得分:0)

如果它是一个选项,我肯定会使用MySQL,并以这种方式维护大部分关系数据。

答案 1 :(得分:0)

create table course1 ( id INTEGER );
create table course2 ( id INTEGER );
create table course3 ( id INTEGER );
create table compatible ( id1 INTEGER, id2 INTEGER );

select distinct c1.id, c2.id, c3.id
from course1 c1
  INNER JOIN compatible p1 on p1.id1 = c1.id
  INNER JOIN course2 c2 on p1.id2 = c2.id
  INNER JOIN compatible p2 on p2.id1 = c2.id
  INNER JOIN course3 c3 on p2.id2 = c3.id
where exists ( select * from compatible p3 where p3.id1 = c1.id and p3.id2 = c3.id )

这实际上并不灵活,虽然它应该比完整扫描更快(只要id被索引),它将需要2 ^ n个约束,因此不能很好地扩展到大量的课程。请注意,兼容表的成对顺序非常重要。

通过使用哈希表和嵌套列表,您可以从php解决方案中获得更好的性能。将第二个数组的结构更改为

array (
    122 => array( 235, 456, 654, 321),
    235 => array( 654...
然后,蛮力方法可以更有效(没有完整列表扫描)。这应该与sql方法的性能类似。冲突可以通过在较小的子集上进行列表交集来确定。