感觉很郁闷,考试好像完全不在状态,本来说是7.30考试,却托到了8.30,心里有点紧张,做题的过程中曾有要放弃的想法,最后现在已知的是错了一个选择题, 写程序的题忘记了一个细节地方,在遍历的时候,忘了给遍历过的结点mark,真是不应该。最后一个题没办法,当时硬是没想出来,还是水平问题,总体说来得到了些经验,也算没 白花那100人民币。
说说做错的题吧。
选择:








分析f的复杂度,一推很显然是n!,答案里面却没有,搞了好久,硬是没想到n!不是复杂度,而是计算结果,真是晕了,感觉自己在这个递归计算复杂度方面确实是个弱点,后面还有图的遍历的时候,也是没想到其遍历的复杂度是n,总是感觉很大。关键是没有分清计算的过程和复杂度的关系,搞混了,这应该是本次笔试的最大收获了。
最后一个大题:通过修改一些边的权值,使得一个树具有如下性质: 从跟结点到所有叶结点的路径长度都相同,求这个树在变化后所有边的长度的和,不用写代码,分析算法,分析复杂度。
当时真是头晕,想的很复杂,最后答的一塌糊涂。
正解如下:首先用深度优先遍历,对每一个结点标记一个高度,这个高度就是其叶结点的高度加上其对应边的权值的和的最大的那个。叶结点的高度设置为0。父结点的高度计算依赖其子结点,用深度优先遍历刚好合适,标记完后,遍历树,对每个结点处理如下: 结点下面所有的边修改其权值如下:边长=本结点高度-相应的子结点高度。最后,遍历一次求出边长的和。
一共3次遍历,每次的复杂度是n,所有最后的复杂度也是O(n)。