数据结构学习之多重链表的一个应用场景
2015-01-20 17:19
881 查看
最近正在重新学习Mark Allen Weiss著的数据结构与算法分析,为了加深印象并且帮助之后的复习,现在把我认为有意思的例子总结下来。
今天这个例子是关于多重链表的应用。回想一下作为程序员这些年好像很少使用多重链表这种数据结构来解决过实际的问题,但当我看到这个例子时,又感觉这种应用好像又离我们很近。废话少说,直接上例子。
题目是这样的:
一所有40000名学生和2500门课程的学校需要生成两种类型的报告。第一个报告是列出每门课程参与学生,另一个报告是列出每个学生注册的课程。请设计一种数据结构来存储所有的数据。
看到这个题目,我猜大多数人都会想到使用二维数组,但问题是一个这样的数组将有1亿项,考虑到平均大约一个学生会注册三门课程,因此实际上这个数组里有意义的数据只有120000项,数组的利用率是非常低的,大约占0.1%,并且在这种结构下查询的效率也不是很高。
很明显,我们有更好的办法, 那就是使用多重链表。我们可以依照下图设计数据结构。 顶层横向的结点(S1,S2...)表示学生,存放每个学生的信息。纵向的结点(C1, C2...)表示课程,存放课程的结点。中间的没有标字母的结点是一些功能结点,主要包括指向横向和纵向的下一个结点的指针。
在这种数据结构下,如果要查询一个学生所选择的所有课程,则可以通过包含学生信息的结点开始,依次遍历功能结点,当遍历到一个功能时,再横向遍历直到找到表示课程的结点,然后在纵向遍历找到下一个功能结点,然后横向找到课程结点。如此往复直到又回到学生结点为止。同理如果要寻找一个课程里所有的注册学生,则先横向然后再纵向遍历。
使用多重链表虽然能够节省空间,但是查找起来效率仍比较低。在最坏的情况下,如果第一个学生注册了所有的课程,那么这个链表都会被遍历一遍。解决这个问题的办法就是在功能节点中添加两个域,直接指向对应的学生结点和课程结点。
今天这个例子是关于多重链表的应用。回想一下作为程序员这些年好像很少使用多重链表这种数据结构来解决过实际的问题,但当我看到这个例子时,又感觉这种应用好像又离我们很近。废话少说,直接上例子。
题目是这样的:
一所有40000名学生和2500门课程的学校需要生成两种类型的报告。第一个报告是列出每门课程参与学生,另一个报告是列出每个学生注册的课程。请设计一种数据结构来存储所有的数据。
看到这个题目,我猜大多数人都会想到使用二维数组,但问题是一个这样的数组将有1亿项,考虑到平均大约一个学生会注册三门课程,因此实际上这个数组里有意义的数据只有120000项,数组的利用率是非常低的,大约占0.1%,并且在这种结构下查询的效率也不是很高。
很明显,我们有更好的办法, 那就是使用多重链表。我们可以依照下图设计数据结构。 顶层横向的结点(S1,S2...)表示学生,存放每个学生的信息。纵向的结点(C1, C2...)表示课程,存放课程的结点。中间的没有标字母的结点是一些功能结点,主要包括指向横向和纵向的下一个结点的指针。
在这种数据结构下,如果要查询一个学生所选择的所有课程,则可以通过包含学生信息的结点开始,依次遍历功能结点,当遍历到一个功能时,再横向遍历直到找到表示课程的结点,然后在纵向遍历找到下一个功能结点,然后横向找到课程结点。如此往复直到又回到学生结点为止。同理如果要寻找一个课程里所有的注册学生,则先横向然后再纵向遍历。
使用多重链表虽然能够节省空间,但是查找起来效率仍比较低。在最坏的情况下,如果第一个学生注册了所有的课程,那么这个链表都会被遍历一遍。解决这个问题的办法就是在功能节点中添加两个域,直接指向对应的学生结点和课程结点。
相关文章推荐
- OAuth2.0学习(1-2)OAuth2.0的一个企业级应用场景 - 新浪开放平台微博OAuth2.0认证
- 每天学习一算法系列(31)(实现一个队列,队列的应用场景为:一个生产者线程将int 类型的数入列,一个消费者线程将int 类型的数出列)
- 小蚂蚁学习数据结构(27)——题目——一个关于链表的题目
- 《Delphi 算法与数据结构》学习与感悟[6]: 一个简单的"单向链表"
- 数据结构学习笔记7--c语言建立一个链表(已测正确无误)
- [C++学习笔记] 链表应用1判断一个集和是否为另一个集合的子集
- 数据结构学习系列三-单向循环链表(c++实现且应用模板)
- 数据结构学习 之 链表 练习 链表排序功能.(热身练习)
- 一个非常专业的SaaS应用,学习的目标
- 数据结构中关于链表的一个简单问题
- SilverLight学习笔记--实际应用(一)(1):手把手建立一个Silverlight应用程序之开始篇
- set,bitset 的一个应用实例——数据结构和比较算法
- 《Delphi 算法与数据结构》学习与感悟[10]: 双向链表
- 数据结构学习之双链表
- wss3 sdk学习笔记二:建立一个SharePoint网站应用
- Java数据结构学习之应用场合
- 一个JAVA读写文件的例子,主要是熟悉对 4000 字符流的应用(自己学习用)
- Struts2学习(一):创建一个Struts2应用
- 目前参与了一个比较大的工程,一些方法要好好学习,并应用其中。
- Web开发者向桌面应用开发转型之数据结构学习