数据结构课程主页


 

上机题目

本部分内容随课程进度随时更新。

上机作业应按时独立完成,在本次作业的截止日期之前通过教学网提交。 超过截止日期一周以内按照本次作业的50%计入成绩,超过截止日期一周以上不计成绩。
作业文件命名方式:aaaaazzm.zip或aaaaazzm.rar,表示16级学号的最后5位为aaaaa姓名为zz的同学第m次作业,所有文件压缩后提交,说明所用的开发环境。其他年级同学的文件名前加一个字母x,其余字母的编码方式同上。程序尽可能写得清晰规整,加上必要的注释。

注意:上机程序作业必须通过编译和运行,否则作为没有完成的作业,由辅导老师酌情处理。

 

序号 布置日期 截止日期
作业内容
1 9.15 9.22

在时间序列数据挖掘中,人们往往需要在某段时间出现的事件序列中寻找某种特定模式。例如股票交易中的股票购买就是具有时间自然顺序的一种数据资源,给定股票购买事件的一个长序列S,我们希望给出一种有效的方式来发现其中的某些模式。例如,我们可能希望知道是否下面这4个事件出现在序列S中,按顺序但不一定连续出现。

买Amazon股票,买Facebook股票,买Amazon股票,买Google股票

我们从一组可能的事件(即可能的股票交易)和n个这种事件的序列S开始。一个给定的事件在S中可能出现多次(例如一个序列S中Amazon股票可能被多次购买),如果存在某种方式从S中删除某些事件使得留下来的事件按照顺序等于序列T,则称T为S的子序列。例如上面4个事件的序列就是下面这个序列的子序列:

买Microsoft股票,买Amazon股票,买Facebook股票,买Amazon股票,买Amazon股票,买Google股票

现在的目标是能够构造短序列且快速检测它们是否是S的子序列,因此,对于两个事件序列:长度为m的序列T和长度为n的序列S,每个都可能包含多于1次的事件,设计并实现一个算法,在不超过O(m+n)的时间内确定T是否为S的子序列。

2 9.22 10.17 设计并实现一个简单文本编辑器,至少实现以下功能:把指定文件读入编辑器、在编辑器中对文件进行编辑、将编辑的内容存入指定文件、把字符串或文本块插入编辑区指定位置、删除编辑区里的字符串或文本块、在编辑区里查找指定字符串、将文本里的“字符串1”替换为“字符串2”。
3 9.28 10.20 在8*8的国际象棋棋盘上放置8个皇后,使得任意两个皇后不能互相攻击,即任何行、列或对角线(与水平方向夹角为45度或135度的斜线)上不得有两个或两个以上的皇后,这样的一个格局成为问题的一个解。给出用回溯法求解八皇后问题的程序实现。
4 10.10 10.27

课程项目1——电梯模拟系统,本项目要求独立完成工作并按时提交。

项目描述:

请开发一个简单的电梯模拟系统,具体要求如下:

  • 假设电梯所在的建筑共计n层,从地面层(按习惯称1楼)直至最上层(n楼)。这里的n作为一个参数,可以修改。例如可以设置为5或9模拟5层或9层楼的电梯(如理科1号楼和2号楼的电梯)。
  • 每层电梯门边有一个上行按钮和一个下行按钮,最下层和最上层只有一个按钮。
  • 电梯里有一组按钮,供乘电梯人选择目标楼层。
  • 电梯从一层到其相邻层需要k秒时间。
  • 乘客按一定时间间隔到达某楼层,按电梯门边按钮表示要求上行或下行。乘客到达的时间间隔是区间[a, b] 里的某个随机值,到达楼层是[1, n] 中的随机值。
  • 乘客进电梯后选择搭乘的目标楼层(随机值)。
  • 乘客在电梯到达其目标楼层后离开电梯。
  • 我们希望模拟N秒的电梯运行情况,并在模拟中做一些统计。

考虑下面的数据统计:

模拟期间完成服务的共计人数;平均等电梯时间;电梯的平均负荷人数(请提出一种适当的统计方法);其他有意义的统计结果(自己考虑)。

项目要求:

根据题目要求设计并实现所需的功能,
1. 设计所需的数据结构。例如,用什么数据结构表示乘客、电梯、按钮等,模拟中的各种事件,怎样把它们组织起来形成完整的系统;
2. 可以参考课堂上给的实例,采用类似的实现技术。也可以完全自己设计一套实现方法。可以找到许多有关离散事件模拟方面的参考材料。
3. 要求实现一个名为demo的函数,它以适当参数运行开发的模拟系统(一次或几次,不 同参数) ,展示所做系统确实完成了要求的模拟工作。请设一个全局变量verbose,当其值为True时模拟中输出所有事件的信息,其值为False时只输出最后的统计数据。

报告的要求:

报告大致可以分为几个部分:
1. 对问题的分析和整体系统的设计概述;
2. 具体的数据结构和程序结构设计;
3. 实现中的关键问题和技术分析;
4. 系统完成的情况和实际效果的说明;
5. 重要算法的时间复杂性分析,并说明自己的程序没有不合理的空间浪费。
6. 完成了这个系统之后的回顾和分析:优点和缺点,改进和扩充的可能性;
7. 使用C(或其他语言)做这个工作的体会,在哪些方面C很好用,使用方便;在那些情况或问题处理中不够方便,使你们的工作遇到了困难等(这部分不是必要要求)。

报告可以考虑分为几节(仅供参考,实际报告不必拘泥于这里列出的项目):
1. 问题分析和系统整体设计;
2. 数据结构和程序结构设计;
3. 关键问题和算法;
4. 系统完成情况;
5. 重要算法分析;
6. 总结和回顾;
7. C(或其他)语言的使用情况。

可参考报告范例:报告范例1报告范例2

附注:

如果要更真实地模拟电梯系统的运行,可能还需要考虑许多细节,例如:

  • 电梯的承重限额,即最大容纳人数;
  • 模拟电梯的启动和减速过程(启动和减速需要时间,和正常运行不同);
  • 模拟电梯开门/关门的时间消耗;
  • 电梯运行经过某一层之前有人按了按钮,在什么样的情况下电梯能停(需要一定的提前量以保证机械装置操作和安全性);
  • 在一层上下电梯的人数决定了电梯的停留时间(假定每个人上下用某个常量时间);
  • 调度策略,多电梯控制,乘客的随机分布情况,等等

以上这些为选作内容,不做要求。

5 11.3 12.22

课程项目2——模型检验,本项目可独立或合作完成(合作者每组最多3人),要求按时提交。

有限状态迁移系统(Finite Labelled Transition System) 是形式化方法中常用的模型之一。一个有限状态迁移系统包含有限个状态(State)和一系列的迁移(Transition),每个迁移包括起始状态,后继状态和一个动作,当系统处于起始状态时,可以执行该动作并跳转到其后继状态。一个简单有限状态迁移系统的例子(Coffee Machine)定义如下所示:
idle paid
idle
coin idle paid
coffee paid idle
第一行给出所有状态的名称(名称只能包含大小写英文字母和数字,用空格隔开)。在这个例子中,咖啡机共有两个状态,分别是待机(idle)以及已付款(paid)。第二行给出系统的初始状态,在这个例子中为idle。之后每一行描述一个迁移(三个由空格分开的字符串,分别是动作名称,起始状态和后继状态)。其中起始状态和后继状态必须是第一行中出现过的。

一个有限状态迁移系统的运行过程如下:
最开始,系统处于其初始状态
如果系统的当前状态上存在一个迁移,那么就执行这个迁移并跳转到它的后继状态
如果存在多个迁移,系统会随机选择一个执行
将系统执行过程中的动作序列记录下来,我们称为它的一个迹(Trace)。例如,例子中系统的迹可以是如下的无限序列:
coin, coffee, coin, coffee, ...
显然,一个有限状态迁移系统所对应的迹不是唯一的,而是一个集合。

时序逻辑用于描述系统满足的时序性质,常用的时序逻辑包括线性时序逻辑、计算树逻辑等。例如线性时序逻辑(Linear Temporal Logic)可以描述一个系统在线性时间上的变化所要满足的条件。一个线性时序逻辑公式L的定义如下所示:

L::= True | a | L1 and L2 | not L | X L (next)| L1 U L2 (until)

具体含义见[1],[2]。

假设我们有一个线性时序逻辑公式(not coffee)U coin),那么我们可以看出上述的系统是满足这个公式的。因为它唯一的一条轨迹上从初始位置开始,一定不会出咖啡直到用户付款(这很显然!因为总共只有两个状态……)

如果给定一个有限状态迁移系统TS和一个线性时序逻辑公式L。当且仅当TS所有可能的轨迹均满足L时,我们说TS满足L。

基本要求:

设计并实现一个LTL/CTL的模型检查工具,使得对给定的状态迁移系统TS和LTL/CTL公式L,可以判断TS是否满足L,若满足,返回True,若不满足,返回False并给出TS中一条不满足L的路径作为反例。并对所给出的实现进行性能分析。

示例输入文件格式:

第一行为n个用空格分开的字符串,描述状态迁移系统的每个状态名称。第二行为一个字符串,描述状态迁移系统的初始状态。之后的若干行为状态迁移系统的边,每行由三个字符串组成,分别是:动作,起始状态,目标状态。中间用空格隔开之后空一行。然后每一行是一条要检查的时序逻辑公式。为简化问题,我们假设任何运算都由括号括起,从而不存在优先级的问题。到文件结束为止。

示例输出文件格式:

m行(m为公式的条数),每行为True,或者False加上一个状态序列作为反例,表明该模型满足公式或者不满足且给出反例。

选作:

1. 在LTL/CTL公式中可使用其他扩充运算符,如eventually、always、weak until等。

2. 设计并实现其他时序逻辑(如CTL*、TCTL、PCTL等)的模型检查算法。

本次上机实习报告要求:

- 独立或合作完成(合作者每组不超过3人),写出上机实习报告(不少于6000字),在报告中注明每人工作。
- 本次报告和程序12月22日晚12点之前由第一作者通过系统提交。
- 程序和实习报告都采用电子文档形式打包上传。
- 上交所有源文件及测试用例,应保证程序能编译和执行。
- 保证自己上交的文档中没有病毒。
- 不要在报告中大量使用源代码凑字数。

注意:

1. 感兴趣的同学可以考虑选作内容,不做这部分的内容不会导致本次报告成绩降低。

2. 数据结构的设计和算法的效率是需要重点考虑的问题,不需要把太多的时间花在图形界面上。做了图形界面并不是加分项。

3. 可自己定义输入输出文件格式,但需在报告中说明。

参考文献(院图馆藏):

[1] Christel Baier and Joost-Pieter Katoen. Principles of Model Checking. The MIT Press, 2008.

[2] Edmund M. Clarke, Jr., Orna Grumberg and Doron A. Peled. Model Checking, The MIT Press, 1999.

6 12.11 12.18 设计红黑树的存储结构,并实现红黑树的插入和删除算法。
7 12.21 12.29

上机实现多表插入排序(地址计算排序)算法,被排序对象由计算机随机生成,长度分别取1000,5000,10000三种,算法中提供比较次数和移动次数统计功能,选择三种表的数目,并对相应结果与直接插入排序进行比较分析。(可参考《The art of computer programming》第三卷关于地址计算排序的讨论)

参考文献:

[1] E. J. Isaac and R. C. Singleton. Sorting by Address Calculation. Journal of the ACM. vol. 3(3), pages 169-174, 1956.

[2] D. E. Knuth. The Art of Computer Programming. Vol. 3: Sorting and Searching. Section5.2.1.

 


[ 回到主页 ]


Sun Meng