数据结构学习之多重链表的一个应用场景

来源:互联网 发布:js求两个集合的并集 编辑:程序博客网 时间:2024/05/19 10:39
最近正在重新学习Mark Allen Weiss著的数据结构与算法分析,为了加深印象并且帮助之后的复习,现在把我认为有意思的例子总结下来。

今天这个例子是关于多重链表的应用。回想一下作为程序员这些年好像很少使用多重链表这种数据结构来解决过实际的问题,但当我看到这个例子时,又感觉这种应用好像又离我们很近。废话少说,直接上例子。

题目是这样的:
一所有40000名学生和2500门课程的学校需要生成两种类型的报告。第一个报告是列出每门课程参与学生,另一个报告是列出每个学生注册的课程。请设计一种数据结构来存储所有的数据。

看到这个题目,我猜大多数人都会想到使用二维数组,但问题是一个这样的数组将有1亿项,考虑到平均大约一个学生会注册三门课程,因此实际上这个数组里有意义的数据只有120000项,数组的利用率是非常低的,大约占0.1%,并且在这种结构下查询的效率也不是很高。

很明显,我们有更好的办法, 那就是使用多重链表。我们可以依照下图设计数据结构。 顶层横向的结点(S1,S2...)表示学生,存放每个学生的信息。纵向的结点(C1, C2...)表示课程,存放课程的结点。中间的没有标字母的结点是一些功能结点,主要包括指向横向和纵向的下一个结点的指针。


在这种数据结构下,如果要查询一个学生所选择的所有课程,则可以通过包含学生信息的结点开始,依次遍历功能结点,当遍历到一个功能时,再横向遍历直到找到表示课程的结点,然后在纵向遍历找到下一个功能结点,然后横向找到课程结点。如此往复直到又回到学生结点为止。同理如果要寻找一个课程里所有的注册学生,则先横向然后再纵向遍历。

使用多重链表虽然能够节省空间,但是查找起来效率仍比较低。在最坏的情况下,如果第一个学生注册了所有的课程,那么这个链表都会被遍历一遍。解决这个问题的办法就是在功能节点中添加两个域,直接指向对应的学生结点和课程结点。

0 0
原创粉丝点击