一、判断题 (2x10=20)

二、不定项选择 (3x5=15)

三、Next[]构造题 (8+6=14)
这题给了两个模式串，分别写出各自的改进前、后的next[]表
第一个串是SHIPSHIPED_SHIPS，共16个字符
第二个串是PHILEDPHAL...，忘了最后是啥了，共12个字符

第一个串，个人觉得难点可能就是最后一个S吧，时间很充裕，对于改进后的next[]表，我直接按照程序运行了一遍，写了长长的一串t\j数值= =
第二个串没发现啥陷阱，感觉有点虚啊= =

四、就地堆排序 (15)
给了一个长度为7的随机整数向量，要求用Floyd算法建堆，然后排序。给了一个大表格，每一行都是向量的一个状态，第一行是建堆之后的状态，然后依次取最大值放到堆后面。

建堆算法我是现场看的，而且讲义里的代码被拆成了好几块，看起来很不方便= =这要是建堆建错了，估计后面就错大发了= =

五、有向图DFS遍历 (1x6+2x5=16)
给了一个7节点的有向图，节点标号为1~7，指定当存在歧义性的时候优先考虑标号小的节点。

最后一共有6条树边(T)，1条跨边(C)，两条前向边(F)和两条后向边(B)，而且这题的分值写的是1*6+2*5=16，大家懂的。

六、散列冲突 (20)
给定M=17的散列表，给定了基本策略：求余法、单向平方试探、懒惰删除。
进行了一系列操作，写出每次操作之后的散列表状态。
一开始put进去7个数，中间有一步put(1481)，第八个操作remove(1481)，最后一个操作put()一个数进去。
第一问，如果在上面操作之后查询1481，问将会出现什么情况。死循环找不到了呗= =
第二问，在不改变基本策略的基础上，给出两种方案解决上述问题。
注意，不能改变那三个基本策略。

个人认为，由于懒惰删除之后，在查询的时候会把删除标记也算到装填因子里，所以最然最后只有8个元素，装填因子貌似是8/17，但是加上一个标记之后就有9个了，9/17>0.5，所以会出现这种情况。于是可以复制出来一个一样规模的新散列表，然后将旧表非空桶的元素逐一插入，这样就可以保证装填因子<=0.5的时候一定能找到。
然后我想不出啥新招了，就直接写了一个扩容，又造了一个M'=37的散列，好乏力……估计两个只会给一个方案的分= =
CA大神提出另一种方案，查询的时候记录查过几个桶，当查询桶的数量超过某一阈值的时候判定为查询失败。但是这个阈值怎么设定呢？现有元素数量？现有元素+懒惰标记数量？或者是散列规模M？似乎都不够大。有人说是2M，不知道为啥，求大神解答啊……

--------------------------------------------------------------

先补充一句，请教了gao_young大神，最后一道大题解决死循环的计数，当计数到M/2-1的时候就可以判定查询失败了。可以自行证明。其实我不会证= =

判断和选择题应该比较难吧，而且很多填空题都很“恰好”，数字很贱。这里只写一些印象深刻的题，这些题比较难，想了很久（当然，是对我而言的）。以下整理的题不计次序。

判断：（一共10个，想不起来那么多了= =）

1.对于正权值有向图，如果把所有的边权都平方之后，Dijkstra算法得到的最短路径树方案不变。

2.在KMP匹配的过程中，当主程序运行到i,j的状态时，意味着之前至少做过i次成功匹配以及i-j次失败匹配。

3.一个向量的存在主流数，则该数必然是中位数以及频繁数。
（似乎AB卷里的另一个是：如果有某数既是中位数又是频繁数，则该数也是主流数）

4.字符集规模越大的时候，next表比BC表效果越好。

5.如果使用了线性复杂度的中位数选取算法，快速排序的复杂度可以保证在最坏情况下也渐进等于O(nlogn)。


选择：
1.将[1481,1992]区间内的整数逐一插入到空AVL树中，最后该AVL树的高度是：
A、7    B、8    C、9    D、10   E、以上都不对

2.将[23, 1481)区间内的整数组成一个2-3-B树，且根节点只有一个关键码，则最终该B-树的高度至少是
A、7    B、8    C、9    D、10   E、以上都不对

3.对红黑树进行插入操作时，进行双红修正，黑高度增加，则_____发生重染色，_____发生结构调整。
（两个空分别可以填入“必然”、“可能”、“必然不”，选项就是这三者的排列组合）

4.对以下各搜索树进行删除操作，哪些树可能会经过Omega(logn)次局部调整，其中n为关键码的数量。
A、AVL  B、伸展树       C、红黑树       D、B-树         E、都不会