学生选课系统的算法研究.pptVIP

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
学生选课系统的算法研究.ppt

应用场景分析 —— 数据分析 选课信息的数据结构设计是算法实现的关键: 由于在预选阶段选课与退课都很频繁,而且每位同学选课的数目是不确定的。因此选课信息的数据结构要能支持频繁的插入与删除操作。 * * 学生选课系统的算法研究 2007元培 杨璐 应用场景分析 ——任务的提出 模拟学生选课系统。在预选阶段同学可以任意选课退课,选课的同时要输入意愿点。专业课先到先得,人满为止;通选课在预选阶段不限人数,选课平台关闭后按照意愿点从高到低排序,取一定的名额。 要求算法能够按照课程号查到选该课的学生id,也可以按学生的id查到该人的选课情况。 应用场景分析 —— 数据基础 已经存在完整的学生档案数据库(包括id、姓名、院系等等基本信息)。实现按学号索引。 已经存在课程(班级)档案数据库(包括课程号、教师、上课地点、人数限制等等信息)。实现按课程编号索引。 可以认为学生档案信息和课程信息是相对静态的。支持批量的追加操作。在每个记录中包含一个删除标记int delete。置为0为未删,置为1为已删。避免偶尔的删除操作对整个数据库带来的影响。 数据结构设计 选课时对课程进行管理,因此构建通过课程查找学生id的索引。 Class_id *class_set 0172483 0248532 0259098 ….. Maxnum=200(课程最大容纳量) Actualnum=150(目前选课人数) 存放选课的学生信息的空间(可采用数组、链表实现) 数组数据结构 学生信息包括两部分:id与意愿点。 struct std { int id; int point; } struct std * list = ( struct std * ) malloc (sizeof (struct std ) * maxnum * 2 ); 这里因为在预选阶段选课人数可以超出班级最大容纳人数,但是根据实际情况又不会无限制的超出。所以我们将结构体数组的长度设为maxnum*2。 数组的算法 预选阶段,每增加一个学生插在数组尾部,每删除一个遍历数组找到此人,并将其后的依次向前挪一位。插入一个学生n++,删除一个学生n--。 预选阶段结束,选课系统关闭后,选该课程的学生不再变动。这时候数组中的学生是无序的。用冒泡法按意愿点对数组中的学生进行排序,取前maxnum位作为最终名单。 链表结构 struct std { int id; int point; struct std * next; } 预选阶段,每增加一个学生插在链表尾部,每删除一个遍历链表找到此人,并删除之。插入一个学生n++,删除一个学生n--。 预选阶段结束。因为链表难以实现排序操作,所以我们只好把链表中的内容复制到一个数组中(同时释放原链表),再用冒泡法按意愿点对数组中的学生进行排序,取前maxnum位作为最终名单。 数组PK链表 时间代价: 插入操作:直接插在队尾,O(1) 直接插在表尾,O(1) 删除操作:遍历数组找到需删的id,删除后 将其后的各个数字前移一位。 O(n) 遍历链表找到需删的id,然后删除O(n) 排序操作:冒泡法O(n2) 复制链表加冒泡法O(n)+O(n 2)=O(n2) 空间代价: 数组结构体有两个数据项,链表结构体有三个数据项,但数组总长度为链表的两倍(认为链表长度平均为maxnum)。所以二者相差不大。 综上所述,两种数据结构没有明显的优劣之分。 更好的方法——优先队列 struct std { int id; int point; } 最小值在堆的最上方。当插入了maxnum个学生时(班满时),将堆顶元素的意愿点输出,作为意愿点的下限。这时还没有选此课的学生就会知道,如果自己所能给出的意愿点小于这个值,就肯定选不上这门课。这样可以避免盲目选课,浪费意愿点。 当班满时插入一个新学生,如果他的意愿点小于等于堆顶元素,则不予插入;如果大于堆顶元素,就删除堆顶元素,插入新元素,同时输出新的堆顶元素的意愿点,作为意愿点下限值。 插入和删除的时间代价都是O(log2n),而且省去了冒泡排序O(n2)的时间。空间代价与数组相同。 注意:因为意愿点有可能重复,所以冒泡法或优先队列产生的都是不升序或不

您可能关注的文档

文档评论(0)

aiwendang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档