问题包括课程安排程序(适用于大学/学院)。如果我不使用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?
答案 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方法的性能类似。冲突可以通过在较小的子集上进行列表交集来确定。