选课算法小记

  • 每月一更(划掉) 最近写的东西,记录一下,以备改进
  • 用户需求:
    每个班分男生用户与女生用户,每个班有N个分项,每个分项可容纳\(x_i\)个男生和\(y_i\)个女生。
    每个学生可选N个志愿,类似高考志愿,根据志愿表进行分班,每个班独立执行。
  • 算法实现:
    \(O(n^2+n^2)\):
    • 从数据库的班级表中选择所有班级的ID建立LIST,遍历class_list选择每个班级的学生,通过标识符gender将男女生分别建立boy_list,girl_list。
    • 从数据库的分项表中选择当前class_id拥有的分项,建立majoy_list,遍历major_list,建立以major_id为key,N为value的dict。
    • 遍历boy_list,girl_list,从数据库的志愿表中选择当前student_id匹配的志愿列表,志愿表中第一志愿,第二志愿是根据时间CHANGE_TIME升序排序的。
    • 遍历当前志愿列表,在dict中加入student对象,例如a志愿表第一志愿为羽毛球,则在dict[羽毛球][1]list中加入student对象。
    • 建立result_list,以major_id为key,value值为student对象的数组。
    • \(O(n^2)\) 遍历dict底层循环中
      • 如果当前result_list[major_id]的长度=major.student_num,则跳过,访问下一个dict[majoy_id][i]
      • 如果dict[majoy_id][i]的长度+result_list[major_id]的长度<=major.student_num,则将dict[majoy_id][i]中student对象全部加入result_list[major_id],并将每个student对象在后续的dict[majoy_id]全部删除。
      • 如果dict[majoy_id][i]的长度+result_list[major_id]的长度>major.student_num,则随机数选择dict[majoy_id][i]中student对象,删除当前dict[majoy_id]中选择到的student对象,并将选择到的student对象在后续的dict[majoy_id]全部删除。
        算法结束。
  • 计划:

  • 遇到的问题:
    • 数据库中男女标识错误
    • 每个分项可容纳的学生总数大于每个班的学生总数
    • 数据库冗余太多查询太慢
    • 对girl_list重复进行boy_list相同操作时忘写删除语句,调试一个多小时才发现论注释的重要性
    • 纸上构思的算法没考虑到每个student对象在后续的dict[majoy_id]全部删除
    • 写博文的时候忘记二级列表要tab,三级列表要双tab了
    • ……

猜你喜欢

转载自www.cnblogs.com/shy-/p/9763208.html
今日推荐